Merge pull request #66 from wfh45678/develop

1.经纬度转换成行政区域
2.HTTP插件支持多参数
3.前端支持系统黑白黑白名单
4.规则命中图标支持时间过滤
This commit is contained in:
feihu.wang
2020-11-22 15:32:48 +08:00
committed by GitHub
53 changed files with 762 additions and 282 deletions

View File

@@ -81,7 +81,7 @@ The project code called Radar, like the code, monitor the transaction at the bac
特征工程例如用户小时交易次数IP 一天交易金额,设备一小时交易次数。。。
### Adaptation: 机器学习模型适配器
使用训练好的机器学习模型,进行检测
### Activation: 激活
### Activation: 激活
概念类似于机器学习里面的 (Activation Function) 一个模型可以定义多个 activation相当于不同维度的检测报告,每个activation都可以独立配置规则单独打分。
例如,用户注册行为, 可以定义:异常注册, 垃圾注册, 可以输出多个activation。
### Rule: 规则

View File

@@ -20,7 +20,7 @@
</parent>
<groupId>com.pgmmers</groupId>
<artifactId>radar</artifactId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
<name>radar</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>radar-admin</artifactId>

View File

@@ -8,7 +8,7 @@ import com.pgmmers.radar.service.common.CommonResult;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.service.engine.vo.DataColumnInfo;
import com.pgmmers.radar.service.enums.DataType;
import com.pgmmers.radar.service.impl.engine.Plugin.PluginManager;
import com.pgmmers.radar.service.impl.engine.plugin.PluginManager;
import com.pgmmers.radar.service.model.AbstractionService;
import com.pgmmers.radar.service.model.FieldService;
import com.pgmmers.radar.service.model.PreItemService;

View File

@@ -9,7 +9,7 @@ import com.pgmmers.radar.service.common.CommonResult;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.service.engine.vo.DataColumnInfo;
import com.pgmmers.radar.service.enums.DataType;
import com.pgmmers.radar.service.impl.engine.Plugin.PluginManager;
import com.pgmmers.radar.service.impl.engine.plugin.PluginManager;
import com.pgmmers.radar.service.model.AbstractionService;
import com.pgmmers.radar.service.model.ActivationService;
import com.pgmmers.radar.service.model.FieldService;

View File

@@ -5,7 +5,7 @@ import com.alibaba.excel.util.IoUtils;
import com.pgmmers.radar.enums.FieldType;
import com.pgmmers.radar.service.cache.CacheService;
import com.pgmmers.radar.service.common.CommonResult;
import com.pgmmers.radar.service.impl.engine.Plugin.PluginManager;
import com.pgmmers.radar.service.impl.engine.plugin.PluginManager;
import com.pgmmers.radar.util.CaptchaUtil;
import com.pgmmers.radar.util.ZipUtils;
import com.pgmmers.radar.vo.common.PluginVO;

View File

@@ -10,7 +10,7 @@ import com.pgmmers.radar.service.common.CommonResult;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.service.engine.vo.DataColumnInfo;
import com.pgmmers.radar.service.enums.DataType;
import com.pgmmers.radar.service.impl.engine.Plugin.PluginManager;
import com.pgmmers.radar.service.impl.engine.plugin.PluginManager;
import com.pgmmers.radar.service.logs.EventService;
import com.pgmmers.radar.service.model.ActivationService;
import com.pgmmers.radar.service.model.FieldService;
@@ -78,7 +78,7 @@ public class EventApiController {
@PostMapping("/search")
public CommonResult search(@RequestBody TermQuery term, HttpSession session) {
CommonResult result = new CommonResult();
PageResult<Object> page = new PageResult<>(1, 10, 0, new ArrayList<>());
PageResult<Object> page ;
page = eventService.query(term);
if (page != null) {
result.getData().put("page", page);
@@ -242,9 +242,10 @@ public class EventApiController {
String file = "e:\\tmp\\" + System.currentTimeMillis() + ".xlsx";
FileOutputStream fos = null;
response.setContentType("application/ms-excel");// 设置相应类型,告诉浏览器输出的内容为图片
response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容
// 设置相应类型,告诉浏览器输出的内容为图片
response.setContentType("application/ms-excel");
// 设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
OutputStream os = null;

View File

@@ -1,12 +1,12 @@
package com.pgmmers.radar.controller;
import com.pgmmers.radar.dal.bean.EventQuery;
import com.pgmmers.radar.dal.bean.RuleHistoryQuery;
import com.pgmmers.radar.dal.bean.RuleQuery;
import com.pgmmers.radar.intercpt.ContextHolder;
import com.pgmmers.radar.service.common.CommonResult;
import com.pgmmers.radar.service.model.ModelService;
import com.pgmmers.radar.service.model.RuleService;
import com.pgmmers.radar.vo.admin.UserVO;
import com.pgmmers.radar.vo.model.ModelVO;
import com.pgmmers.radar.vo.model.RuleVO;
import io.swagger.annotations.Api;
@@ -55,14 +55,14 @@ public class RuleApiController {
return ruleService.delete(id);
}
@GetMapping("/hitsSort/{modelId}")
public CommonResult hitsSort(@PathVariable Long modelId) {
@PostMapping("/hitsSort/{modelId}")
public CommonResult hitsSort(@PathVariable Long modelId, @RequestBody EventQuery query) {
CommonResult result = new CommonResult();
ModelVO modelVO = modelService.getModelById(modelId);
if (modelVO == null) {
return result;
}
return ruleService.getHitSorts(modelId);
return ruleService.getHitSorts(modelId, query.getBeginTime(), query.getEndTime());
}
@PostMapping("/ruleHistory")

View File

@@ -121,7 +121,7 @@ public class SysLoginApiController {
userVO.setUserName(loginName);
userVO.setPasswd(encrypt);
userVO.setStatus("1");
userVO.setVipLevel(0);
userVO.setVipLevel(1);
userVO.setGiteeAccount(giteeAccount);
userVO.setCode(loginName);
userVO.setCreateTime(new Date());

View File

@@ -47,7 +47,6 @@ logging:
root: info
com.pgmmers.radar: info
com.pgmmers.radar.mapper: debug
org.elasticsearch: info
org.elasticsearch.client: debug
server:
port: 6580

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,3 @@
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>风控引擎管理平台</title> <link rel="shortcut icon" href="/images/anquan.png"> <!--[if lt IE 10]>
<script src="https://as.alipayobjects.com/g/component/??console-polyfill/0.2.2/index.js,es5-shim/4.5.7/es5-shim.min.js,es5-shim/4.5.7/es5-sham.min.js,html5shiv/3.7.2/html5shiv.min.js,media-match/2.0.2/media.match.min.js"></script>
<![endif]--> <link href="./index.16542f8e-1.css" rel="stylesheet"><link href="./index.16542f8e-2.css" rel="stylesheet"><link href="./index.16542f8e-3.css" rel="stylesheet"></head> <body> <div id="react-content"></div> <script type="text/javascript" src="./main.16542f8e.js"></script></body> </html>
<![endif]--> <link href="./index.7269f78c-1.css" rel="stylesheet"><link href="./index.7269f78c-2.css" rel="stylesheet"><link href="./index.7269f78c-3.css" rel="stylesheet"></head> <body> <div id="react-content"></div> <script type="text/javascript" src="./main.7269f78c.js"></script></body> </html>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,17 @@
package com.pgmmers.radar.test;
import com.pgmmers.radar.util.CryptUtils;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class CryptUtilTest {
@Test
public void testSHA() {
String str = CryptUtils.sha("123456", "admin").toUpperCase();
System.out.println(str);
}
}

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -40,78 +40,6 @@ public class DateUtils {
return dateTimeFormat.parse(str);
}
/**
* <p>getStartCurrentDate.</p>
*
* @return a {@link Date} object.
*/
public static Date getStartCurrentDate() {
// Calendar cal = Calendar.getInstance();
// cal.set(Calendar.HOUR_OF_DAY, 0);
// cal.set(Calendar.MINUTE, 0);
// cal.set(Calendar.SECOND, 0);
// try {
// return dateTimeFormat.parse(dateTimeFormat.format(cal.getTime()));
// } catch (ParseException e) {
// e.printStackTrace();
// }
// return null;
return getCurrentDate();
}
/**
* <p>getEndCurrentDate.</p>
*
* @return a {@link Date} object.
*/
public static Date getEndCurrentDate() {
// Calendar cal = Calendar.getInstance();
// cal.set(Calendar.HOUR_OF_DAY, 23);
// cal.set(Calendar.MINUTE, 59);
// cal.set(Calendar.SECOND, 59);
//
// try {
// return dateTimeFormat.parse(dateTimeFormat.format(cal.getTime()));
// } catch (ParseException e) {
// e.printStackTrace();
// }
// return null;
return addDate(1,getCurrentDate());
}
/**
* <p>getDateTime.</p>
*
* @return a long.
*/
public static long getDateTime() {
return new Date().getTime();
}
/**
* <p>getCurrentDate.</p>
*
* @return a {@link Date} object.
*/
public static Date getCurrentDate() {
return new Date();
}
/**
* <p>getCurrentGMTDate.</p>
*
* @return a {@link Date} object.
*/
public static Date getCurrentGMTDate() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
try {
return dateTimeFormat.parse(dateFormat.format(new Date()));
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* <p>formatDate.</p>
@@ -148,8 +76,6 @@ public class DateUtils {
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
System.out.println(startCal.getTimeInMillis());
System.out.println(endCal.getTimeInMillis());
return (startCal.getTimeInMillis() - endCal.getTimeInMillis()) / (1000);
}
@@ -200,9 +126,6 @@ public class DateUtils {
* @param args an array of {@link String} objects.
*/
public static void main(String[] args) {
System.out.println(getStartCurrentDate());
System.out.println(getEndCurrentDate());
System.out.println(formatDate(new Date(), "yyyy-MM-ww-dd"));
}

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -20,7 +20,11 @@ public interface DataListDal {
List<DataListsVO> listDataLists(Long modelId, Integer status);
//
/**
* get by id.
* @param id
* @return
*/
DataListsVO get(Long id);
List<DataListsVO> list(Long modelId);
@@ -31,14 +35,22 @@ public interface DataListDal {
int delete(Long[] id);
//
/**
* get list meta.
* @param id
* @return
*/
DataListMetaVO getMeta(Long id);
int saveMeta(DataListMetaVO dataListMeta);
int deleteMeta(List<Long> listId);
//
/**
* get list record.
* @param id
* @return
*/
DataListRecordVO getRecord(Long id);
PageResult<DataListRecordVO> queryRecord(DataListRecordQuery query);

View File

@@ -110,7 +110,7 @@ public class DataListDalImpl implements DataListDal {
public List<DataListsVO> list(Long modelId) {
Example example = new Example(DataListsPO.class);
Example.Criteria criteria = example.createCriteria();
criteria.andIn("modelId", Arrays.asList(modelId, 0L));
criteria.andIn("modelId", Arrays.asList(modelId, 1L));
List<DataListsPO> list = dataListMapper.selectByExample(example);
if (CollectionUtils.isEmpty(list)) {
return new ArrayList<>();

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>radar-dao</artifactId>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -31,7 +31,7 @@ sys:
conf:
app: engine # admin 或者 engine 根据启动的项目名称进行选择
entity-duplicate-insert: false # 事件是否允许重复插入
mongo-restore-days: 93 # 事件保存时间默认3个月
mongo-restore-days: 3650 # 事件保存时间默认3个月
workdir: d:/radar # 工作目录
machine-learning: true # 是否启用 机器学习
server:

View File

@@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import com.pgmmers.radar.EngineApplication;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.service.engine.vo.Location;
import com.pgmmers.radar.service.impl.engine.Plugin.PluginManager;
import com.pgmmers.radar.service.impl.engine.plugin.PluginManager;
import com.pgmmers.radar.vo.model.PreItemVO;
import java.util.Comparator;
import java.util.HashMap;

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -14,6 +14,7 @@ import com.pgmmers.radar.service.engine.vo.AdaptationResult;
import com.pgmmers.radar.service.engine.vo.HitObject;
import com.pgmmers.radar.service.engine.vo.RiskObject;
import com.pgmmers.radar.service.impl.dnn.EstimatorContainer;
import com.pgmmers.radar.service.impl.util.JsonParserUtil;
import com.pgmmers.radar.service.model.AbstractionService;
import com.pgmmers.radar.service.model.ActivationService;
import com.pgmmers.radar.service.model.DataListsService;
@@ -48,7 +49,7 @@ import org.springframework.util.StringUtils;
public class AntiFraudEngineImpl implements AntiFraudEngine {
private static Logger logger = LoggerFactory.getLogger(AntiFraudEngineImpl.class);
private static Map<Long, Map<String, Object>> dataListCacheMap = new HashMap<Long, Map<String, Object>>();
private static Map<Long, Map<String, Object>> dataListCacheMap = new HashMap<>();
@Value("${sys.conf.machine-learning: true}")
private boolean machineLearning;
@Autowired
@@ -149,6 +150,9 @@ public class AntiFraudEngineImpl implements AntiFraudEngine {
Object searchFieldVal = data.get("fields").get(searchField);
if (searchFieldVal == null) {
searchFieldVal = data.get("preItems").get(searchField);
if (searchFieldVal == null) {
searchFieldVal = JsonParserUtil.value(data.get("preItems"), searchField, null);
}
}
if (searchFieldVal == null) {
result.setMsg("search field value eq null!");
@@ -168,8 +172,11 @@ public class AntiFraudEngineImpl implements AntiFraudEngine {
}
}
if (functionFieldType == null) {
result.setMsg("function field type is null");
return result;
// 因为预处理字段没有字段类型暂时设置为String
// TODO: 目前只有高级函数使用了 functionFieldType。
//result.setMsg("function field type is null");
//return result;
functionFieldType = FieldType.valueOf("STRING");
}
}
@@ -241,6 +248,7 @@ public class AntiFraudEngineImpl implements AntiFraudEngine {
* @author feihu.wang
* 2016年8月10日
*/
@Deprecated
private Map<String, Object> getPrepareDataCollection(Long modelId) {
Map<String, Object> dataListMap = null;
if (dataListCacheMap.containsKey(modelId)) {
@@ -250,14 +258,14 @@ public class AntiFraudEngineImpl implements AntiFraudEngine {
dataListMap = new HashMap<>();
List<DataListsVO> list = dataListsService.listDataLists(modelId, StatusType.ACTIVE.getKey());
// 系统自带黑/白名单
List<DataListsVO> list2 = dataListsService.listDataLists(0L, StatusType.ACTIVE.getKey());
List<DataListsVO> list2 = dataListsService.listDataLists(1L, StatusType.ACTIVE.getKey());
list.addAll(list2);
Map<String, String> dataListRecords;
for (DataListsVO vo : list) {
Long dataListId = vo.getId();
List<DataListRecordVO> records = dataListsService.listDataListRecords(dataListId);
dataListRecords = new HashMap<String, String>();
dataListRecords = new HashMap<>();
for (DataListRecordVO record : records) {
dataListRecords.put(record.getDataRecord(), "");
}
@@ -382,7 +390,7 @@ public class AntiFraudEngineImpl implements AntiFraudEngine {
* @author feihu.wang
* 2016年8月2日
*/
private boolean checkAbstractionScript(String ruleScript, Map entity, Map<String, Object> dataCollectionMap) {
private Boolean checkAbstractionScript(String ruleScript, Map entity, Map<String, Object> dataCollectionMap) {
Object[] args = { entity, dataCollectionMap };
Boolean ret = false;
try {
@@ -394,7 +402,7 @@ public class AntiFraudEngineImpl implements AntiFraudEngine {
return ret;
}
private boolean checkActivationScript(String ruleScript, Map data, Map<String, Object> dataCollectionMap) {
private Boolean checkActivationScript(String ruleScript, Map data, Map<String, Object> dataCollectionMap) {
Object[] args = { data, dataCollectionMap };
Boolean ret = false;
try {

View File

@@ -10,7 +10,7 @@ import com.pgmmers.radar.service.engine.vo.AbstractionResult;
import com.pgmmers.radar.service.engine.vo.ActivationResult;
import com.pgmmers.radar.service.engine.vo.AdaptationResult;
import com.pgmmers.radar.service.engine.vo.AntiFraudProcessResult;
import com.pgmmers.radar.service.impl.engine.Plugin.PluginManager;
import com.pgmmers.radar.service.impl.engine.plugin.PluginManager;
import com.pgmmers.radar.service.model.ModelService;
import com.pgmmers.radar.service.model.PreItemService;
import com.pgmmers.radar.vo.model.PreItemVO;
@@ -24,7 +24,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 反欺诈主要服务,仅在引擎端启动的时候才需要加载。
* @author feihu.wang
*/
@Service
@ConditionalOnProperty(prefix = "sys.conf", name="app", havingValue = "engine")
public class AntiFraudServiceImpl implements AntiFraudService {
@@ -34,7 +37,7 @@ public class AntiFraudServiceImpl implements AntiFraudService {
@Autowired
private AntiFraudEngine antiFraudEngine;
@Autowired
@Autowired(required = false)
private PluginService pluginService;
@Autowired

View File

@@ -1,38 +0,0 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.vo.model.PreItemVO;
import java.util.Map;
/**
* author: wangcheng Date: 2020/5/19 Time: 上午11:44 Description:
*/
public class GPS2LOCATION implements PluginServiceV2 {
@Override
public Integer key() {
return 2;
}
@Override
public String desc() {
return "GPS转换成地址";
}
@Override
public String getType() {
return null;
}
@Override
public String getMeta() {
return "[{\"column\":\"country\", \"title\":\"国家\", \"type\":\"STRING\"},{\"column\":\"province\", \"title\":\"省份\", \"type\":\"STRING\"},{\"column\":\"city\", \"title\":\"城市\", \"type\":\"STRING\"}]";
}
@Override
public Object handle(PreItemVO item, Map<String, Object> jsonInfo,
String[] sourceField) {
// TODO 可以参考 http://jwd.funnyapi.com/#/index , 最好是本地库。
return null;
}
}

View File

@@ -26,7 +26,11 @@ import javax.annotation.PostConstruct;
import java.util.Calendar;
import java.util.List;
@Service
/**
* 建议使用v2.
*/
@Deprecated
//@Service
@ConditionalOnProperty(prefix = "sys.conf",name="app", havingValue = "engine")
public class PluginServiceImpl implements PluginService {
@@ -40,7 +44,7 @@ public class PluginServiceImpl implements PluginService {
@Autowired
private MobileInfoService mobileInfoService;
@Autowired
@Autowired(required = false)
private RestTemplate restTemplate;
@PostConstruct

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.vo.model.PreItemVO;

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.vo.model.PreItemVO;

View File

@@ -0,0 +1,90 @@
package com.pgmmers.radar.service.impl.engine.plugin;
import com.alibaba.fastjson.JSONObject;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.service.engine.vo.Location;
import com.pgmmers.radar.vo.model.PreItemVO;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import java.util.Map;
/**
* author: wangcheng Date: 2020/5/19 Time: 上午11:44 Description:
*/
public class GPS2LOCATION implements PluginServiceV2 {
private static final Logger logger = LoggerFactory.getLogger(GPS2LOCATION.class);
@Override
public Integer key() {
return 2;
}
@Override
public String desc() {
return "GPS转换成地址";
}
@Override
public String getType() {
return null;
}
@Override
public String getMeta() {
return "[{\"column\":\"country\", \"title\":\"国家\", \"type\":\"STRING\"},{\"column\":\"province\", \"title\":\"省份\", \"type\":\"STRING\"},{\"column\":\"city\", \"title\":\"城市\", \"type\":\"STRING\"}]";
}
@Override
public Object handle(PreItemVO item, Map<String, Object> jsonInfo,
String[] sourceField) {
//参考 http://jwd.funnyapi.com/#/index , 最好是本地库。
Location location = new Location();
//纬度
String latitude = String.valueOf(jsonInfo.get(sourceField[0]));
//经度
String longitude = String.valueOf(jsonInfo.get(sourceField[1]));
if ("".equals(latitude) || "".equals(longitude)) {
return null;
}
try {
String url ="http://106.75.35.67:60000/gis?auth_user=freevip&latitude="+latitude+"&longitude="+longitude;
//创建httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//创建GET对象
HttpGet httpget = new HttpGet(url);
//执行请求
CloseableHttpResponse response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode()== HttpStatus.OK.value()) {
HttpEntity entity = response.getEntity();
//所需内容都在entity里面这里可以对数据操作
String detail = EntityUtils.toString(entity,"UTF-8");
JSONObject parseObject = JSONObject.parseObject(detail);
//String转map
String data = parseObject.getString("data");
Map stringToMap = JSONObject.parseObject(data);
location.setCountry(String.valueOf(stringToMap.get("zh0")));
location.setRegion(String.valueOf(stringToMap.get("zh3")));
location.setProvince(String.valueOf(stringToMap.get("zh1")));
location.setCity(String.valueOf(stringToMap.get("zh2")));
}
response.close();
httpclient.close();
} catch (Exception e) {
logger.error("GPS2LOCATION error", e);
}
return location;
}
}

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.alibaba.fastjson.JSONObject;
import com.pgmmers.radar.service.engine.PluginServiceV2;
@@ -40,13 +40,13 @@ public class HTTP_UTIL implements PluginServiceV2 {
public Object handle(PreItemVO item, Map<String, Object> jsonInfo, String[] sourceField) {
String url = item.getArgs();
String reqType = item.getReqType();
String arg = jsonInfo.get(sourceField[0]).toString();
//String arg = jsonInfo.get(sourceField[0]).toString();
HttpHeaders headers = new HttpHeaders();
HttpEntity<String> entity = new HttpEntity<>(headers);
RestTemplate restTemplate = (RestTemplate) BeanUtils.getBean("restTemplate");
ResponseEntity<JSONObject> responseEntity = restTemplate
.exchange(url, HttpMethod.valueOf(reqType), entity, JSONObject.class, arg);
logger.info("http plugin:{}\n{}\n {}", url, arg, responseEntity.toString());
.exchange(url, HttpMethod.valueOf(reqType), entity, JSONObject.class, sourceField);
logger.info("http plugin:{}\n{}\n {}", url, sourceField, responseEntity.toString());
if (responseEntity.getStatusCode() == HttpStatus.OK) {
return responseEntity.getBody();
}

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.service.engine.vo.Location;

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.pgmmers.radar.service.data.MobileInfoService;
import com.pgmmers.radar.service.engine.PluginServiceV2;

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import java.util.Comparator;

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.vo.model.PreItemVO;

View File

@@ -1,4 +1,4 @@
package com.pgmmers.radar.service.impl.engine.Plugin;
package com.pgmmers.radar.service.impl.engine.plugin;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.vo.model.PreItemVO;

View File

@@ -224,55 +224,42 @@ public class DataListsServiceImpl implements DataListsService, SubscribeHandle {
public void init() {
cacheService.subscribeDataList(this);
new Thread(() ->{
List<ModelVO> modelList = modelService.listModel(null);
// 加载系统数据名单列表
Map<String, Object> sysDataListMap = new HashMap<>();
List<DataListsVO> sysList = dataListDal.listDataLists(0L, null);
for (DataListsVO dataListVO : sysList) {
Map<String, String> dataListRecords = new HashMap<String, String>();
// record list
List<DataListRecordVO> recordVOList = dataListDal.listDataRecord(dataListVO.getId());
if (recordVOList != null) {
for (DataListRecordVO record : recordVOList) {
dataListRecords.put(record.getDataRecord(), "");
}
}
sysDataListMap.put(dataListVO.getName(), dataListRecords);
}
Map<String, Object> sysDataListMap = new HashMap<>(32);
List<DataListsVO> sysList = dataListDal.listDataLists(1L, null);
buildList2Map(sysDataListMap, sysList);
for (ModelVO model : modelList) {
Map<String, Object> dataListMap = new HashMap<>();
Map<String, Object> dataListMap = new HashMap<>(32);
// datalist list
List<DataListsVO> dataLists = dataListDal.listDataLists(model.getId(), null);
if (dataLists != null) {
for (DataListsVO dataListVO : dataLists) {
Map<String, String> dataListRecords = new HashMap<>();
// record list
List<DataListRecordVO> recordVOList = dataListDal.listDataRecord(dataListVO.getId());
if (recordVOList != null) {
for (DataListRecordVO record : recordVOList) {
dataListRecords.put(record.getDataRecord(), "");
}
}
dataListMap.put(dataListVO.getName(), dataListRecords);
}
buildList2Map(dataListMap, dataLists);
}
// add sys data list
dataListMap.putAll(sysDataListMap);
dataListRecordCacheMap.put(model.getId(), dataListMap);
}
logger.info("data list has loaded.");
}).start();
}
private void buildList2Map(Map<String, Object> dataListMap, List<DataListsVO> dataLists) {
for (DataListsVO dataListVO : dataLists) {
Map<String, String> dataListRecords = new HashMap<>();
// record list
List<DataListRecordVO> recordVOList = dataListDal.listDataRecord(dataListVO.getId());
if (recordVOList != null) {
for (DataListRecordVO record : recordVOList) {
dataListRecords.put(record.getDataRecord(), "");
}
}
dataListMap.put(dataListVO.getName(), dataListRecords);
}
}
@Override
public Map<String, Object> getDataListMap(Long modelId) {
Map<String, Object> listMap = dataListRecordCacheMap.get(modelId);

View File

@@ -14,7 +14,7 @@ import com.pgmmers.radar.service.cache.SubscribeHandle;
import com.pgmmers.radar.service.common.CommonResult;
import com.pgmmers.radar.service.data.MongoService;
import com.pgmmers.radar.service.engine.PluginServiceV2;
import com.pgmmers.radar.service.impl.engine.Plugin.PluginManager;
import com.pgmmers.radar.service.impl.engine.plugin.PluginManager;
import com.pgmmers.radar.service.model.ModelService;
import com.pgmmers.radar.service.search.SearchEngineService;
import com.pgmmers.radar.util.JsonUtils;
@@ -22,7 +22,11 @@ import com.pgmmers.radar.vo.model.FieldVO;
import com.pgmmers.radar.vo.model.ModelVO;
import com.pgmmers.radar.vo.model.PreItemVO;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;

View File

@@ -14,9 +14,11 @@ import com.pgmmers.radar.service.cache.SubscribeHandle;
import com.pgmmers.radar.service.common.CommonResult;
import com.pgmmers.radar.service.model.RuleService;
import com.pgmmers.radar.service.search.SearchEngineService;
import com.pgmmers.radar.util.DateUtils;
import com.pgmmers.radar.util.GroovyScriptUtil;
import com.pgmmers.radar.vo.model.*;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -24,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.text.ParseException;
import java.util.*;
@Service
@@ -146,6 +149,13 @@ public class RuleServiceImpl extends BaseLocalCacheService implements RuleServic
@Override
public CommonResult getHitSorts(Long modelId) {
Calendar now = Calendar.getInstance();
now.add(Calendar.MONTH , -1);
return getHitSorts(modelId, now.getTimeInMillis(), Calendar.getInstance().getTimeInMillis());
}
@Override
public CommonResult getHitSorts(Long modelId, Long beginTime, Long endTime) {
CommonResult result = new CommonResult();
Set<RuleHitsVO> treeSet = new TreeSet<>();
ModelVO model = modelDal.getModelById(modelId);
@@ -168,8 +178,11 @@ public class RuleServiceImpl extends BaseLocalCacheService implements RuleServic
keyStr = keyStr.replace("${ruleId}", rule.getId() + "");
long qty = 0;
try {
QueryBuilder filter = QueryBuilders
.rangeQuery("fields." + model.getReferenceDate())
.from(beginTime).to(endTime);
qty = searchService.count(model.getGuid().toLowerCase(),
QueryBuilders.termQuery(keyStr,rule.getId() + ""), null);
QueryBuilders.termQuery(keyStr,rule.getId() + ""), filter);
} catch (Exception e) {
logger.error("search error", e);
}
@@ -190,7 +203,24 @@ public class RuleServiceImpl extends BaseLocalCacheService implements RuleServic
return result;
}
@Override
@Override
public CommonResult getHitSorts(Long modelId, String beginTime, String endTime) {
CommonResult result = new CommonResult();
try {
logger.info("search hits:{},{}", beginTime, endTime);
long begin = DateUtils.parseDateTime(beginTime).getTime();
long end = DateUtils.parseDateTime(endTime).getTime();
if (end > begin) {
return getHitSorts(modelId, begin, end);
}
} catch (ParseException e) {
logger.error("时间格式错误", e);
result.setMsg("时间格式错误!");
}
return result;
}
@Override
public CommonResult queryHistory(RuleHistoryQuery query) {
CommonResult result = new CommonResult();

View File

@@ -126,7 +126,6 @@ public class SearchEngineServiceImpl implements SearchEngineService {
public Long count(String index, QueryBuilder query, QueryBuilder filter) throws IOException {
SearchRequest request = new SearchRequest(index);
request.searchType(SearchType.DFS_QUERY_THEN_FETCH);
// request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(query)
.postFilter(filter)

View File

@@ -0,0 +1,122 @@
package com.pgmmers.radar.service.impl.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.StringTokenizer;
/**
* @author 爱好者提供.
* @since 2020-10-18
*/
public class JsonParserUtil {
private static final Logger logger = LoggerFactory.getLogger(JsonParserUtil.class);
private static final String AQL_SEPARATOR = ".";
/**
* 获取方法链的值
*/
public static JSONObject jsonObject(JSONObject json, String aql) {
logger.debug("#获取 json 节点 safety ".concat(aql));
StringTokenizer token = new StringTokenizer(aql, AQL_SEPARATOR);
try {
while (token.hasMoreElements()) {
String argsString = token.nextToken();
json = json.getJSONObject(argsString);
}
return json;
} catch (Exception e) {
logger.warn("解析 json 节点".concat(aql).concat("错误:"), e);
}
return new JSONObject();
}
/**
* 获取安全方法链的 JSONArray
*/
public static JSONArray array(JSONObject json, String aql) {
logger.debug("#获取 json 节点组 safety ".concat(aql));
JSONArray json_array = new JSONArray();
StringTokenizer token = new StringTokenizer(aql, AQL_SEPARATOR);
try {
while (token.hasMoreElements()) {
String argsString = token.nextToken();
if (token.hasMoreElements()) {
json = json.getJSONObject(argsString);
} else {
json_array = json.getJSONArray(argsString);
}
}
} catch (Exception e) {
logger.warn("解析 json 节点".concat(aql).concat("错误:"), e);
}
if (json_array == null) {
json_array = new JSONArray();
}
return json_array;
}
/**
* 获取安全方法链的值,方法中出现错误返回传入的 value
*/
@SuppressWarnings("unchecked")
public static <T> T value(String jsonStr, String aql, T defaultResult) {
logger.debug("#获取 json 节点 safety ".concat(aql));
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
StringTokenizer token = new StringTokenizer(aql, AQL_SEPARATOR);
T tmp_result = null;
try {
while (token.hasMoreElements()) {
String argsString = token.nextToken();
if (token.hasMoreElements()) {
jsonObject = jsonObject.getJSONObject(argsString);
} else {
tmp_result = (T) jsonObject.get(argsString);
}
}
} catch (Exception e) {
String message = "解析 json 节点".concat(aql).concat("错误:");
logger.warn(message, e);
}
defaultResult = (tmp_result == null) ? defaultResult : tmp_result;
return defaultResult;
}
/**
* 获取安全方法链的值,方法中出现错误返回传入的 value
*/
@SuppressWarnings("unchecked")
public static <T> T value(Object javaObject, String aql, T defaultValue) {
logger.debug("#获取 json 节点 safety ".concat(aql));
JSONObject json_object = (JSONObject) JSONObject.toJSON(javaObject);
StringTokenizer token = new StringTokenizer(aql, AQL_SEPARATOR);
T tmp_result = null;
try {
while (token.hasMoreElements()) {
String args_string = token.nextToken();
if (token.hasMoreElements()) {
json_object = json_object.getJSONObject(args_string);
} else {
tmp_result = (T) json_object.get(args_string);
}
}
} catch (Exception e) {
logger.warn("解析 json 节点".concat(aql).concat("错误:"), e);
}
defaultValue = (tmp_result == null) ? defaultValue : tmp_result;
return defaultValue;
}
public static void main(String[] args) {
JSONObject jsonObject = JSONObject.parseObject("{\"a\":{\"b\":{\"c\":1}}}");
System.out.println(JsonParserUtil.jsonObject(jsonObject, "a.b"));
Integer value = JsonParserUtil.value(jsonObject, "a.b.c", null);
System.out.println(value);
Integer value1 = JsonParserUtil.value("{\"a\":{\"b\":{\"c\":1}}}", "a.b.c", null);
System.out.println(value1);
}
}

View File

@@ -1,12 +1,12 @@
com.pgmmers.radar.service.engine.PluginServiceV2=\
com.pgmmers.radar.service.impl.engine.Plugin.DATEFORMAT,\
com.pgmmers.radar.service.impl.engine.Plugin.ALLINONE,\
com.pgmmers.radar.service.impl.engine.Plugin.GPS2LOCATION,\
com.pgmmers.radar.service.impl.engine.Plugin.HTTP_UTIL,\
com.pgmmers.radar.service.impl.engine.Plugin.IP2LOCATION,\
com.pgmmers.radar.service.impl.engine.Plugin.MOBILE2LOCATION,\
com.pgmmers.radar.service.impl.engine.Plugin.SENSITIVE_TIME,\
com.pgmmers.radar.service.impl.engine.Plugin.SUBSTRING
com.pgmmers.radar.service.impl.engine.plugin.DATEFORMAT,\
com.pgmmers.radar.service.impl.engine.plugin.ALLINONE,\
com.pgmmers.radar.service.impl.engine.plugin.GPS2LOCATION,\
com.pgmmers.radar.service.impl.engine.plugin.HTTP_UTIL,\
com.pgmmers.radar.service.impl.engine.plugin.IP2LOCATION,\
com.pgmmers.radar.service.impl.engine.plugin.MOBILE2LOCATION,\
com.pgmmers.radar.service.impl.engine.plugin.SENSITIVE_TIME,\
com.pgmmers.radar.service.impl.engine.plugin.SUBSTRING

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>radar</artifactId>
<groupId>com.pgmmers</groupId>
<version>1.0.5-SNAPSHOT</version>
<version>1.0.6-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -20,7 +20,11 @@ public interface RuleService {
CommonResult delete(Long[] id);
CommonResult getHitSorts(Long modelId);
CommonResult getHitSorts(Long modelId, Long beginTime, Long endTime);
CommonResult getHitSorts(Long modelId, String beginTime, String endTime);
CommonResult queryHistory(RuleHistoryQuery query);
List<RuleVO> listRuleByModelId(Long modelId);

View File

@@ -1,7 +0,0 @@
ALTER TABLE `engine_pre_item`
MODIFY COLUMN `ARGS` varchar(250) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '参数' AFTER `LABEL`;
ALTER TABLE `engine_pre_item`
ADD COLUMN `CONFIG_JSON` varchar(250) NULL COMMENT '响应字段配置信息' AFTER `PLUGIN`;
ALTER TABLE `engine_pre_item`
ADD COLUMN `REQ_TYPE` varchar(16) NULL COMMENT '请求方式' AFTER `CONFIG_JSON`;

View File

@@ -1,48 +0,0 @@
/*
Navicat MySQL Data Transfer
Source Server : test@172.30.0.6
Source Server Version : 50726
Source Host : 172.30.0.6:3306
Source Database : radar
Target Server Type : MYSQL
Target Server Version : 50726
File Encoding : 65001
Date: 2019-12-24 18:02:12
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for engine_model_conf
-- ----------------------------
DROP TABLE IF EXISTS `engine_model_conf`;
CREATE TABLE `engine_model_conf` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`model_id` bigint(20) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`path` varchar(255) DEFAULT NULL,
`tag` varchar(255) DEFAULT NULL,
`operation` varchar(255) DEFAULT NULL,
`update_date` datetime DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
`comment` varchar(128) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for engine_model_conf_param
-- ----------------------------
DROP TABLE IF EXISTS `engine_model_conf_param`;
CREATE TABLE `engine_model_conf_param` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`mold_id` bigint(20) DEFAULT NULL,
`feed` varchar(255) DEFAULT NULL,
`expressions` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

View File

@@ -1,4 +0,0 @@
ALTER TABLE `users` ADD COLUMN `VIP_LEVEL` int(0) NULL DEFAULT 1 AFTER `STATUS`;
ALTER TABLE `users` ADD COLUMN `MOBILE` varchar(20) NULL AFTER `VIP_LEVEL`;
ALTER TABLE `users` ADD COLUMN `EMAIL` varchar(32) NULL AFTER `MOBILE`;
ALTER TABLE `users` ADD COLUMN `GITEE_ACCOUNT` varchar(32) NULL AFTER `EMAIL`;

39
sql/radar-1.0.6.sql Normal file
View File

@@ -0,0 +1,39 @@
CREATE TABLE `engine_model_conf` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`model_id` bigint(20) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`path` varchar(255) DEFAULT NULL,
`tag` varchar(255) DEFAULT NULL,
`operation` varchar(255) DEFAULT NULL,
`update_date` datetime DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
`comment` varchar(128) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `engine_model_conf_param` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`mold_id` bigint(20) DEFAULT NULL,
`feed` varchar(255) DEFAULT NULL,
`expressions` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
ALTER TABLE `engine_pre_item`
MODIFY COLUMN `ARGS` varchar(250) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '' COMMENT '参数' AFTER `LABEL`;
ALTER TABLE `engine_pre_item`
ADD COLUMN `CONFIG_JSON` varchar(250) NULL COMMENT '响应字段配置信息' AFTER `PLUGIN`;
ALTER TABLE `engine_pre_item`
ADD COLUMN `REQ_TYPE` varchar(16) NULL COMMENT '请求方式' AFTER `CONFIG_JSON`;
ALTER TABLE `users` ADD COLUMN `VIP_LEVEL` int(0) NULL DEFAULT 1 AFTER `STATUS`;
ALTER TABLE `users` ADD COLUMN `MOBILE` varchar(20) NULL AFTER `VIP_LEVEL`;
ALTER TABLE `users` ADD COLUMN `EMAIL` varchar(32) NULL AFTER `MOBILE`;
ALTER TABLE `users` ADD COLUMN `GITEE_ACCOUNT` varchar(32) NULL AFTER `EMAIL`;
INSERT INTO `radar`.`engine_model`(`ID`, `GUID`, `MODEL_NAME`, `LABEL`, `ENTITY_NAME`, `ENTRY_NAME`, `REFERENCE_DATE`, `FIELD_VALIDATE`, `CODE`, `TEMPLATE`, `DASHBOARD_URL`, `STATUS`, `CREATE_TIME`, `UPDATE_TIME`) VALUES (1, '00000000-0000-0000-0000-000000000001', 'system', 'system', 'userId', 'eventId', 'loginTime', 0, 'pgmmer.top', 1, NULL, 0, '2016-11-17 10:59:43', '2016-11-18 18:02:15');

View File

@@ -168,15 +168,15 @@ CREATE TABLE `engine_data_lists` (
-- ----------------------------
-- Records of engine_data_lists
-- ----------------------------
INSERT INTO `engine_data_lists` VALUES ('1', 'radar_brand_black_List', '[系统]手机品牌黑名单', '0', '', 'BLACK', '1', '2016-08-10 16:02:29', '2016-08-10 16:02:31');
INSERT INTO `engine_data_lists` VALUES ('3', 'radar_mobile_black_list', '[系统]手机号码黑名单', '0', '', 'BLACK', '1', '2016-08-24 18:37:52', '2016-08-24 18:37:55');
INSERT INTO `engine_data_lists` VALUES ('5', 'radar_mobile_white_list', '[系统]手机号码白名单', '0', '', 'WHITE', '1', '2016-08-24 18:38:55', '2016-08-24 18:38:58');
INSERT INTO `engine_data_lists` VALUES ('7', 'radar_ip_black_list', '[系统]IP黑名单', '0', '', 'BLACK', '1', '2016-08-25 11:22:12', '2016-08-25 11:22:16');
INSERT INTO `engine_data_lists` VALUES ('9', 'radar_ip_white_list', '[系统]IP白名单', '0', '', 'WHITE', '1', '2016-09-18 10:27:25', '2016-09-18 10:27:25');
INSERT INTO `engine_data_lists` VALUES ('1', 'radar_brand_black_List', '[系统]手机品牌黑名单', '1', '', 'BLACK', '1', '2016-08-10 16:02:29', '2016-08-10 16:02:31');
INSERT INTO `engine_data_lists` VALUES ('3', 'radar_mobile_black_list', '[系统]手机号码黑名单', '1', '', 'BLACK', '1', '2016-08-24 18:37:52', '2016-08-24 18:37:55');
INSERT INTO `engine_data_lists` VALUES ('5', 'radar_mobile_white_list', '[系统]手机号码白名单', '1', '', 'WHITE', '1', '2016-08-24 18:38:55', '2016-08-24 18:38:58');
INSERT INTO `engine_data_lists` VALUES ('7', 'radar_ip_black_list', '[系统]IP黑名单', '1', '', 'BLACK', '1', '2016-08-25 11:22:12', '2016-08-25 11:22:16');
INSERT INTO `engine_data_lists` VALUES ('9', 'radar_ip_white_list', '[系统]IP白名单', '1', '', 'WHITE', '1', '2016-09-18 10:27:25', '2016-09-18 10:27:25');
INSERT INTO `engine_data_lists` VALUES ('10', 'mobile_brand_white_list', '[系统]手机品牌白名单', '1', '', 'WHITE', '1', '2016-11-23 16:07:31', '2016-11-23 16:07:31');
INSERT INTO `engine_data_lists` VALUES ('29', 'mobile_white_list', '手机号码白名单', '101', '', 'WHITE', '1', '2016-11-21 14:07:29', '2016-11-21 14:07:29');
INSERT INTO `engine_data_lists` VALUES ('31', 'mobile_white_list', '手机号码白名单', '103', '', 'WHITE', '1', '2016-11-21 14:09:57', '2016-11-21 14:09:57');
INSERT INTO `engine_data_lists` VALUES ('33', 'mobile_white_list', '手机号码白名单', '99', '', 'WHITE', '1', '2016-11-21 14:11:37', '2016-11-21 14:11:37');
INSERT INTO `engine_data_lists` VALUES ('35', 'mobile_brand_white_list', '[系统]手机品牌白名单', '0', '', 'WHITE', '1', '2016-11-23 16:07:31', '2016-11-23 16:07:31');
INSERT INTO `engine_data_lists` VALUES ('84', 'mobile_white_list', '手机号码白名单', '222', '', 'WHITE', '1', '2019-09-10 11:16:12', '2019-09-10 11:16:12');
INSERT INTO `engine_data_lists` VALUES ('85', 'mobile_white_list', '手机号码白名单', '224', '', 'WHITE', '1', '2019-09-11 18:05:35', '2019-09-11 18:05:35');