xuzhiheng 4 years ago
parent
commit
62d03ca984

+ 2 - 1
src/config.json

@@ -28,5 +28,6 @@
 	"errSaveTime": 86400,
 	"errTimes": 4,
 	"jypayrpc": "127.0.0.1:8600",
-	"uploadPath": "./web/staticres/file/"
+	"uploadPath": "./web/staticres/file/",
+	"companyIp": "1.192."
 }

+ 1 - 0
src/config/config.go

@@ -23,6 +23,7 @@ type SysConfig struct {
 	ErrTimes                int                    `json:"errTimes"`       //错误次数
 	JyPayRpc                string                 `json:"jypayrpc"`       //rpc地址
 	UploadPath              string                 `json:"uploadPath"`     //上传地址
+	CompanyIp               string                 `json:"companyIp"`      //公司ip
 }
 
 var SysConfigs SysConfig

+ 13 - 0
src/github.com/baiy/Cadmin-server-go/models/user/user.go

@@ -162,6 +162,19 @@ func GetByUserName(username string) (model *Model, err error) {
 	return
 }
 
+func GetByPhone(phone string) (model *Model, err error) {
+	model = new(Model)
+	found, err := models.Db.From("admin_user").Where(goqu.Ex{
+		"phone": phone,
+	}).ScanStruct(model)
+	if err == nil {
+		if !found {
+			err = errors.New("手机号不存在")
+		}
+	}
+	return
+}
+
 func GetLists(ids []int) ([]*Model, error) {
 	model := make([]*Model, 0)
 	if len(ids) == 0 {

+ 86 - 4
src/github.com/baiy/Cadmin-server-go/system/index/index.go

@@ -8,6 +8,7 @@ import (
 	"net/http"
 	"qfw/util"
 	"qfw/util/redis"
+	"qfw/util/sms"
 	"strings"
 
 	"github.com/baiy/Cadmin-server-go/admin"
@@ -25,14 +26,27 @@ var store = sessions.NewCookieStore([]byte("something-very-secret"))
 
 func Login(context *admin.Context) (interface{}, error) {
 	param := new(struct {
-		Username string `form:"username"     validate:"required"`
-		Password string `form:"password"     validate:"required"`
-		Code     string `form:"code"`
+		Username  string `form:"username"     validate:"required"`
+		Password  string `form:"password"     validate:"required"`
+		Code      string `form:"code"`
+		Phone     string `form:"phone"`
+		PhoneCode string `form:"phoneCode"`
+		LoginType string `form:"loginType"`
 	})
 	err := context.Form(param)
 	if err != nil {
 		return nil, err
 	}
+	userIp := clientIP(context.HttpRequest)
+	if param.LoginType == "0" {
+		status := map[string]interface{}{"status": 1}
+		if strings.HasPrefix(userIp, SysConfigs.CompanyIp) {
+			return status, nil
+		} else {
+			status["status"] = 2
+			return status, nil
+		}
+	}
 	//是否黑名单
 	ok, err := redis.Exists("qmx_filter", param.Username+"_禁止登录")
 	if ok {
@@ -78,13 +92,40 @@ func Login(context *admin.Context) (interface{}, error) {
 		return nil, errors.New("密码错误")
 	}
 
+	if param.LoginType == "2" { //点击发送手机验证码
+		_, err := user.GetByPhone(param.Phone)
+		if err != nil {
+			return nil, err
+		}
+		if SendPhoneIdentCode(param.Phone) {
+			return map[string]interface{}{"status": 3}, nil
+		} else {
+			return nil, errors.New("手机验证码发送失败")
+		}
+	} else if param.LoginType == "3" { //验证手机验证码
+		_, err := user.GetByPhone(param.Phone)
+		if err != nil {
+			return nil, err
+		}
+		session, err := store.Get(r, "qmx_phone_code")
+		if err != nil {
+			log.Println("phone-session2获取失败")
+			return nil, nil
+		}
+		phoneCode := util.ObjToString(session.Values["code"])
+		phone := util.ObjToString(session.Values["phone"])
+		if phoneCode != param.PhoneCode {
+			return nil, errors.New("手机验证码错误")
+		}
+	}
+
 	// 清理token
 	token.Clear()
 
 	// 添加token
 	t := token.Add(u.Id)
 	// 更新用户登陆
-	u.LoginUpdate(clientIP(context.HttpRequest))
+	u.LoginUpdate(userIp)
 
 	return map[string]string{"token": t}, nil
 }
@@ -199,3 +240,44 @@ func Code(context *admin.Context) (interface{}, error) {
 	// loginCode[id] = time.Now().Unix()
 	return nil, captcha.WriteImage(w, id, 90, 30)
 }
+
+//根据模板发送短信,模板是运营商设定的。
+//第三个参数是可变参数,可以传入多个,但要和模板相匹配
+func SendSMS(tplcode /*模板代码*/, mobile /*手机号码*/ string, param map[string]string) {
+	tmp := []string{}
+	for k, v := range param {
+		tmp = append(tmp, "#"+k+"#="+v)
+	}
+	text := strings.Join(tmp, "&")
+	sms.SendSms(mobile, tplcode, text)
+}
+
+//发送验证码
+func SendPhoneIdentCode(phone string) bool {
+	session, err := store.Get(r, "qmx_phone_code")
+	if err != nil {
+		log.Println("phone-session1获取失败")
+		return nil, nil
+	}
+	lastSentTime := util.Int64All(session.Values["identCodeTime"])
+	//60秒之内不允许重复发
+	if lastSentTime > 0 && time.Now().Unix()-lastSentTime <= 60 {
+		return false
+	}
+	s_ranNum := util.GetRandom(6) //生成随机数
+	r := context.HttpRequest
+	w := context.HttpResponseWriter
+
+	session.Values["code"] = s_ranNum
+	session.Values["phone"] = phone
+	session.Values["identCodeTime"] = time.Now().Unix()
+	session.Options.MaxAge = 300
+	if err := session.Save(r, w); err != nil {
+		log.Println("session1保存错误,验证码 ", id)
+	}
+	//发送短信
+	param := map[string]string{"code": s_ranNum}
+	log.Println("短信验证码", phone, s_ranNum)
+	SendSMS("2828060", phone, param)
+	return true
+}