liuxiaolong
2020-08-06 dbc843d0b37f786fb816131bcc7ebca86dbe72e9
service/userService.go
@@ -1,15 +1,15 @@
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/satori/go.uuid"
   "sync"
   "time"
)
type UserService struct {
@@ -18,29 +18,57 @@
func (sv *UserService) Login(phoneNum, code string) (bool,*vo.UserInfo,error) {
   if verifyCode(phoneNum, code) {
      carSv := NewCarService()
      var tmpUser models.User
      if err := tmpUser.SelectByPhoneNum(phoneNum); err != nil { //用户不存在,则新增
      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
               }
            }
         }
         if !found {
            return false, nil, errors.New("请联系停车场管理员")
         }
         u := models.User{
            Id: uuid.NewV4().String(),
            Id: hikPersonId,
            PhoneNum: phoneNum,
            IsDelete: false,
         }
         if i, e := u.Insert();e ==nil && i >0 {
         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)
               }
            }
            return true, &vo.UserInfo{
               UserId: u.Id,
               PhoneNum: phoneNum,
               PlateNos: []string{},
               PlateNos: plateNos,
            }, nil
         } else {
            fmt.Println("u.Insert i:", i, "err:", e)
            fmt.Println("u.Insert err:", e)
            return false, nil, errors.New("注册失败")
         }
      } else { //用户已存在
         var userCar models.UserCar
         var plateNos []string
         all, e := userCar.GetByUserId(tmpUser.Id)
         if e == nil && all != nil {
            for _,up := range all {
         var plateNos = make([]string, 0)
         hikVehicles := carSv.GetVehicleListByPerson(tmpUser.Id)
         if hikVehicles != nil {
            for _,up := range hikVehicles {
               plateNos = append(plateNos, up.PlateNo)
            }
         }
@@ -56,10 +84,43 @@
}
func (sv *UserService) AddPlateNo(userId, plateNo string) bool {
   var uc models.UserCar
   if uc.Exist(userId, plateNo) {
      return true
   }
   tmp := models.UserCar{
      Id: uuid.NewV4().String(),
      UserId: userId,
      PlateNo: plateNo,
   }
   _, err := tmp.Insert()
   if err == nil {
      return true
   }
   return false
}
func NewVerifyCode(phoneNum string) error {
   var tmpUser models.User
   err := tmpUser.SelectByPhoneNum(phoneNum)
   if err != nil { //用户不存在,注册获取验证码,此手机号必须在育英海康平台中
      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("手机号不存在,请联系停车场管理员")
      }
   }
   regionId := "cn-hangzhou"
   accessKeyId := "LTAIkHFaStA1JKk5"
   AccessSecret := "oE7LhSqBWWUBzV0B7l1G9aVmgHPddM"
@@ -86,35 +147,60 @@
}
func verifyCode(phoneNum string, cod string) bool {
   return true
   //if b,r := existCode(phoneNum);b && r == cod {
   //   return true
   //} else {
   //   fmt.Println("verifyCode false,cod:",cod, "r:",r,"b:",b)
   //}
   //return false
   if b,r := existCode(phoneNum);b && r == cod {
      return true
   } else {
      fmt.Println("verifyCode false,cod:",cod, "r:",r,"b:",b)
   }
   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
}