|
@@ -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
|
|
|
+}
|