package service
|
|
import (
|
"car-service/extend/util"
|
"car-service/models"
|
"car-service/vo"
|
"errors"
|
"fmt"
|
"github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
|
"github.com/satori/go.uuid"
|
"sync"
|
"time"
|
)
|
|
type UserService struct {
|
|
}
|
|
func (sv *UserService) Login(phoneNum, code, cid string) (bool,*vo.UserInfo,error) {
|
if verifyCode(phoneNum, code) {
|
carSv := NewCarService()
|
|
//先判断此手机号是否在海康平台中
|
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("请联系停车场管理员")
|
}
|
|
var tmpUser models.User
|
err := tmpUser.SelectByPhoneNum(phoneNum)
|
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() {
|
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: plateNos,
|
}, nil
|
} else {
|
fmt.Println("u.Insert err:", e)
|
return false, nil, errors.New("注册失败")
|
}
|
} else { //用户已存在
|
if hikPersonId != tmpUser.Id {
|
tmpUser.Id = hikPersonId
|
tmpUser.SyncHikPersonId(tmpUser.PhoneNum, hikPersonId)
|
}
|
var plateNos = make([]string, 0)
|
hikVehicles := carSv.GetVehicleListByPerson(tmpUser.Id)
|
|
if hikVehicles != nil {
|
for _,up := range hikVehicles {
|
plateNos = append(plateNos, up.PlateNo)
|
}
|
}
|
//客户端cid绑定别名
|
if cid != "" {
|
go func() {
|
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,
|
}, nil
|
}
|
} else {
|
return false,nil, errors.New("验证码错误")
|
}
|
}
|
|
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 {
|
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"
|
client, err := dysmsapi.NewClientWithAccessKey(regionId, accessKeyId, AccessSecret)
|
if err != nil {
|
return errors.New("短信服务器出错,请联系管理员")
|
}
|
verifyCode := util.GenValidateCode(6)
|
request := dysmsapi.CreateSendSmsRequest()
|
request.Scheme = "https"
|
request.SignName = "贝思科"
|
request.TemplateCode = "SMS_186578313"
|
request.PhoneNumbers = phoneNum
|
request.TemplateParam = "{\"code\":"+verifyCode+"}"
|
response, err := client.SendSms(request)
|
fmt.Println("sendSms err:", err, "phoneNum:", phoneNum, "cod:", verifyCode)
|
if err != nil {
|
return errors.New("发送短信验证码失败,请联系管理员")
|
}
|
|
go add2Cache(phoneNum, verifyCode)
|
fmt.Println("send sms resp:", response)
|
return nil
|
}
|
|
func verifyCode(phoneNum string, cod string) bool {
|
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)
|
//}
|
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,""
|
//}
|
//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, ""
|
}
|
}
|