| | |
| | | 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 { |
| | |
| | | } |
| | | |
| | | 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" |
| | |
| | | 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("发送短信验证码失败,请联系管理员") |
| | | } |
| | |
| | | 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 |
| | | } |