| | |
| | | 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 { |
| | |
| | | |
| | | func (sv *UserService) Login(phoneNum, code 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 |
| | | } |
| | | } |
| | | } |
| | | if !found { |
| | | return false, nil, errors.New("请联系停车场管理员") |
| | | } |
| | | |
| | | u := models.User{ |
| | | Id: uuid.NewV4().String(), |
| | | 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) |
| | | } |
| | | } |
| | | return true, &vo.UserInfo{ |
| | | UserId: u.Id, |
| | | PhoneNum: phoneNum, |
| | | PlateNos: []string{}, |
| | | PlateNos: plateNos, |
| | | }, nil |
| | | } else { |
| | | 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) |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | 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" |
| | |
| | | } |
| | | |
| | | func verifyCode(phoneNum string, cod string) bool { |
| | | return true |
| | | if b,r := existCode(phoneNum);b && r == cod { |
| | | return true |
| | | } else { |
| | |
| | | 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 |
| | | } |