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 @@
+
+ + @@ -109,6 +112,7 @@
+
Excel-Sheet
@@ -176,8 +180,9 @@
-
+ +
@@ -187,36 +192,91 @@
+
+
+
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(); + } }