Commit 4190cf2d by ljb

commit all

parent 24f51ccd
...@@ -13,6 +13,9 @@ spiderflow.name: SPIDER-FLOW ...@@ -13,6 +13,9 @@ spiderflow.name: SPIDER-FLOW
model.port: 9877 model.port: 9877
model.name: MODEL-SERVER model.name: MODEL-SERVER
data.port: 9688
data.name: DATAOPERATION-SERVER
datacollect.port: 9697 datacollect.port: 9697
datacollect.name: DATA-COLLECT-SERVER datacollect.name: DATA-COLLECT-SERVER
......
...@@ -93,9 +93,9 @@ ...@@ -93,9 +93,9 @@
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <!-- <configuration>-->
<skip>true</skip> <!-- <skip>true</skip>-->
</configuration> <!-- </configuration>-->
</plugin> </plugin>
</plugins> </plugins>
......
...@@ -6,9 +6,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -6,9 +6,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication @SpringBootApplication
@MapperScan({"com.zq.datacollect.mapper"}) @MapperScan({"com.zq.datacollect.mapper"})
public class DataCollectAppliction { public class DataCollectApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(DataCollectAppliction.class, args); SpringApplication.run(DataCollectApplication.class, args);
} }
} }
\ No newline at end of file
package com.zq.datacollect.holder; package com.zq.datacollect.holder;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.Connection; import java.sql.Connection;
...@@ -24,7 +25,7 @@ public class DatabaseHolder { ...@@ -24,7 +25,7 @@ public class DatabaseHolder {
public static Connection getConnection(Integer id){ public static Connection getConnection(Integer id){
try { try {
return jdbcTemplateMap.get(id).getDataSource().getConnection(); return ((DruidDataSource) jdbcTemplateMap.get(id).getDataSource()).getConnection().getConnection();
} catch (SQLException e) { } catch (SQLException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
......
...@@ -76,11 +76,11 @@ ...@@ -76,11 +76,11 @@
<artifactId>poi</artifactId> <artifactId>poi</artifactId>
<version>4.1.1</version> <version>4.1.1</version>
</dependency> </dependency>
<!-- <dependency>--> <!-- <dependency>-->
<!-- <groupId>com.oracle</groupId>--> <!-- <groupId>com.oracle</groupId>-->
<!-- <artifactId>ojdbc6</artifactId>--> <!-- <artifactId>ojdbc6</artifactId>-->
<!-- <version>11.2.0.3</version>--> <!-- <version>11.2.0.3</version>-->
<!-- </dependency>--> <!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/com.oracle.database.nls/orai18n --> <!-- https://mvnrepository.com/artifact/com.oracle.database.nls/orai18n -->
<!-- swagger start--> <!-- swagger start-->
<dependency> <dependency>
......
...@@ -60,9 +60,8 @@ public class CommonQueryController { ...@@ -60,9 +60,8 @@ public class CommonQueryController {
AssertUtils.notNull(queryDb.getDbType(), "缺少数据库类型"); AssertUtils.notNull(queryDb.getDbType(), "缺少数据库类型");
AssertUtils.hasText(queryDb.getUsername(), "缺少连接用户名"); AssertUtils.hasText(queryDb.getUsername(), "缺少连接用户名");
AssertUtils.hasText(queryDb.getPassword(), "缺少连接密码"); AssertUtils.hasText(queryDb.getPassword(), "缺少连接密码");
queryDb.setUpdateTime(DateUtil.date()); commonQueryService.updateDatasource(queryDb);
boolean b = queryDbService.updateById(queryDb); return ResultVo.success("操作成功!");
return b ? ResultVo.success("操作成功!") : ResultVo.fail("操作失败");
} }
/** /**
...@@ -73,10 +72,10 @@ public class CommonQueryController { ...@@ -73,10 +72,10 @@ public class CommonQueryController {
*/ */
@ApiOperation("根据ID删除数据源") @ApiOperation("根据ID删除数据源")
@DeleteMapping("/deleteDatasource/{id}") @DeleteMapping("/deleteDatasource/{id}")
public ResultVo deleteDatasource(@PathVariable Long id) { public ResultVo deleteDatasource(@PathVariable Integer id) {
AssertUtils.notNull(id, "删除至少需要一个ID!"); AssertUtils.notNull(id, "删除至少需要一个ID!");
boolean b = queryDbService.removeById(id); commonQueryService.deleteDatasource(id);
return b ? ResultVo.success("操作成功!") : ResultVo.fail("操作失败!"); return ResultVo.success("操作成功!");
} }
......
package com.zq.dataoperation.holder; package com.zq.dataoperation.holder;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.zq.common.exception.BusinessException;
import com.zq.common.utils.AssertUtils;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.Connection; import java.sql.Connection;
...@@ -9,14 +13,33 @@ import java.util.Map; ...@@ -9,14 +13,33 @@ import java.util.Map;
public class DatabaseHolder { public class DatabaseHolder {
private static Map<Integer, JdbcTemplate> jdbcTemplateMap; private static Map<Integer, JdbcTemplate> jdbcTemplateMap = new HashMap<>();
public static void set(Map<Integer, JdbcTemplate> map) { public static void add(Integer dbType, String dbIp, Integer dbPort, String dbName, String username, String password, Integer id) {
jdbcTemplateMap = map; DruidDataSource druidDataSource = new DruidDataSource();
String url = "";
String className = "";
switch (dbType) {
case 1:
className = "com.mysql.cj.jdbc.Driver";
url = "jdbc:mysql://" + dbIp + ":" + dbPort + "/" + dbName + "?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true";
break;
case 2:
className = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@//" + dbIp + ":" + dbPort + "/" + dbName;
break;
case 3:
className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
url = "jdbc:sqlserver://" + dbIp + ":" + dbPort + "/" + dbName;
break;
default:
throw new BusinessException("不支持的数据库");
} }
druidDataSource.setDriverClassName(className);
public static void add(Integer id, JdbcTemplate jdbcTemplate){ druidDataSource.setUrl(url);
jdbcTemplateMap.put(id, jdbcTemplate); druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
jdbcTemplateMap.put(id, new JdbcTemplate(druidDataSource));
} }
public static JdbcTemplate getJdbcTemplate(Integer id){ public static JdbcTemplate getJdbcTemplate(Integer id){
...@@ -27,7 +50,13 @@ public class DatabaseHolder { ...@@ -27,7 +50,13 @@ public class DatabaseHolder {
try { try {
return jdbcTemplateMap.get(id).getDataSource().getConnection(); return jdbcTemplateMap.get(id).getDataSource().getConnection();
} catch (SQLException e) { } catch (SQLException e) {
throw new RuntimeException(e); e.printStackTrace();
throw new BusinessException("获取数据库连接失败");
} }
} }
public static void remove(Integer id){
((DruidDataSource)jdbcTemplateMap.get(id).getDataSource()).close();
jdbcTemplateMap.remove(id);
}
} }
\ No newline at end of file
package com.zq.dataoperation.runner; package com.zq.dataoperation.runner;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.zq.common.exception.BusinessException;
import com.zq.dataoperation.entity.QueryDb; import com.zq.dataoperation.entity.QueryDb;
import com.zq.dataoperation.holder.DatabaseHolder; import com.zq.dataoperation.holder.DatabaseHolder;
import com.zq.dataoperation.service.CommonQueryService; import com.zq.dataoperation.service.CommonQueryService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;; import javax.annotation.Resource;;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@Slf4j @Slf4j
@Component @Component
...@@ -25,39 +19,12 @@ public class DatabaseRunner implements ApplicationRunner { ...@@ -25,39 +19,12 @@ public class DatabaseRunner implements ApplicationRunner {
@Resource @Resource
private CommonQueryService service; private CommonQueryService service;
private Map<Integer, JdbcTemplate> jdbcTemplateMap = new HashMap<>();
@Override @Override
public void run(ApplicationArguments args) throws SQLException { public void run(ApplicationArguments args) {
List<QueryDb> datasource = service.getDatasource(); List<QueryDb> datasource = service.getDatasource();
for (QueryDb ds : datasource) { for (QueryDb ds : datasource) {
DruidDataSource druidDataSource = DruidDataSourceBuilder.create().build(); DatabaseHolder.add(ds.getDbType(), ds.getDbIp(), ds.getDbPort(), ds.getDbName(), ds.getUsername(), ds.getPassword(), ds.getId());
String url = "";
String className = "";
switch (ds.getDbType()) {
case 1:
className = "com.mysql.cj.jdbc.Driver";
url = "jdbc:mysql://" + ds.getDbIp() + ":" + ds.getDbPort() + "/" + ds.getDbName() + "?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true";
break;
case 2:
className = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@//" + ds.getDbIp() + ":" + ds.getDbPort() + "/" + ds.getDbName();
break;
case 3:
className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
url = "jdbc:sqlserver://" + ds.getDbIp() + ":" + ds.getDbPort() + "/" + ds.getDbName();
break;
default:
throw new BusinessException("不支持的数据库");
}
druidDataSource.setDriverClassName(className);
druidDataSource.setUrl(url);
druidDataSource.setUsername(ds.getUsername());
druidDataSource.setPassword(ds.getPassword());
druidDataSource.init();
jdbcTemplateMap.put(ds.getId(), new JdbcTemplate(druidDataSource));
} }
DatabaseHolder.set(jdbcTemplateMap); log.info("成功加载数据库:{}个", datasource.size());
log.info("成功加载数据库:{}个", jdbcTemplateMap.size());
} }
} }
\ No newline at end of file
package com.zq.dataoperation.service; package com.zq.dataoperation.service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.druid.pool.DruidPooledConnection; import com.alibaba.druid.pool.DruidPooledConnection;
...@@ -7,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -7,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zq.common.context.ThreadContext; import com.zq.common.context.ThreadContext;
import com.zq.common.exception.BusinessException; import com.zq.common.exception.BusinessException;
import com.zq.common.utils.AssertUtils;
import com.zq.common.vo.PageVo; import com.zq.common.vo.PageVo;
import com.zq.common.vo.ResultVo; import com.zq.common.vo.ResultVo;
import com.zq.dataoperation.dao.CommonQuerySettingDao; import com.zq.dataoperation.dao.CommonQuerySettingDao;
...@@ -50,9 +52,8 @@ public class CommonQueryService extends ServiceImpl<CommonQuerySettingDao, Commo ...@@ -50,9 +52,8 @@ public class CommonQueryService extends ServiceImpl<CommonQuerySettingDao, Commo
} }
public ResultVo addDatasource(QueryDb queryDb) { public ResultVo addDatasource(QueryDb queryDb) {
if (queryDbDao.insert(queryDb) != 1) { AssertUtils.isTrue(queryDbDao.insert(queryDb) == 1, "添加失败,请检查后重试");
throw new BusinessException("添加失败"); DatabaseHolder.add(queryDb.getDbType(), queryDb.getDbIp(), queryDb.getDbPort(), queryDb.getDbName(), queryDb.getUsername(), queryDb.getPassword(), queryDb.getId());
}
return ResultVo.success(); return ResultVo.success();
} }
...@@ -61,9 +62,21 @@ public class CommonQueryService extends ServiceImpl<CommonQuerySettingDao, Commo ...@@ -61,9 +62,21 @@ public class CommonQueryService extends ServiceImpl<CommonQuerySettingDao, Commo
} }
public void add(CommonQuerySetting commonQuerySetting) { public void add(CommonQuerySetting commonQuerySetting) {
if (!save(commonQuerySetting)) { AssertUtils.isTrue(save(commonQuerySetting), "添加失败");
throw new BusinessException("添加失败"); }
@Transactional
public void updateDatasource(QueryDb queryDb){
queryDb.setUpdateTime(DateUtil.date());
AssertUtils.isTrue(queryDbService.updateById(queryDb), "操作失败!");
DatabaseHolder.remove(queryDb.getId());
DatabaseHolder.add(queryDb.getDbType(), queryDb.getDbIp(), queryDb.getDbPort(), queryDb.getDbName(), queryDb.getUsername(), queryDb.getPassword(), queryDb.getId());
} }
@Transactional
public void deleteDatasource(Integer id){
AssertUtils.isTrue(queryDbService.removeById(id), "操作失败!");
DatabaseHolder.remove(id);
} }
public List<Map<String, Object>> run(Map<String, Object> body) { public List<Map<String, Object>> run(Map<String, Object> body) {
...@@ -345,7 +358,8 @@ public class CommonQueryService extends ServiceImpl<CommonQuerySettingDao, Commo ...@@ -345,7 +358,8 @@ public class CommonQueryService extends ServiceImpl<CommonQuerySettingDao, Commo
// } // }
return list; return list;
} }
@Resource
private QueryDbService queryDbService;
@Transactional @Transactional
public Object sqlOutput(Map<String, Object> body) throws Exception { public Object sqlOutput(Map<String, Object> body) throws Exception {
......
...@@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils; ...@@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>nnjcy-data-model</artifactId>
<groupId>com.zq</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>flow-component</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.zq</groupId>
<artifactId>spider-flow-api</artifactId>
</dependency>
<dependency>
<groupId>com.zq</groupId>
<artifactId>common-client</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package com.zq.spiderflow.datacollision.executor;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.zq.common.exception.BusinessException;
import com.zq.spiderflow.context.SpiderContext;
import com.zq.spiderflow.executor.ShapeExecutor;
import com.zq.spiderflow.model.Shape;
import com.zq.spiderflow.model.SpiderNode;
import com.zq.spiderflow.model.SpiderOutput;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class DataCollisionExecutor implements ShapeExecutor {
public static final String TABLE1 = "table1";
public static final String FIELD1 = "field1";
public static final String TABLE2 = "table2";
public static final String FIELD2 = "field2";
public static final String RESERVE = "reserve";
@Override
public Shape shape() {
Shape shape = new Shape();
shape.setImage("data:image/png;base64,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");
shape.setLabel("数据碰撞");
shape.setName("DataCollision");
shape.setTitle("数据碰撞");
return shape;
}
@Override
public String supportShape() {
return "DataCollision";
}
@Override
public void execute(SpiderNode node, SpiderContext context, Map<String, Object> variables) throws Exception {
String table1 = null;
String table2 = null;
String field1 = null;
String field2 = null;
try {
table1 = node.getStringJsonValue(TABLE1);
table2 = node.getStringJsonValue(TABLE2);
field1 = node.getStringJsonValue(FIELD1);
field2 = node.getStringJsonValue(FIELD2);
}catch (Exception e){
throw new BusinessException("不是字符串");
}
if(StrUtil.isBlank(table1)){
throw new BusinessException("没有表1");
}
if(StrUtil.isBlank(table2)){
throw new BusinessException("没有表2");
}
if(StrUtil.isBlank(field1)){
throw new BusinessException("没有字段1");
}
if(StrUtil.isBlank(field2)){
throw new BusinessException("没有字段2");
}
List<Map<String, Object>> list1 = (List<Map<String, Object>>) variables.get(table1);
List<Map<String, Object>> list2 = (List<Map<String, Object>>) variables.get(table2);
if(list1==null){
throw new BusinessException("表1没有数据");
}
if(list2==null){
throw new BusinessException("表2没有数据");
}
List<Map<String, Object>> results = new ArrayList<>();
for (Map<String, Object> map1 : list1) {
String field1Str = map1.get(field1).toString();
for (Map<String, Object> map2 : list2) {
String field2Str = map2.get(field2).toString();
if(field1Str.equals(field2Str)){
map1.putAll(map2);
results.add(map1);
break;
}
}
}
variables.put(node.getNodeId() + "_" + node.getNodeName(), results);
SpiderOutput output = new SpiderOutput();
output.setNodeName(node.getNodeName());
output.setNodeId(node.getNodeId());
output.addOutput("result", results);
context.writeResult(output);
}
}
\ No newline at end of file
package com.zq.spiderflow.excelremoveduplicate.executor;
import com.zq.spiderflow.context.SpiderContext;
import com.zq.spiderflow.executor.ShapeExecutor;
import com.zq.spiderflow.model.Shape;
import com.zq.spiderflow.model.SpiderNode;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class ExcelRemoveDuplicateExecutor implements ShapeExecutor {
public static final String TABLE1 = "table1";
public static final String FIELD1 = "field1";
public static final String TABLE2 = "table2";
public static final String FIELD2 = "field2";
public static final String RESERVE = "reserve";
@Override
public Shape shape() {
Shape shape = new Shape();
shape.setImage("data:image/png;base64,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");
shape.setLabel("表格去重");
shape.setName("ExcelRemoveDuplicate");
shape.setTitle("表格去重");
return shape;
}
@Override
public String supportShape() {
return "ExcelRemoveDuplicate";
}
@Override
public void execute(SpiderNode node, SpiderContext context, Map<String, Object> variables) throws Exception {
variables.put("test", "test");
}
}
\ No newline at end of file
package com.zq.spiderflow.flowcall.executor;
import com.zq.spiderflow.context.SpiderContext;
import com.zq.spiderflow.executor.ShapeExecutor;
import com.zq.spiderflow.model.Shape;
import com.zq.spiderflow.model.SpiderNode;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class FlowCallExecutor implements ShapeExecutor {
public static final String FLOW_ID = "flowId";
@Override
public Shape shape() {
Shape shape = new Shape();
shape.setImage("data:image/png;base64,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");
shape.setLabel("流程调用");
shape.setName("FlowCall");
shape.setTitle("流程调用");
return shape;
}
@Override
public String supportShape() {
return "FlowCall";
}
@Override
public void execute(SpiderNode node, SpiderContext context, Map<String, Object> variables) throws Exception {
String flowId = node.getStringJsonValue(FLOW_ID);
}
}
\ No newline at end of file
package com.zq.spiderflow.readfile.executor;
import cn.hutool.core.io.FileUtil;
import com.alibaba.excel.EasyExcel;
import com.zq.common.utils.AssertUtils;
import com.zq.common.utils.EasyExcelUtil;
import com.zq.spiderflow.context.SpiderContext;
import com.zq.spiderflow.executor.ShapeExecutor;
import com.zq.spiderflow.model.Shape;
import com.zq.spiderflow.model.SpiderNode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.Map;
@Component
public class ReadFileExecutor implements ShapeExecutor {
@Value("${spider.workspace}")
private String workspace;
public static final String FILE_NAME = "fileName";
@Override
public Shape shape() {
Shape shape = new Shape();
shape.setImage("data:image/png;base64,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");
shape.setLabel("Excel文件");
shape.setName("Excel");
shape.setTitle("Excel文件");
return shape;
}
@Override
public String supportShape() {
return "Excel";
}
@Override
public void execute(SpiderNode node, SpiderContext context, Map<String, Object> variables) throws Exception {
String fileName = node.getStringJsonValue(FILE_NAME);
String suffix = FileUtil.extName(fileName);
AssertUtils.isTrue(suffix.equals("xls") || suffix.equals("xlsx") || suffix.equals("et"), "不支持的文件类型");
variables.put(node.getNodeId() + "_" + node.getNodeName(), EasyExcelUtil.readAll(new File(workspace, context.getFlowId() + File.separator + "file" + File.separator + fileName)));
}
}
\ No newline at end of file
...@@ -81,6 +81,12 @@ ...@@ -81,6 +81,12 @@
<artifactId>spider-flow-selenium</artifactId> <artifactId>spider-flow-selenium</artifactId>
<version>1.0.0</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>com.zq</groupId>
<artifactId>flow-component</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
...@@ -107,8 +113,9 @@ ...@@ -107,8 +113,9 @@
<module>spider-flow-core</module> <module>spider-flow-core</module>
<module>spider-flow-web</module> <module>spider-flow-web</module>
<module>spider-flow-selenium</module> <module>spider-flow-selenium</module>
<module>dataoperation-server</module>
<module>data-collect-server</module> <module>data-collect-server</module>
<module>dataoperation-server</module>
<module>flow-component</module>
</modules> </modules>
<profiles> <profiles>
......
...@@ -86,6 +86,10 @@ public class SpiderContext extends HashMap<String, Object>{ ...@@ -86,6 +86,10 @@ public class SpiderContext extends HashMap<String, Object>{
} }
public void writeResult(SpiderOutput output){
}
public SubThreadPoolExecutor getThreadPool() { public SubThreadPoolExecutor getThreadPool() {
return threadPool; return threadPool;
} }
......
package com.zq.spiderflow.executor; package com.zq.spiderflow.executor;
import java.sql.SQLException;
import java.util.Map; import java.util.Map;
import com.zq.spiderflow.context.SpiderContext; import com.zq.spiderflow.context.SpiderContext;
...@@ -36,7 +35,7 @@ public interface ShapeExecutor { ...@@ -36,7 +35,7 @@ public interface ShapeExecutor {
* @param context 爬虫上下文 * @param context 爬虫上下文
* @param variables 节点流程的全部变量的集合 * @param variables 节点流程的全部变量的集合
*/ */
void execute(SpiderNode node, SpiderContext context, Map<String, Object> variables) throws SQLException; void execute(SpiderNode node, SpiderContext context, Map<String, Object> variables) throws Exception;
default boolean allowExecuteNext(SpiderNode node, SpiderContext context, Map<String, Object> variables){ default boolean allowExecuteNext(SpiderNode node, SpiderContext context, Map<String, Object> variables){
return true; return true;
......
...@@ -66,10 +66,10 @@ public class SeleniumExecutor implements ShapeExecutor { ...@@ -66,10 +66,10 @@ public class SeleniumExecutor implements ShapeExecutor {
@Override @Override
public Shape shape() { public Shape shape() {
Shape shape = new Shape(); Shape shape = new Shape();
shape.setImage("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEnklEQVRYR7WXb0xbVRTAz7ktyLbyR9wGBMbKkDHjkE6gWwKBYrJlmk1xkcyone2iJiZzDjWL2RdZ4hejGZiQOOOHlpiZkGWkSCAL0fHaUGIIc3UDN3AITGpH9q9FdPxZ3zG3paOF1/ceTt7Hd88953fOPefccxFW+A3XmAyiCFUILA0B0ghBDwQeroYRCQXt3c6VqEQ1wtwoEXsfgGoAME3FHjtDsbnAIQhKsrIAV2tMeiS0IaBJSZHUOgEJhGR9yiGMxdsfF2B4/3MWYtSg0mMZPvKjiHVb2y/YpYQkAYZerLYD4pv/xWuZPfbCtgvWpevLAFbJeMTuMogYgHDYwfY/ex6jDkWwRh/HQ4BMm0XvdNzg5ZS6mgBct4hiXiQxowDMQs3INNZdCVSuNgCvjm1t3dXcTggg0/aGCZF1E1GgvcOHKfNiSjwITUaWN/2946Ns0+YixlgoWvRgKpDo77yScKslD1HMVuMAA9qBRsGzAHDIjgihrDdMzrgae29LRiHZ/JZLt2dfpc8P3vMD7PqlG5i0JgHmt2VR8JXS4I7kJExZM3rUzWbHy5UhqFljFCwLAGY/Ij48+yZhcnj7vfmt0Uoixm09zNU1CMUAi/JhOQrUltLAgRIqTxo/4dLcH1Q4SvJrjMLjGAl/jLG5oKe9w2eI/ONh3/jFV9mtF9F9tp/JerfnaXJZK8TKtVdf9iodB0Oqxkyb2YKIy0rvw5/v9O0fv2/kEOs/bXDPZOiL3mnWxs2NRQcocOqgOJ37oGUs8fZ38keBVIeZtkP1iPDJ0jNjIk04On0pPCEzmlunmnu1nq5BVFUhPAqWXf5i3XWzfEkTnYwLwIGq/vjHebL/blXWtw44cob13ZnGUESUvtx0cH9WGyxfd+0leVElAF6WZ7puTpd9fS57JQBP6Kiv6XXR+MgAHH/LvTl3h/V00UqP4LBxIn/t7+/K9wQegSyb+RggNsjF6oeqj11aTc6WD1pYCgAqJuKpg0Gv6iTcYHvNoEXtJTkAQ7p+qMX0UWHrRew5288q5GRrS0U37wWqypB3w3Arjm1EUgYajVbn8zklVbYe5uwaxKrlMjRVW0qXD5RQxZ+jn3cWzPa8oJCsAY2xm8+VHGCxFctt+nLnYWFv9rMmnx8mzg+wkWs+1HB53or3bhfzs9Ig5/vRrh9fnWkqje6s0jpjWrFFjyiOKpUXX8/VbZho2vX2WIEu8xnGeE4AiKI49dv0zctHfvpGfyL115F9qTMSEYrVzhIoD3cIYzHXMaJUaNVghWU2J8553U9OKt6GRNSm3SnU8D0xAwlA0KMcuvhAvfnevtzHRKVmFWAJZODexwAsJKPkvaAmBruT//7FtulusaIsUp2mTGiMyC0bStUm5FJDQ4UTw+s0FHOFS1RKaAaI/i85lq8U4uh6v/v4xr8UhpBw1i+Fivsw4R2SAOqVciKFBacGC70kIxcgoGNao6D+YRKh5JMyQNAuVx2ns28545cdNbMEqI8knFR+qHqchkHEev44jfY0TtkFAMjBEOxY9oiPUyni0N0BGhMBptlzJ5N262ZnQnIM/AzAo8ZotN5/AYJq57vIypCyAAAAAElFTkSuQmCC"); shape.setImage("data:image/png;base64,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");
shape.setLabel("浏览器");
shape.setName("selenium"); shape.setName("selenium");
shape.setTitle("Selenium"); shape.setTitle("浏览器");
shape.setLabel("Selenium");
return shape; return shape;
} }
......
...@@ -99,6 +99,12 @@ ...@@ -99,6 +99,12 @@
<artifactId>springfox-swagger-ui</artifactId> <artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version> <version>${swagger.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.zq</groupId>
<artifactId>flow-component</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.zq.spiderflow.controller;
import cn.hutool.core.util.StrUtil;
import com.zq.common.vo.ResultVo;
import com.zq.spiderflow.service.ModelService;
import com.zq.spiderflow.util.AssertUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@RestController
@RequestMapping("/spiderflow/model")
public class ModelController {
@Resource
private ModelService modelService;
@PostMapping("/test/file")
public ResultVo uploadTestFile(@RequestParam("flowId") String flowId, MultipartFile file) throws Exception {
AssertUtils.isTrue(StrUtil.isNotBlank(flowId), "流程id不能为空");
return ResultVo.success(modelService.uploadTestFile(flowId, file));
}
}
\ No newline at end of file
...@@ -35,6 +35,10 @@ public class SpiderWebSocketContext extends SpiderContext { ...@@ -35,6 +35,10 @@ public class SpiderWebSocketContext extends SpiderContext {
this.debug = debug; this.debug = debug;
} }
public void writeResult(SpiderOutput output){
this.write(new WebSocketEvent<>("result", output));
}
@Override @Override
public void addOutput(SpiderOutput output) { public void addOutput(SpiderOutput output) {
this.write(new WebSocketEvent<>("output", output)); this.write(new WebSocketEvent<>("output", output));
......
package com.zq.spiderflow.service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public interface ModelService {
Map<String, Object> uploadTestFile(String flowId, MultipartFile file) throws Exception;
}
\ No newline at end of file
package com.zq.spiderflow.service.impl;
import cn.hutool.core.io.FileUtil;
import com.zq.common.utils.EasyExcelUtil;
import com.zq.spiderflow.service.ModelService;
import com.zq.spiderflow.util.AssertUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.*;
@Service
public class ModelServiceImpl implements ModelService {
@Value("${spider.workspace}")
private String workspace;
@Override
public Map<String, Object> uploadTestFile(String flowId, MultipartFile multipartFile) throws Exception {
String suffix = FileUtil.extName(multipartFile.getOriginalFilename());
AssertUtils.isTrue(suffix.equals("xls") || suffix.equals("xlsx") || suffix.equals("et"), "不支持的文件类型");
File file = new File(workspace, flowId + File.separator + "file" + File.separator + multipartFile.getOriginalFilename());
if(file.exists()){
FileUtil.del(file);
}else {
file.mkdirs();
}
multipartFile.transferTo(file);
return EasyExcelUtil.preview100(file);
}
}
\ No newline at end of file
package com.zq.spiderflow.websocket; package com.zq.spiderflow.websocket;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zq.spiderflow.core.Spider; import com.zq.spiderflow.core.Spider;
import com.zq.spiderflow.core.utils.SpiderFlowUtils; import com.zq.spiderflow.core.utils.SpiderFlowUtils;
import com.zq.spiderflow.model.SpiderWebSocketContext; import com.zq.spiderflow.model.SpiderWebSocketContext;
import com.zq.spiderflow.model.WebSocketEvent; import com.zq.spiderflow.model.WebSocketEvent;
import com.zq.spiderflow.util.AssertUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.websocket.OnClose; import javax.websocket.OnClose;
...@@ -35,11 +37,15 @@ public class WebSocketEditorServer { ...@@ -35,11 +37,15 @@ public class WebSocketEditorServer {
context = new SpiderWebSocketContext(session); context = new SpiderWebSocketContext(session);
context.setDebug(isDebug); context.setDebug(isDebug);
context.setRunning(true); context.setRunning(true);
context.setFlowId(event.getString("flowId")); String flowId = event.getString("flowId");
if(StrUtil.isBlank(flowId)){
context.write(new WebSocketEvent<>("error", "flowId不能为空!"));
}
context.setFlowId(flowId);
// new Thread(() -> { // new Thread(() -> {
String xml = event.getString("message"); String xml = event.getString("message");
if (xml != null) { if (xml != null) {
spider.runWithTest(SpiderFlowUtils.loadXMLFromString(xml), context); spider. runWithTest(SpiderFlowUtils.loadXMLFromString(xml), context);
context.write(new WebSocketEvent<>("finish", null)); context.write(new WebSocketEvent<>("finish", null));
} else { } else {
context.write(new WebSocketEvent<>("error", "xml不正确!")); context.write(new WebSocketEvent<>("error", "xml不正确!"));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment