liuxiaolong
2020-09-08 f58d6c7e121dc6a16f6b1e12e5beba1e6ce1b992
service/userService.go
@@ -1,78 +1,153 @@
package service
import (
   "car-service/cache"
   "car-service/extend/util"
   "car-service/models"
   "car-service/vo"
   "errors"
   "fmt"
   "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
   "github.com/gomodule/redigo/redis"
   "github.com/astaxie/beego"
   "github.com/satori/go.uuid"
   "strings"
   "sync"
   "time"
)
type UserService struct {
}
func (sv *UserService) Login(phoneNum, code string) (bool,*vo.UserInfo,error) {
func (sv *UserService) Login(phoneNum, code, cid string) (bool,*vo.UserInfo,error) {
   if verifyCode(phoneNum, code) {
      carSv := NewCarService()
      var tmpUser models.User
      err := tmpUser.SelectByPhoneNum(phoneNum)
      fmt.Println("login err:", err)
      if err != nil { //用户不存在,则新增
         //先判断此手机号是否在海康平台中
         hikPersons := carSv.GetHikPersonList()
         found := false
         hikPersonId := ""
         if hikPersons != nil {
            for _,hikP := range hikPersons {
               if hikP.PhoneNo == phoneNum {
                  found = true
                  hikPersonId = hikP.PersonId
               }
      //先判断此手机号是否在海康平台中
      hikPersons := carSv.GetHikPersonList()
      found := false
      hikPersonId := ""
      if hikPersons != nil {
         for _,hikP := range hikPersons {
            if hikP.PhoneNo == phoneNum {
               found = true
               hikPersonId = hikP.PersonId
            }
         }
         if !found {
            return false, nil, errors.New("请联系停车场管理员")
         }
      }
      if !found {
         return false, nil, errors.New("请联系停车场管理员")
      }
      var tmpUser models.User
      err := tmpUser.SelectById(hikPersonId)
      fmt.Println("login err:", err)
      if err != nil { //用户不存在,则新增
         u := models.User{
            Id: hikPersonId,
            PhoneNum: phoneNum,
            IsDelete: false,
         }
         if _, e := u.Insert();e ==nil {
            var plateNos = make([]string, 0)
            hikVehicles := carSv.GetVehicleListByPerson(u.Id)
            if hikVehicles != nil {
               for _,up := range hikVehicles {
                  plateNos = append(plateNos, up.PlateNo)
               }
            }
            //客户端cid绑定别名
            if cid != "" {
               go func() {
                  var uc models.UserClient
                  ucList := uc.GetByCid(cid)
                  if ucList != nil && len(ucList) >0 {
                     if len(ucList) >1 || ucList[0].PhoneNum != phoneNum {
                        unbindB, unE := UnbindAlias(cid)
                        fmt.Println("unbindB:", unbindB, "err:", unE)
                     }
                  }
                  if !uc.ExistByCid(phoneNum, cid) {
                     new := models.UserClient{
                        Id:uuid.NewV4().String(),
                        PhoneNum: phoneNum,
                        ClientId: cid,
                        BindTime: time.Now().Format("2006-01-02 15:04:05"),
                     }
                     new.Insert()
                     bindR, bindE := BindAlias(cid, phoneNum)
                     fmt.Println("bind cid:",cid, "phoneNum:",phoneNum,"result:", bindR, "err:", bindE)
                  }
               }()
            }
            return true, &vo.UserInfo{
               UserId: u.Id,
               PhoneNum: phoneNum,
               PlateNos: []string{},
               PlateNos: plateNos,
               IsAdmin: isAdmin(phoneNum),
            }, nil
         } else {
            fmt.Println("u.Insert err:", e)
            return false, nil, errors.New("注册失败")
         }
      } else { //用户已存在
         if phoneNum != tmpUser.PhoneNum {
            tmpUser.UpdatePhoneNum(phoneNum, hikPersonId)
         }
         var plateNos = make([]string, 0)
         hikVehicles := carSv.GetVehicleListByPerson(tmpUser.Id)
         hikVehicles := carSv.GetVehicleListByPerson(hikPersonId)
         if hikVehicles != nil {
            for _,up := range hikVehicles {
               plateNos = append(plateNos, up.PlateNo)
            }
         }
         //客户端cid绑定别名
         if cid != "" {
            go func() {
               var uc models.UserClient
               ucList := uc.GetByCid(cid)
               if ucList != nil && len(ucList) >0 {
                  if len(ucList) >1 || ucList[0].PhoneNum != phoneNum {
                     unbindB, unE := UnbindAlias(cid)
                     fmt.Println("unbindB:", unbindB, "err:", unE)
                  }
               }
               if !uc.ExistByCid(phoneNum, cid) {
                  new := models.UserClient{
                     Id:uuid.NewV4().String(),
                     PhoneNum: phoneNum,
                     ClientId: cid,
                     BindTime: time.Now().Format("2006-01-02 15:04:05"),
                  }
                  new.Insert()
                  bindR, bindE := BindAlias(cid, phoneNum)
                  fmt.Println("bind cid:",cid, "phoneNum:",phoneNum,"result:", bindR, "err:", bindE)
               }
            }()
         }
         return true, &vo.UserInfo{
            UserId: tmpUser.Id,
            PhoneNum: phoneNum,
            PlateNos: plateNos,
            IsAdmin: isAdmin(phoneNum),
         }, nil
      }
   } else {
      return false,nil, errors.New("验证码错误")
   }
}
func isAdmin(phoneNum string) bool {
   managers := beego.AppConfig.String("nightManagerPhones")
   arr := strings.Split(managers, ",")
   for _,s := range arr {
      if s == phoneNum {
         return true
      }
   }
   return false
}
func (sv *UserService) AddPlateNo(userId, plateNo string) bool {
@@ -93,6 +168,27 @@
}
func NewVerifyCode(phoneNum string) error {
   carSv := NewCarService()
   personList := carSv.GetHikPersonList()
   found := false
   if personList ==nil {
      return errors.New("手机号不存在,请联系停车场管理员")
   } else {
      for _,p := range personList {
         if p.PhoneNo == phoneNum {
            found = true
         }
      }
   }
   if !found {
      return errors.New("手机号不存在,请联系停车场管理员")
   }
   //var tmpUser models.User
   //err := tmpUser.SelectByPhoneNum(phoneNum)
   //if err != nil { //用户不存在,注册获取验证码,此手机号必须在育英海康平台中
   //
   //}
   regionId := "cn-hangzhou"
   accessKeyId := "LTAIkHFaStA1JKk5"
   AccessSecret := "oE7LhSqBWWUBzV0B7l1G9aVmgHPddM"
@@ -108,7 +204,7 @@
   request.PhoneNumbers = phoneNum
   request.TemplateParam = "{\"code\":"+verifyCode+"}"
   response, err := client.SendSms(request)
   fmt.Println("sendSms err:", err)
   fmt.Println("sendSms err:", err, "phoneNum:", phoneNum, "cod:", verifyCode)
   if err != nil {
      return errors.New("发送短信验证码失败,请联系管理员")
   }
@@ -127,26 +223,52 @@
   return false
}
type CodCache struct {
   phoneNum    string
   cod       string
   ex          time.Time
}
var codMap = make(map[string]CodCache)
var codLock sync.RWMutex
func add2Cache(phoneNum string, code string) {
   //写到redis缓存中
   c := cache.Get()
   defer c.Close()
   reply, err := c.Do("SET", phoneNum, code, "EX", 5 * 60)//超时五分钟
   if err != nil {
      fmt.Println("写入redis失败")
   } else {
      fmt.Println("写入redis成功,reply:", reply)
   //c := cache.Get()
   //defer c.Close()
   //
   //reply, err := c.Do("SET", phoneNum, code, "EX", 5 * 60)//超时五分钟
   //if err != nil {
   //   fmt.Println("写入redis失败")
   //} else {
   //   fmt.Println("写入redis成功,reply:", reply)
   //}
   codLock.Lock()
   defer codLock.Unlock()
   expireTime := time.Now().Add(time.Minute * 5)
   codMap[phoneNum] = CodCache{
      phoneNum:phoneNum,
      cod: code,
      ex:expireTime,
   }
}
func existCode(phoneNum string) (bool,string) {
   c := cache.Get()
   defer c.Close()
   r, err := redis.String(c.Do("GET", phoneNum))
   if err != nil {
      fmt.Println("existCode err:", err)
      return false,""
   //c := cache.Get()
   //defer c.Close()
   //
   //r, err := redis.String(c.Do("GET", phoneNum))
   //if err != nil {
   //   fmt.Println("existCode err:", err)
   //   return false,""
   //}
   //return true,r
   codLock.Lock()
   defer codLock.Unlock()
   if cache,exist := codMap[phoneNum];exist {
      if cache.ex.Before(time.Now()) {//已过期
         return false, ""
      } else {
         return true, cache.cod
      }
   } else {
      return false, ""
   }
   return true,r
}