|
@@ -12,7 +12,6 @@ import (
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
- smsExistKey = "sms_exist_%s"
|
|
|
smsIpKey = "sms_ip_%s_%s"
|
|
|
smsPhoneKey = "sms_phone_%s_%s"
|
|
|
smsCacheCode = "other"
|
|
@@ -21,9 +20,8 @@ var (
|
|
|
)
|
|
|
|
|
|
func SmsStrategy(keys []string) (abnormalKey []string) {
|
|
|
- jylog.Info("config.SmsStrategyS:", config.SmsStrategyS)
|
|
|
- for _, key := range keys {
|
|
|
- for _, s := range config.SmsStrategyS {
|
|
|
+ var strategyFun = func(key string, ss []config.Strategy) {
|
|
|
+ for _, s := range ss {
|
|
|
cacheKey := fmt.Sprintf(key, s.Day)
|
|
|
num := redis.GetInt(smsCacheCode, cacheKey)
|
|
|
ttl := redis.GetTTL(smsCacheCode, cacheKey)
|
|
@@ -38,6 +36,14 @@ func SmsStrategy(keys []string) (abnormalKey []string) {
|
|
|
redis.Put(smsCacheCode, cacheKey, num, int(ttl))
|
|
|
}
|
|
|
}
|
|
|
+ for _, key := range keys {
|
|
|
+ switch {
|
|
|
+ case strings.Contains(key, "sms_ip"):
|
|
|
+ strategyFun(key, config.SmsStrategyIp)
|
|
|
+ case strings.Contains(key, "sms_phone"):
|
|
|
+ strategyFun(key, config.SmsStrategyPhone)
|
|
|
+ }
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -58,68 +64,73 @@ func Verify(reqData *ReqData) bool {
|
|
|
}
|
|
|
aks := SmsStrategy(keys)
|
|
|
if len(aks) > 0 {
|
|
|
- go func(aks []string, ip, mobile string) {
|
|
|
- smsChan <- true
|
|
|
- defer func() {
|
|
|
- <-smsChan
|
|
|
- }()
|
|
|
- var (
|
|
|
- ipState, phoneState int
|
|
|
- now = time.Now()
|
|
|
- )
|
|
|
- for _, v := range aks {
|
|
|
- if strings.Contains(v, "sms_ip") {
|
|
|
- ipState = ipState + 1
|
|
|
- }
|
|
|
- if strings.Contains(v, "sms_phone") {
|
|
|
- phoneState = phoneState + 1
|
|
|
- }
|
|
|
+ go SaveRecord(aks, reqData.Ip, reqData.Phones)
|
|
|
+ jylog.Info(reqData.Phones, "---发送短信次数过多,规则:"+strings.Join(aks, "###"))
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return true
|
|
|
+}
|
|
|
+
|
|
|
+// 数据库数据处理
|
|
|
+func SaveRecord(aks []string, ip, mobile string) {
|
|
|
+ select {
|
|
|
+ case smsChan <- true:
|
|
|
+ defer func() {
|
|
|
+ <-smsChan
|
|
|
+ }()
|
|
|
+ var (
|
|
|
+ ipState, phoneState int
|
|
|
+ now = time.Now()
|
|
|
+ )
|
|
|
+ for _, v := range aks {
|
|
|
+ if strings.Contains(v, "sms_ip") {
|
|
|
+ ipState = ipState + 1
|
|
|
}
|
|
|
- if ipState > 0 {
|
|
|
- ipQuery := map[string]interface{}{
|
|
|
- "ip": ip,
|
|
|
- }
|
|
|
- ipData := map[string]interface{}{
|
|
|
- "ip": ip,
|
|
|
- "ip_state": ipState,
|
|
|
- "date": date.FormatDate(&now, date.Date_Full_Layout),
|
|
|
+ if strings.Contains(v, "sms_phone") {
|
|
|
+ phoneState = phoneState + 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ipState > 0 {
|
|
|
+ ipQuery := map[string]interface{}{
|
|
|
+ "ip": ip,
|
|
|
+ }
|
|
|
+ ipData := map[string]interface{}{
|
|
|
+ "ip": ip,
|
|
|
+ "ip_state": ipState,
|
|
|
+ "date": date.FormatDate(&now, date.Date_Full_Layout),
|
|
|
+ }
|
|
|
+ tableName := "useranaly.sms_black_ip"
|
|
|
+ if ipC := config.BaseMysql.Count(tableName, ipQuery); ipC == 0 {
|
|
|
+ if id := config.BaseMysql.Insert(tableName, ipData); id <= 0 {
|
|
|
+ jylog.Info("sms_black_ip 信息保存异常:", mobile, ip)
|
|
|
}
|
|
|
- tableName := "useranaly.sms_black_ip"
|
|
|
- if ipD := config.BaseMysql.FindOne(tableName, ipQuery, "ip,ip_state", "date desc"); ipD == nil {
|
|
|
- if id := config.BaseMysql.Insert(tableName, ipData); id <= 0 {
|
|
|
- jylog.Info("sms_black_ip 信息保存异常:", mobile, ip)
|
|
|
- }
|
|
|
- } else {
|
|
|
- delete(ipData, "ip")
|
|
|
- if ok := config.BaseMysql.Update(tableName, ipQuery, ipData); !ok {
|
|
|
- jylog.Info("sms_black_ip 信息更新异常:", mobile, ip)
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ if id := config.BaseMysql.UpdateOrDeleteBySql("UPDATE "+tableName+" SET ip_state=ip_state+? WHERE ip = ?", ipState, ip); id <= 0 {
|
|
|
+ jylog.Info("sms_black_ip 信息更新异常:", mobile, ip)
|
|
|
}
|
|
|
}
|
|
|
- if phoneState > 0 {
|
|
|
- phoneQuery := map[string]interface{}{
|
|
|
- "phone": mobile,
|
|
|
- }
|
|
|
- phoneData := map[string]interface{}{
|
|
|
- "phone": mobile,
|
|
|
- "phone_state": phoneState,
|
|
|
- "date": date.FormatDate(&now, date.Date_Full_Layout),
|
|
|
+ }
|
|
|
+ if phoneState > 0 {
|
|
|
+ phoneQuery := map[string]interface{}{
|
|
|
+ "phone": mobile,
|
|
|
+ }
|
|
|
+ phoneData := map[string]interface{}{
|
|
|
+ "phone": mobile,
|
|
|
+ "phone_state": phoneState,
|
|
|
+ "date": date.FormatDate(&now, date.Date_Full_Layout),
|
|
|
+ }
|
|
|
+ tableName := "useranaly.sms_black_phone"
|
|
|
+ if phoneC := config.BaseMysql.Count(tableName, phoneQuery); phoneC == 0 {
|
|
|
+ if id := config.BaseMysql.Insert(tableName, phoneData); id <= 0 {
|
|
|
+ jylog.Info("sms_black_phone 信息保存异常:", mobile, ip)
|
|
|
}
|
|
|
- tableName := "useranaly.sms_black_phone"
|
|
|
- if phoneD := config.BaseMysql.FindOne(tableName, phoneQuery, "phone,phone_state", "date desc"); phoneD == nil {
|
|
|
- if id := config.BaseMysql.Insert(tableName, phoneData); id <= 0 {
|
|
|
- jylog.Info("sms_black_phone 信息保存异常:", mobile, ip)
|
|
|
- }
|
|
|
- } else {
|
|
|
- delete(phoneData, "phone")
|
|
|
- if ok := config.BaseMysql.Update(tableName, phoneQuery, phoneData); !ok {
|
|
|
- jylog.Info("sms_black_phone 信息更新异常:", mobile, ip)
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ if id := config.BaseMysql.UpdateOrDeleteBySql("UPDATE "+tableName+" SET phone_state=phone_state+? WHERE phone = ?", phoneState, mobile); id <= 0 {
|
|
|
+ jylog.Info("sms_black_phone 信息更新异常:", mobile, ip)
|
|
|
}
|
|
|
}
|
|
|
- }(aks, reqData.Ip, reqData.Phones)
|
|
|
- jylog.Info(reqData.Phones, "---发送短信次数过多,规则:"+strings.Join(aks, "###"))
|
|
|
- return false
|
|
|
+ }
|
|
|
+ case <-time.After(5 * time.Second):
|
|
|
+ jylog.Infof("数据库更新数据超时,手机号:%s, ip:%s, 触发规则:%s", mobile, ip, aks)
|
|
|
}
|
|
|
- return true
|
|
|
}
|