diff --git a/pom.xml b/pom.xml
index 349c0b9..71c2e7f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
org.redkale
redkale
- 1.9.9
+ 2.0.0.alpha1
diff --git a/root/api/db.js b/root/api/db.js
index 4900d7c..ec6d58c 100644
--- a/root/api/db.js
+++ b/root/api/db.js
@@ -3,8 +3,8 @@ const db = {
console.log(dbAccount)
return red.postX('/_db/catalog_list', {dbAccount: JSON.stringify(dbAccount), dbPlatId})
},
- tableList({dbPlatId, catalog}) { // 数据库表列表
- return red.postX('/_db/table_list', {dbPlatId, catalog})
+ tableList({dbPlatId, catalogs}) { // 数据库表列表
+ return red.postX('/_db/table_list', {dbPlatId, catalogs: JSON.stringify(catalogs)})
},
tableInfo({dbPlatId, catalog, tableName}) {
return red.postX('/_db/table_info', {dbPlatId, catalog, tableName})
diff --git a/root/api/table.js b/root/api/table.js
new file mode 100644
index 0000000..ea6033c
--- /dev/null
+++ b/root/api/table.js
@@ -0,0 +1,15 @@
+const table = {
+ _sheets({cate, filePath, dbAccount, dbPlatId, catalogs}) {
+ return red.postX('/_table/sheets',{cate, filePath, dbAccount, dbPlatId, catalogs})
+ },
+ sheetsExcel({filePath}) {
+ return table._sheets({cate: "excel", filePath})
+ },
+ sheetMySql({dbPlatId, catalogs}) {
+ return table._sheets({cate: "mysql", dbPlatId, catalogs: JSON.stringify(catalogs)})
+ },
+
+ saveTable({dbPlatId, catalog, tableArr}) {
+ return red.postX('/_table/table_save', {dbPlatId, catalog, tableArr: JSON.stringify(tableArr)})
+ }
+}
\ No newline at end of file
diff --git a/root/index.html b/root/index.html
index 330113f..eaf3cec 100644
--- a/root/index.html
+++ b/root/index.html
@@ -93,6 +93,7 @@
+
@@ -135,7 +136,8 @@
]
},
{name: "关于", url: "/single", nodes: [
- {url:"/single/about.html", name:"关于", icon:"icon-server"},
+ {url:"/single/about.html", name:"关于MetaKit", icon:"icon-server"},
+ {url:"/single/code.html", name:"整体实现", icon:"icon-server"},
{url:"/single/metaFlow.html", name:"MetaKit使用", icon:"icon-server"},
]
},
@@ -168,7 +170,7 @@
},
showInfo() {
- if (red.getData('userName') === 'root') {
+ if (red.getData('userName') === 'root' || red.getData('userName') === 'admin') {
$('#main .info').show()
}
},
@@ -201,7 +203,7 @@
var h = document.documentElement.clientHeight || document.body.clientHeight;
$("#left").attr("style", "height:" + (h - 50) + "px");
$("#main").attr("style", "height:" + (h - 90) + "px; overflow: auto;");
-
+ $(".sheet-cell").attr("style", "height:" + (h - 265) + "px;margin-bottom:20px;");
}
autoLeftHeight();
$(window).resize(function () {
diff --git a/root/metadata/metatable/import.html b/root/metadata/metatable/import.html
index 9fea4d2..05a0b32 100644
--- a/root/metadata/metatable/import.html
+++ b/root/metadata/metatable/import.html
@@ -56,17 +56,20 @@
+
+
+
+
Excel-Sheet
@@ -176,8 +180,9 @@
-
+
+
+
+
+
DB-Table
+
+
已选择 个实体待导入
+
+
+
Table-Detail
+
+
+
+
+ 表名称: ,中文名:
+
+
+
+ | 字段名 |
+ 中文名 |
+ 数据类型 |
+
+
+
+
+
+ |
+ |
+ |
+
+
+
+
+
+
+
+
-
+
+
-
\ No newline at end of file
diff --git a/src/main/java/net/tccn/base/Kv.java b/src/main/java/net/tccn/base/Kv.java
index 6635707..ff970eb 100644
--- a/src/main/java/net/tccn/base/Kv.java
+++ b/src/main/java/net/tccn/base/Kv.java
@@ -218,10 +218,8 @@ public class Kv
extends LinkedHashMap {
Object obj = null;
try {
obj = clazz.newInstance();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
+ } catch (InstantiationException | IllegalAccessException e) {
+ new IllegalArgumentException("创建对象实列失败", e); // 检查clazz是否有无参构造
}
for (String k : (Set)map.keySet()) {
diff --git a/src/main/java/net/tccn/base/MetaKit.java b/src/main/java/net/tccn/base/MetaKit.java
index 74795dd..51aea9d 100644
--- a/src/main/java/net/tccn/base/MetaKit.java
+++ b/src/main/java/net/tccn/base/MetaKit.java
@@ -10,6 +10,7 @@ import net.tccn.meta.MetaService;
import net.tccn.meta.MetaTable;
import net.tccn.plat.DbPlat;
import net.tccn.plat.SysPlat;
+import org.redkale.util.Comment;
import java.util.*;
import java.util.function.BiFunction;
@@ -470,6 +471,12 @@ public class MetaKit {
return dbAccount.get();
}
+ @Comment("通过平台token 得到平台id")
+ public static String getPlatId(String platToken) { //
+ Optional plat = sysPlats.stream().filter(x -> x.getToken().equals(platToken)).findAny();
+ return plat.get().getKey();
+ }
+
public String nextAlias(String x) {
return next(x, "");
}
diff --git a/src/main/java/net/tccn/dbq/Field.java b/src/main/java/net/tccn/dbq/Field.java
index e20ab76..4d83950 100644
--- a/src/main/java/net/tccn/dbq/Field.java
+++ b/src/main/java/net/tccn/dbq/Field.java
@@ -1,5 +1,7 @@
package net.tccn.dbq;
+import net.tccn.dbq.table.Column;
+
/**
* @author: liangxianyou at 2018/10/17 17:24.
*/
@@ -11,6 +13,7 @@ public class Field {
private String inType;
private String inExt;
+ public Field() {}
//============== getter/setter =============
public String getName() {
@@ -92,6 +95,15 @@ public class Field {
return InType.SELECT_EXT.name.equalsIgnoreCase(inType);
}
+ public static Field toAs(Column column) {
+ Field _bean = new Field();
+ _bean.setName(column.getField());
+ _bean.setType(column.getType());
+ _bean.setLabel(column.getComment());
+
+ return _bean;
+ }
+
@Override
public boolean equals(Object name) {
return (this.name == null && name == null) || this.name.equals(name);
diff --git a/src/main/java/net/tccn/dbq/jdbc/JdbcService.java b/src/main/java/net/tccn/dbq/jdbc/JdbcService.java
index 44e45d3..3cf1e16 100644
--- a/src/main/java/net/tccn/dbq/jdbc/JdbcService.java
+++ b/src/main/java/net/tccn/dbq/jdbc/JdbcService.java
@@ -125,7 +125,7 @@ public class JdbcService {
connection.setCatalog(table.getCatalog());
}
- String tableDdl = table.getTableDdl();
+ String tableDdl = ""; // table.getTableDdl();
System.out.println(tableDdl);
try (PreparedStatement ps = connection.prepareStatement(tableDdl)) {
return ps.execute();
diff --git a/src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java b/src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java
index f1796a1..7b44826 100644
--- a/src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java
+++ b/src/main/java/net/tccn/dbq/jdbc/api/DbSourceMysql.java
@@ -137,9 +137,6 @@ public class DbSourceMysql implements DbSource {
System.out.println("创建新的连接:" + x);
} else {
conn = queue.take();
- if (conn != null) {
- System.out.println("获取已有连接" + conn);
- }
}
} catch (SQLException | InterruptedException e) {
if (e instanceof InterruptedException) {
@@ -167,7 +164,7 @@ public class DbSourceMysql implements DbSource {
if (connection != null) {
queue.put(connection);
conns.put(accountKey, queue);
- System.out.println("还回连接:" + connection);
+ //System.out.println("还回连接:" + connection);
}
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/src/main/java/net/tccn/dbq/table/Column.java b/src/main/java/net/tccn/dbq/table/Column.java
index 66d5b95..6a31624 100644
--- a/src/main/java/net/tccn/dbq/table/Column.java
+++ b/src/main/java/net/tccn/dbq/table/Column.java
@@ -56,5 +56,4 @@ public class Column {
public void setNull(String notNull) {
this.notNull = "NO".equalsIgnoreCase(notNull) ? true : false;
}
-
}
diff --git a/src/main/java/net/tccn/dbq/table/Table.java b/src/main/java/net/tccn/dbq/table/Table.java
index 41abcf5..c836941 100644
--- a/src/main/java/net/tccn/dbq/table/Table.java
+++ b/src/main/java/net/tccn/dbq/table/Table.java
@@ -1,6 +1,7 @@
package net.tccn.dbq.table;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -11,8 +12,9 @@ public class Table {
private String catalog; //库名称
private String name; //表名称
private String comment; //表备注
- private List columns; //表的字段列
+ private List columns = new ArrayList<>(); //表的字段列
+ public Table() {}
public Table(String name, String comment) {
this.name = name;
this.comment = comment;
@@ -55,7 +57,7 @@ public class Table {
//------------------------------
//Dev
- public String getTableDdl() {
+ public String _getTableDdl() {
StringBuilder buf = new StringBuilder();
buf.append("CREATE TABLE " + name + "(");
diff --git a/src/main/java/net/tccn/meta/MetaTable.java b/src/main/java/net/tccn/meta/MetaTable.java
index 8628b61..4c058b9 100644
--- a/src/main/java/net/tccn/meta/MetaTable.java
+++ b/src/main/java/net/tccn/meta/MetaTable.java
@@ -6,6 +6,7 @@ import net.tccn.dbq.Field;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.List;
+import java.util.stream.Collectors;
/**
* 元数据
@@ -24,6 +25,7 @@ public class MetaTable extends Doc implements Serializable {
private String dbPlatId; //所属数据平台
private String catalog; //所在database
+ private Integer hv;//临时
//=============== getter/setter ============
public String getName() {
@@ -81,4 +83,25 @@ public class MetaTable extends Doc implements Serializable {
public void setCatalog(String catalog) {
this.catalog = catalog;
}
+
+ public Integer getHv() {
+ return hv;
+ }
+
+ public void setHv(Integer hv) {
+ this.hv = hv;
+ }
+
+ // ------------------------------------------------
+ public static MetaTable toAs(net.tccn.dbq.table.Table table) {
+ List fields = table.getColumns().stream().map(Field::toAs).collect(Collectors.toList());
+
+ MetaTable _bean = new MetaTable();
+ _bean.setName(table.getName());
+ _bean.setComment(table.getComment());
+ _bean.setCatalog(table.getCatalog());
+ _bean.setItems(fields);
+
+ return _bean;
+ }
}
diff --git a/src/main/java/net/tccn/meta/_DbService.java b/src/main/java/net/tccn/meta/_DbService.java
index 414a996..ff83fdb 100644
--- a/src/main/java/net/tccn/meta/_DbService.java
+++ b/src/main/java/net/tccn/meta/_DbService.java
@@ -37,13 +37,13 @@ public class _DbService extends BaseService {
}
@RestMapping(name = "table_list", comment = "数据库表列表")
- public JBean tableList(DbAccount dbAccount, String dbPlatId, String[] catalogs) {
- JBean jBean = new JBean();
+ public List tableList(DbAccount dbAccount, String dbPlatId, String[] catalogs) {
+
DbKit dbKit = MetaKit.getDbKit(dbPlatId);
StringBuffer sqlBuf = new StringBuffer("SELECT TABLE_NAME 'name',TABLE_COMMENT 'comment',table_schema 'catalog' FROM INFORMATION_SCHEMA.TABLES");
if (catalogs != null && catalogs.length > 0) {
- sqlBuf.append("WHERE TABLE_SCHEMA in (");
+ sqlBuf.append(" WHERE TABLE_SCHEMA in (");
for (String catalog : catalogs) {
sqlBuf.append("'").append(catalog).append("',");
}
@@ -52,7 +52,7 @@ public class _DbService extends BaseService {
}
List list = dbKit.findList(sqlBuf.toString(), Table.class);
- return jBean.setBody(list);
+ return list;
}
@RestMapping(name = "table_info", comment = "数据库表详情")
@@ -62,7 +62,7 @@ public class _DbService extends BaseService {
DbKit dbKit = MetaKit.getDbKit(dbPlatId);
String sql = String.format("SELECT TABLE_NAME 'name',TABLE_COMMENT 'comment',table_schema 'catalog' FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME='%s'", tableName);
- String columnSql = String.format("SHOW FULL COLUMNS FROM '%s.%s'", catalog, tableName);
+ String columnSql = String.format("SHOW FULL COLUMNS FROM %s.`%s`", catalog, tableName);
CompletableFuture tableFuture = CompletableFuture.supplyAsync(() -> dbKit.findfirst(sql, Table.class));
CompletableFuture> columnFuture = CompletableFuture.supplyAsync(() -> dbKit.findList(columnSql, Column.class));
@@ -70,7 +70,9 @@ public class _DbService extends BaseService {
try {
Table table = tableFuture.get();
table.setColumns(columnFuture.get());
- jBean.setBody(table);
+
+ //jBean.setBody(table);
+ jBean.setBody(MetaTable.toAs(table)); //todo: 将此转换提取到 单独方法中<依据六边形架构原则>
} catch (InterruptedException | ExecutionException e) {
jBean.set(-1, "查询表信息失败");
new IllegalArgumentException("查询表信息失败", e);
@@ -88,4 +90,12 @@ public class _DbService extends BaseService {
return jBean;
}
+
+ @RestMapping(ignore = true, comment = "查询表信息")
+ public List tableList(String dbPlatId, String catalog, String ... tables) {
+ //todo:
+
+
+ return null;
+ }
}
diff --git a/src/main/java/net/tccn/meta/_TableService.java b/src/main/java/net/tccn/meta/_TableService.java
new file mode 100644
index 0000000..e7fda9a
--- /dev/null
+++ b/src/main/java/net/tccn/meta/_TableService.java
@@ -0,0 +1,131 @@
+package net.tccn.meta;
+
+import net.tccn.base.JBean;
+import net.tccn.base.Kv;
+import net.tccn.dbq.jdbc.api.DbAccount;
+import net.tccn.dbq.table.Table;
+import net.tccn.service.BaseService;
+import net.tccn.service._FileService;
+import org.redkale.net.http.RestMapping;
+import org.redkale.net.http.RestParam;
+import org.redkale.net.http.RestService;
+import org.redkale.util.Comment;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+/**
+ * 元数据实体管理
+ * 1、实体导入,
+ * 2、实体信息维护
+ * 3、数据库表管理
+ */
+@RestService(automapping = true, comment = "元数据实体管理")
+public class _TableService extends BaseService {
+
+ @Resource
+ _FileService fileService;
+ @Resource
+ _DbService dbService;
+
+
+ @RestMapping(name = "sheets", comment = "导入选择列表数据准备")
+ public JBean sheets(String cate, //类型
+ //excel {文件地址}
+ String filePath,
+
+ //mysql {数据库连接账号、数据源id、数据库database数组}
+ DbAccount dbAccount, String dbPlatId, String[] catalogs,
+ @RestParam(name = "platToken") String token) {
+
+ JBean jBean = new JBean();
+
+ if ("excel".equals(cate)) {
+ jBean.setBody(fileService.data(filePath, token));
+
+ } else if ("mysql".equals(cate)){
+ List list = dbService.tableList(dbAccount, dbPlatId, catalogs);
+
+ String[] tableArr = list.stream().map(Table::getName).toArray(String[]::new);
+ CompletableFuture> hvFuture = tableExist(tableArr, token);
+
+ try {
+ List _hv = hvFuture.get();
+
+ List sheets = new ArrayList<>();
+ list.forEach(x -> {
+ MetaTable bean = MetaTable.toAs(x);
+ bean.setHv(_hv.contains(x.getName()) ? 1 : 0);
+ sheets.add(bean);
+ });
+
+ //对数据分组后返回
+ Kv data = Kv.of();
+ sheets.forEach(x -> data.set(x.getName(), x));
+
+ jBean.setBody(data);
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+
+ return jBean;
+ }
+
+
+ /*public JBean tableInfo(DbAccount dbAccount,
+ String dbPlatId, String catalog, String tableName) {
+
+ dbService.tableInfo(dbAccount, dbPlatId, catalog, tableName)
+
+ return null;
+ }*/
+
+ @RestMapping(name = "table_save", comment = "保存数据源实体到元数据实体表")
+ public void tableSave(String dbPlatId,
+ String catalog,
+ String[] tableArr,
+ @RestParam(name = "platToken") String token) {
+
+ CompletableFuture> hvfuture = tableExist(tableArr, token);
+ List tables = dbService.tableList(dbPlatId, catalog, tableArr);
+
+ try {
+ List hvs = hvfuture.get();
+ tables.forEach(t -> {
+ if (!hvs.contains(t.getName())) {
+ MetaTable metaTable = MetaTable.toAs(t);
+ metaTable.setCatalog(catalog);
+ metaTable.setDbPlatId(dbPlatId);
+ metaTable.setAlias("");//todo: 表别名
+
+ //保存数据到元数据表
+ metaTable.save();
+ }
+ });
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Comment("查询元数据中存在的表")
+ private CompletableFuture> tableExist(String[] tableArr, String token) {
+ return CompletableFuture.supplyAsync(() -> {
+ StringBuffer buf = new StringBuffer();
+ buf.append("for d in MetaTable\n" +
+ " filter d.name in [");
+ for (String x : tableArr) {
+ buf.append("'").append(x).append("',");
+ }
+ buf.deleteCharAt(buf.length() - 1);
+ buf.append("] and d.sysPlatId=='" + platId(token) + "'\n" +
+ " return d.name");
+ List hv = MetaTable.dao.find(buf.toString(), String.class); //在元数据中已经存在的sheet
+ return hv;
+ });
+ }
+}
diff --git a/src/main/java/net/tccn/service/BaseService.java b/src/main/java/net/tccn/service/BaseService.java
index 8348c69..d4e9cd0 100644
--- a/src/main/java/net/tccn/service/BaseService.java
+++ b/src/main/java/net/tccn/service/BaseService.java
@@ -2,6 +2,7 @@ package net.tccn.service;
import com.arangodb.Predicate;
import com.google.gson.Gson;
+import net.tccn.base.MetaKit;
import org.redkale.net.http.RestMapping;
import org.redkale.service.Service;
import org.redkale.source.CacheSource;
@@ -88,4 +89,8 @@ public class BaseService implements Service {
return prop.getProperty(k);
}
+ public String platId(String token) {
+ return MetaKit.getPlatId(token);
+ }
+
}
diff --git a/src/main/java/net/tccn/service/DataService.java b/src/main/java/net/tccn/service/DataService.java
index 7ffa92e..932e8ac 100644
--- a/src/main/java/net/tccn/service/DataService.java
+++ b/src/main/java/net/tccn/service/DataService.java
@@ -23,7 +23,7 @@ public class DataService extends BaseService {
private MetadataService metadataService;
- @RestMapping(name = "list", comment = "数据分页列表")
+ @RestMapping(name = "list", auth = false, comment = "数据分页列表")
public JBean findList(FBean fBean, @RestParam(name = "platToken") String token) {
JBean jBean = new JBean();
try {
diff --git a/src/test/java/RunTest.java b/src/test/java/RunTest.java
index b98df81..9ad8fdf 100644
--- a/src/test/java/RunTest.java
+++ b/src/test/java/RunTest.java
@@ -1,12 +1,13 @@
import com.google.gson.Gson;
import net.tccn.base.Kv;
+import net.tccn.base.MetaKit;
import net.tccn.dbq.fbean.FBean;
-import net.tccn.dbq.parser.ParseMysql;
import net.tccn.dbq.jdbc.api.DbAccount;
import net.tccn.dbq.jdbc.api.DbKit;
-import net.tccn.base.MetaKit;
+import net.tccn.dbq.parser.ParseMysql;
import net.tccn.qtask.QRuner;
import net.tccn.qtask.Task;
+import net.tccn.user.User;
import org.junit.Test;
import java.util.Date;
@@ -138,5 +139,15 @@ public class RunTest {
System.out.println(xx);
}
+ //@Test
+ public void userCreate() {
+ User user = new User();
+ user.setUsername("admin");
+ user.setCreateTime(System.currentTimeMillis());
+ user.setPwd(User.md5IfNeed("123456"));
+ user.setStatus(1);
+
+ user.save();
+ }
}