This commit is contained in:
2023-10-27 00:11:38 +08:00
parent 31e08a2028
commit f7de0a9349
40 changed files with 431 additions and 194 deletions

View File

@@ -18,14 +18,14 @@
<dependency>
<groupId>org.redkale</groupId>
<artifactId>redkale</artifactId>
<version>2.7.0</version>
<version>2.8.0.dev</version>
</dependency>
<dependency>
<!--<dependency>
<groupId>org.redkalex</groupId>
<artifactId>redkale-plugins</artifactId>
<version>2.7.0</version>
</dependency>
</dependency>-->
<!-- mysql连接 -->
<dependency>

View File

@@ -11,7 +11,7 @@
<body id="home">
<div class="container-fluid">
<row>
<div class="col-md-12" id="top">
<div class="col-md-12 col-xs-12" id="top">
<div class="logo">
<h1>Meta-Kit</h1>
</div>
@@ -42,7 +42,7 @@
</div>
<div id="mainDiv">
<div class="col-md-1" id="left">
<div class="col-md-1 col-xs-1" id="left">
<nav class="menu" data-ride="menu">
<ul class="nav nav-primary">
<li class="active show nav-parent" style="width: 100%;">
@@ -58,7 +58,7 @@
</ul>
</nav>
</div>
<div class="col-md-11">
<div class="col-md-11 col-xs-11">
<!--<div style="height: 40px;background-color: #fff;"></div>-->
<!-- load main body to here -->
<div id="main"></div>

View File

@@ -23,7 +23,7 @@
</div>
<!-- 业务列表 -->
<div class="col-md-2">
<div class="col-xs-2">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 业务列表(Meta-Service)</div>
<ul class="nav nav-tabs nav-stacked tlist" style="height: 100%">
<li :class="['clearfix',{'active':service==item.alias}]" v-for="item in services" >
@@ -33,8 +33,8 @@
</div>
<!-- 预览功能 -->
<div class="col-md-10">
<div class="col-md-4 pull-right">
<div class="col-xs-10">
<div class="col-xs-4 pull-right">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default" type="button">添加过滤条件</button>
@@ -54,7 +54,7 @@
<div class="clearfix"></div>
<!-- 过滤条件 -->
<div class="col-lg-4 col-md-6" v-for="(filter,index) in cfg.filters" v-if="filter.checked">
<div class="col-lg-4 col-xs-6" v-for="(filter,index) in cfg.filters" v-if="filter.checked">
<div class="input-group item" style="padding-top: 3px">
<span class="input-group-addon" style="max-width: 130px;">{{filter.label}}</span>
<select class="form-control" v-model="filter['type']" style="width: 95px;">
@@ -75,12 +75,12 @@
</div>
<!-- 数据表格 -->
<div class="col-md-12" style="padding-top: 10px;overflow:auto;">
<div class="col-xs-12" style="padding-top: 10px;overflow:auto;">
<table class="table table-bordered table-hover" style="width: 100%">
<thead>
<tr>
<!-- 'sort':field.order>0 -->
<th>操作</th>
<!--<th>操作</th>-->
<th v-for="field in cfg.shows"
v-if="field.inType != 'HIDDEN'"
v-text="field.label || getFieldLabel(field.col)"
@@ -93,11 +93,11 @@
<!--
<td v-for="field in cfg.shows" v-title="dealFieldFmt(row, field.col)" v-text="dealFieldFmt(row, field.col)"></td>
-->
<td>
<!--<td>
<a href="javascript:;" @click="detailData=row; detail()">详情</a>
<a href="javascript:;" @click="detailData=row; edit()">编辑</a>
<a href="javascript:;" @click="detailData=row; del()">删除</a>
</td>
</td>-->
<td v-for="field in cfg.shows"
v-if="field.inType != 'HIDDEN'"
v-title="dealFieldFmt(row, field)"

View File

@@ -23,7 +23,7 @@
</div>
</div>
<div class="col-xs-2 sheet-cell">
<div class="col-md-3 col-xs-4 sheet-cell">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 实体表(Meta-Table)</div>
<ul class="nav nav-tabs nav-stacked tlist" style="height: 100%">
<li :class="[{'active': aliasA == item.alias}]" v-for="item in tables" >
@@ -32,7 +32,7 @@
</ul>
<!--<p v-show="ckTable && ckTable.length">已选择 <code v-text="ckTable.length||0"></code> 个实体待导入</p>-->
</div>
<div class="col-xs-10">
<div class="col-md-9 col-xs-8">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 已关联的表 </div>
<!-- 关联表列表 -->
<button v-for="link in linkInfos" @click="aliasB=link.alias" :class="['btn', {'btn-primary' :aliasB==link.alias}]" style="margin: 5px">

View File

@@ -22,7 +22,7 @@
}*/
</style>
<row class="meta-service">
<div class="col-md-12">
<div class="col-xs-12">
<div class="info" style="padding-left: 10px">
<a @click="showInfo()" href="javascript:;"><i class="icon icon-info"></i></a>
</div>
@@ -123,7 +123,7 @@
</div>
</div>
<div class="col-md-2">
<div class="col-xs-2">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 业务相关表</div>
<ul class="nav nav-tabs nav-stacked tlist">
<li @click="sheet=item" :class="[{active: sheet==item }]" v-for="item in sheetArr">
@@ -133,7 +133,7 @@
</div>
<!-- 实体字段信息 -->
<div class="col-md-4" style="padding-left: 0px;">
<div class="col-xs-4" style="padding-left: 0px;">
<div style="padding-left: 10px;background-color: #ccc;"> 字段信息</div>
<table class="table table-bordered">
<tr>
@@ -164,7 +164,7 @@
</table>
</div>
<div class="col-md-6" style="padding-left: 0px;padding-right: 0px;">
<div class="col-xs-6" style="padding-left: 0px;padding-right: 0px;">
<!-- shows -->
<div id="show" v-show="status==5">
<div style="padding-left: 10px;background-color: #ccc;"> 列表配置</div>

View File

@@ -195,7 +195,7 @@
<div class="row" v-show="tableName">
<div class="col-xs-2 sheet-cell">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> DB-Table</div>
<ul class="nav nav-tabs nav-stacked tlist" style="height: 100%">
<ul class="nav nav-tabs nav-stacked tlist" style="height: 90%">
<li class="checkbox-inline clearfix" v-for="item in tableArr" >
<!-- || tableData[item]['hv']==1 -->
<input type="checkbox"

View File

@@ -20,7 +20,7 @@
</div>
</div>
<div class="col-md-12">
<div class="col-md-12 col-xs-12">
<div class="input-group list-head">
<div class="pull-left">
<span class="input-group-btn">
@@ -51,7 +51,7 @@
</div>
<!-- 实体列表 -->
<div class="col-md-2">
<div class="col-md-3 col-xs-4">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 实体表(Meta-Table)</div>
<ul class="nav nav-tabs nav-stacked tlist" style="height: 100%">
<li :class="['clearfix',{'active':alias==item.alias}]" v-for="item in tables" >
@@ -60,7 +60,7 @@
</ul>
</div>
<div class="col-md-10">
<div class="col-md-9 col-xs-8">
<!-- 实体属性列表 -->
<div class="panel" v-show="status!=7 && status!=8">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 实体字段信息</div>

View File

@@ -2,7 +2,7 @@
<div class="col-md-12">
<h3>QTask - [测试用例]</h3>
</div>
<div class="col-md-6">
<div class="col-xs-6">
<div class="input-group">
<span class="input-group-btn">
<a href="javascript:;" class="btn" type="button"> 选择QTask任务</a>
@@ -57,7 +57,7 @@
<button @click="query(row)" type="button" class="btn btn-primary">RUN</button>
</div>
</div>
<div class="col-md-6">
<div class="col-xs-6">
<h5>查询结果:</h5>
<pre class="layui-code" v-show="result" v-text="result"></pre>
</div>

View File

@@ -60,9 +60,9 @@ public class BaseServlet extends HttpServlet {
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With")) || (accept != null && accept.contains("application/json"))) {
response.finish(JBean.by(-2, "未登陆"));
} else {
response.setStatus(302);
//response.setStatus(302);
response.setHeader("location", "/user/login.html");
response.finish();
response.finish304();
}
return;
}

View File

@@ -1,21 +1,26 @@
package net.tccn.base;
import org.redkale.convert.json.JsonConvert;
import javax.persistence.Id;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Created by liangxianyou@eversec.cn at 2018/3/12 14:17.
*/
public class Kv<K, V> extends LinkedHashMap<K, V> {
protected static final JsonConvert convert = JsonConvert.root();
public static Kv of() {
return new Kv();
}
@@ -24,6 +29,16 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
return new Kv().set(k, v);
}
private static Predicate<Class> isNumber = (t) -> {
return t == Integer.class || t == int.class
|| t == Long.class || t == long.class
|| t == Float.class || t == float.class
|| t == Double.class || t == double.class
|| t == Short.class || t == short.class
|| t == Byte.class || t == byte.class
;
};
public Kv<K, V> set(K k, V v) {
put(k, v);
return this;
@@ -34,9 +49,30 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
return this;
}
public static Kv filter(Map<String, String> map, String... fields) {
Kv kv = Kv.of();
if (fields == null || fields.length == 0 || map == null) {
return kv;
}
for (String field : fields) {
if (field.contains("->")) {
String[] arr = field.split("->");
kv.put(arr[1], map.get(arr[0]));
continue;
}
kv.put(field, map.get(field));
}
return kv;
}
// 将obj 属性映射到Kv 中
public static Kv toKv(Object m, String... fields) {
Kv kv = Kv.of();
if (m == null) {
return kv;
}
Stream.of(fields).forEach(field -> {
String filedT = field;
String filedS = field;
@@ -48,7 +84,7 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
filedS = arr[1];
}
Method method = m.getClass().getDeclaredMethod("get" + Utils.toUpperCaseFirst(filedS));
Method method = m.getClass().getMethod("get" + Utils.toUpperCaseFirst(filedS));
if (method != null) {
kv.set(filedT, method.invoke(m));
}
@@ -64,24 +100,8 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
return toKv(m, Kv.of(), m.getClass());
}
private static Kv toKv(Object m, Kv kv, Class clazz) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
if (!kv.containsKey(field.getName())) {
kv.set(field.getName(), field.get(m));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Class superclass = clazz.getSuperclass();
if (superclass != null) {
kv = toKv(m, kv, superclass);
}
return kv;
public static <T> List<Kv> toKv(Collection<T> datas, String... fields) {
return datas.stream().map(x -> toKv(x, fields)).collect(Collectors.toList());
}
public <T> T toBean(Class<T> type) {
@@ -93,28 +113,65 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
return s.substring(0, 1).toUpperCase() + s.substring(1);
};
private static Predicate<Class> isNumber = (t) -> {
return t == Integer.class || t == int.class
|| t == Long.class || t == long.class
|| t == float.class || t == Float.class
|| t == Double.class || t == double.class
|| t == Short.class || t == short.class
|| t == Byte.class || t == byte.class
;
};
private static Kv toKv(Object m, Kv kv, Class clazz) {
if (m instanceof Map) {
kv.putAll((Map) m);
return kv;
}
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (!method.getName().startsWith("get") || method.getParameterCount() > 0 || "getClass".equals(method.getName()))
continue;
String k = toLowerCaseFirst(method.getName().replaceFirst("get", ""));
if (!kv.containsKey(k) || Utils.isEmpty(kv.get(k))) {
try {
kv.set(k, method.invoke(m));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
for (Field field : clazz.getDeclaredFields()) {
if (field.getAnnotation(Id.class) != null) {
try {
field.setAccessible(true);
kv.set("_id", field.get(m));
break;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
Class superclass = clazz.getSuperclass();
if (superclass != null) {
kv = toKv(m, kv, superclass);
}
return kv;
}
public static <T> T toAs(Object v, Class<T> clazz) {
if (v == null) {
return null;
} else if (v.getClass() == clazz) {
} else if (v.getClass() == clazz) { // 类型一致返回
return (T) v;
} else if (clazz == String.class) {
} else if (clazz == String.class) { // 目标类型 Sting
return (T) String.valueOf(v);
} else if (clazz == Kv.class) { // 目标类型 Kv
return (T) Kv.toKv(v);
} else if (clazz.isInstance(v)) {
return clazz.cast(v);
} else if (v instanceof Map) { // 源类型 Map
return Kv.toBean((Map) v, clazz);
}
Object v1 = v;
try {
if (v.getClass() == Long.class) {//多种数值类型的处理: Long => x
switch (clazz.getSimpleName()) {
case "int", "Integer" -> v1 = (int) (long) v;
@@ -168,19 +225,21 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
}
public static <T> T toBean(Map map, Class<T> clazz) {
//按照方法名 + 类型寻找,
//按照方法名 + 类型寻找
//按照方法名 寻找
//+
Object obj = null;
try {
obj = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
obj = clazz.getDeclaredConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException |
NoSuchMethodException e) {
new IllegalArgumentException("创建对象实列失败", e); // 检查clazz是否有无参构造
}
for (String k : (Set<String>) map.keySet()) {
Object v = map.get(k);
if (v == null) continue;
//寻找method
try {
String methodName = "set" + upFirst.apply(k);
Class tClazz = null;
@@ -212,8 +271,8 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
method.invoke(obj, toAs(v, tClazz));
}
//没有方法,找属性注解
if (method == null) {
//没有方法找属性注解
/*if (method == null) {
Field field = null;
Field[] fields = clazz.getDeclaredFields();
for (Field _field : fields) {
@@ -229,7 +288,7 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
field.setAccessible(true);
field.set(obj, toAs(v, tClazz));
}
}
}*/
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
@@ -238,5 +297,65 @@ public class Kv<K, V> extends LinkedHashMap<K, V> {
return (T) obj;
}
/**
* 将字符串第一个字母转大写
*
* @param str 待转换字符串
* @return
*/
public static String toUpperCaseFirst(String str) {
Objects.requireNonNull(str);
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
/**
* 将字符串第一个字母转小写
*
* @param str 待转换字符串
* @return
*/
public static String toLowerCaseFirst(String str) {
Objects.requireNonNull(str);
return str.substring(0, 1).toLowerCase() + str.substring(1);
}
public String toString() {
return convert.convertTo(this);
}
public int getInt(String key) {
return toAs(get(key), int.class);
}
public int getInt(String key, int defaultValue) {
V v = get(key);
if (v == null) {
return defaultValue;
}
return toAs(v, int.class);
}
public long getLong(String key) {
return toAs(get(key), Long.class);
}
public long getLong(String key, long defaultValue) {
V v = get(key);
if (v == null) {
return defaultValue;
}
return toAs(v, long.class);
}
public String getStr(String key) {
return toAs(get(key), String.class);
}
public String getStr(String key, String defaultValue) {
V v = get(key);
if (v == null) {
return defaultValue;
}
return toAs(v, String.class);
}
}

View File

@@ -1,10 +1,11 @@
package net.tccn.base;
import net.tccn.base.dbq.jdbc.api.DbSource;
import net.tccn.base.dbq.jdbc.api.DbSourceMysql;
import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -112,4 +113,102 @@ public class Utils {
return false;
}
public static String fmt36(int n) {
return Integer.toString(n, 36);
}
public static String fmt36(long n) {
return Long.toString(n, 36);
}
public static <T, V> Map<T, V> toMap(Collection<V> list, Function<V, T> fun) {
Map<T, V> map = new HashMap<>(list.size());
for (V v : list) {
if (v == null) {
continue;
}
map.put(fun.apply(v), v);
}
return map;
}
public static <T, V, T2> Map<T, T2> toMap(Collection<V> list, Function<V, T> fun, Function<V, T2> fun2) {
Map<T, T2> map = new HashMap<>(list.size());
for (V v : list) {
if (v == null) {
continue;
}
map.put(fun.apply(v), fun2.apply(v));
}
return map;
}
public static <T, V> List<V> toList(Collection<T> list, Function<T, V> fun) {
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
List<V> list1 = new ArrayList<>();
list.forEach(x -> list1.add(fun.apply(x)));
return list1;
}
public static <T, V> Set<V> toSet(Collection<T> list, Function<T, V> fun) {
if (list == null || list.isEmpty()) {
return new HashSet<>();
}
Set<V> set = new HashSet<>(list.size());
list.forEach(x -> set.add(fun.apply(x)));
return set;
}
public static <T> List<T> filter(Collection<T> list, Predicate<T> predicate) {
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
List<T> list1 = new ArrayList<>(list.size());
list.forEach(x -> {
if (!predicate.test(x)) {
return;
}
list1.add(x);
});
return list1;
}
public static <T, V> List<V> filterToList(Collection<T> list, Predicate<T> predicate, Function<T, V> fun) {
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
List<V> list1 = new ArrayList<>(list.size());
list.forEach(x -> {
if (!predicate.test(x)) {
return;
}
list1.add(fun.apply(x));
});
return list1;
}
public static <T, V> Map<V, List<T>> group(Collection<T> list, Function<T, V> fun) {
if (list == null || list.isEmpty()) {
return new HashMap<>();
}
return list.stream().collect(Collectors.groupingBy(fun));
}
public static <T, V, K> Map<V, List<K>> group(Collection<T> list, Function<T, V> fun, Function<T, K> fun2) {
if (list == null || list.isEmpty()) {
return new HashMap<>();
}
Map<V, List<T>> group = group(list, fun);
Map<V, List<K>> _group = new HashMap<>();
group.forEach((k, v) -> _group.put(k, toList(v, fun2)));
return _group;
}
}

View File

@@ -251,6 +251,7 @@ public abstract class Doc<T extends Doc> {
if (t == null) {
t = (T) this;
}
// arangoSource.createDocument(this);
return db.query(arangoSource.parseAqlCount(t), int.class).first();
}
//ok

View File

@@ -30,7 +30,7 @@ public class DbExecutors {
//System.out.printf("----------------%n countSql:%s%n findSql:%s%n----------------%n", sqls[0], sqls[1]);
CompletableFuture<Integer> countFuture = CompletableFuture.supplyAsync(() -> dbKit.findColumn(sqls[0], int.class));
CompletableFuture<List<Map>> listFuture = CompletableFuture.supplyAsync(() -> dbKit.findList(sqls[1], Map.class));
CompletableFuture<List<Map>> listFuture = CompletableFuture.supplyAsync(() -> dbKit.queryList(sqls[1], Map.class));
List<Map> rows = listFuture.get();
Integer total = countFuture.get();

View File

@@ -1,6 +1,7 @@
package net.tccn.base.dbq.fbean;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@@ -8,7 +9,8 @@ import java.util.List;
* 查询用实体
* @author: liangxianyou at 2018/10/25 14:49.
*/
@Data
@Getter
@Setter
public class FBean {
private String platToken; // 平台token

View File

@@ -1,6 +1,7 @@
package net.tccn.base.dbq.fbean;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@@ -8,7 +9,8 @@ import java.util.List;
* 查询条件实体
* Created by liangxianyou at 2018/12/14 15:34.
*/
@Data
@Getter
@Setter
public class Filter {
private String col;
private String value;

View File

@@ -1,11 +1,13 @@
package net.tccn.base.dbq.fbean;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* Created by liangxianyou at 2018/12/14 15:36.
*/
@Data
@Getter
@Setter
public class Limit {
private int pn;
private int ps;

View File

@@ -1,13 +1,15 @@
package net.tccn.base.dbq.fbean;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* Created by liangxianyou at 2018/12/14 15:36.
*/
@Data
@Getter
@Setter
public class Order {
private String col;
private int desc;//1 or -1

View File

@@ -1,6 +1,7 @@
package net.tccn.base.dbq.jdbc.api;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import org.redkale.convert.ConvertColumn;
@@ -12,7 +13,8 @@ import java.util.List;
*
* @author: liangxianyou at 2018/11/14 12:58.
*/
@Data
@Getter
@Setter
@Table(name = "MetaDb", catalog = "db_meta")
public class DbAccount extends Doc<DbAccount> {
public static DbAccount dao = dao(DbAccount.class);

View File

@@ -61,13 +61,13 @@ public class DbKit implements DbSource {
}
@Override
public <T> List<T> findList(String sql, Class<T> type) {
return dbSource.findList(sql, type);
public <T> List<T> queryList(String sql, Class<T> type) {
return dbSource.queryList(sql, type);
}
@Override
public <T> T findFirst(String sql, Class<T> type) {
return dbSource.findFirst(sql, type);
public <T> T find(String sql, Class<T> type) {
return dbSource.find(sql, type);
}
@Override
@@ -85,20 +85,20 @@ public class DbKit implements DbSource {
dbSource.dropTable(tableName);
}
public void exetute(String sql) {
dbSource.exetute(sql);
public boolean exetute(String sql) {
return dbSource.exetute(sql);
}
// -----------------------------------------
public <T> CompletableFuture<T> findfirstAsync(String sql, Class<T> type) {
return CompletableFuture.supplyAsync(() -> findFirst(sql, type));
public <T> CompletableFuture<T> findAsync(String sql, Class<T> type) {
return CompletableFuture.supplyAsync(() -> find(sql, type));
}
public <T> CompletableFuture<List<T>> findListAsync(String sql, Class<T> type) {
return CompletableFuture.supplyAsync(() -> findList(sql, type));
public <T> CompletableFuture<List<T>> queryListAsync(String sql, Class<T> type) {
return CompletableFuture.supplyAsync(() -> queryList(sql, type));
}
public <T> CompletableFuture<T> queryColumnAsync(String sql, Class<T> type) {
public <T> CompletableFuture<T> findColumnAsync(String sql, Class<T> type) {
return CompletableFuture.supplyAsync(() -> findColumn(sql, type));
}

View File

@@ -13,9 +13,9 @@ public interface DbSource extends IService {
void setDbAccount(DbAccount dbAccount);
void setCatalog(String catelog);
<T> List<T> findList(String sql, Class<T> type);
<T> List<T> queryList(String sql, Class<T> type);
<T> T findFirst(String sql, Class<T> type);
<T> T find(String sql, Class<T> type);
<T> T findColumn(String sql, Class<T> type);
@@ -25,21 +25,21 @@ public interface DbSource extends IService {
//待实现
default <T> void update(String tableName, T t) {}
default int queryInt(String sql) {
default int findInt(String sql) {
return findColumn(sql, int.class);
}
default long queryLong(String sql) {
default long findLong(String sql) {
return findColumn(sql, long.class);
}
default double queryDouble(String sql) {
default double findDouble(String sql) {
return findColumn(sql, double.class);
}
default Date queryDate(String sql) {
default Date findDate(String sql) {
return findColumn(sql, Date.class);
}
void createTable(String sql);
void dropTable(String tableName);
void exetute(String sql);
boolean exetute(String sql);
}

View File

@@ -55,7 +55,7 @@ public class DbSourceMysql implements DbSource {
}
@Override
public <T> List<T> findList(String sql, Class<T> type) {
public <T> List<T> queryList(String sql, Class<T> type) {
Connection connection = connection();
try (
PreparedStatement ps = connection.prepareStatement(sql);
@@ -83,7 +83,7 @@ public class DbSourceMysql implements DbSource {
}
}
}
list.add(Map.class == type ? row : Kv.toBean(row, type));
list.add(Kv.toAs(row, type));
}
return list;
@@ -97,8 +97,8 @@ public class DbSourceMysql implements DbSource {
}
@Override
public <T> T findFirst(String sql, Class<T> type) {
List<T> list = findList(sql, type);
public <T> T find(String sql, Class<T> type) {
List<T> list = queryList(sql, type);
return list.size() > 0 ? list.get(0) : null;
}
@@ -150,12 +150,12 @@ public class DbSourceMysql implements DbSource {
}
@Override
public void exetute(String sql) {
public boolean exetute(String sql) {
Connection connection = connection();
try (
PreparedStatement ps = connection.prepareStatement(sql);
) {
ps.execute();
return ps.execute();
//ps.executeUpdate();
} catch (SQLException e) {
throw new CfgException("SQL 执行失败:", sql);
@@ -166,50 +166,31 @@ public class DbSourceMysql implements DbSource {
//fixme: lxy 处理连接超过8小时失效问题
private Connection connection() {
Connection connection = connection(0);
if (connection != null && catalog != null && !catalog.isEmpty()) {
Connection connection = null;
try {
connection = connection(0);
if (catalog != null && !catalog.isEmpty()) {
connection.setCatalog(catalog); //还回连接的时候是否需要重置catalog 后续观察
} catch (SQLException e) {
e.printStackTrace();
}
} catch (InterruptedException | SQLException e) {
new IllegalArgumentException("获取连接失败", e);
}
return connection;
}
private Connection connection(int n) {
private synchronized Connection connection(int n) throws InterruptedException, SQLException {
LinkedBlockingQueue<Connection> queue = conns.getOrDefault(accountKey, new LinkedBlockingQueue<>(15));
Connection conn = null;
AtomicInteger num = counter.getOrDefault(accountKey, new AtomicInteger(0));
try {
if (queue.size() == 0 && num.get() < 15) {
if (queue.size() == 0 && num.get() < 15) { // 创建总连接数小于15且暂无可用连接
conn = DriverManager.getConnection(dbAccount.getUrl(), dbAccount.getUser(), dbAccount.getPwd());
int x = num.incrementAndGet();
counter.put(accountKey, num);
System.out.println("创建新的连接:" + x);
} else {
conn = queue.take();
if (conn.isClosed()) {
System.out.println("connetion had closed,");
conn = connection(n);
}
}
} catch (SQLException | InterruptedException e) {
if (e instanceof InterruptedException) {
try {
conn = DriverManager.getConnection(dbAccount.getUrl(), dbAccount.getUser(), dbAccount.getPwd());
num.getAndIncrement();
if (conn != null) {
System.out.println("获取连接异常,并重新创建成功");
}
} catch (SQLException ex) {
new IllegalArgumentException("创建连接失败", e);
}
num.getAndIncrement();
counter.put(accountKey, num);
} else {
new IllegalArgumentException("获取连接失败", e);
if (!conn.isValid(5)) {
conn = connection(++n);
}
}
conns.put(accountKey, queue);

View File

@@ -87,7 +87,7 @@ public class ParseMysql implements Parser {
//from
StringBuilder bufFrom = new StringBuilder();
bufFrom.append(" from ").append(metaTable.getCatalog()).append(".`").append(metaTable.getName()).append("` `").append(metaTable.getAlias()).append("`");
bufFrom.append(" from `").append(metaTable.getCatalog()).append("`.`").append(metaTable.getName()).append("` `").append(metaTable.getAlias()).append("`");
//left join
if (!Utils.isEmpty(links)) {
links.forEach(x -> {

View File

@@ -1,6 +1,7 @@
package net.tccn.base.dbq.qtask;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
@@ -8,7 +9,8 @@ import javax.persistence.Table;
/**
* @author: liangxianyou at 2018/11/13 14:59.
*/
@Data
@Getter
@Setter
@Table(name = "DbTask", catalog = "db_meta")
public class DbTask extends Doc<DbTask> {
public static DbTask dao = dao(DbTask.class);

View File

@@ -1,12 +1,14 @@
package net.tccn.base.dbq.table;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* 数据库表的列
* @author: liangxianyou at 2018/10/8 10:59.
*/
@Data
@Getter
@Setter
public class Column {
private String field; //列名称
private String type; //列类型

View File

@@ -1,11 +1,13 @@
package net.tccn.base.dbq.table;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* @author: liangxianyou at 2018/10/17 17:24.
*/
@Data
@Getter
@Setter
public class Field {
private String name;
private String label;

View File

@@ -1,7 +1,8 @@
package net.tccn.base.dbq.table;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@@ -10,7 +11,8 @@ import java.util.List;
* 数据库表.
* @author: liangxianyou at 2018/10/8 10:58.
*/
@Data
@Getter
@Setter
public class Table {
private String catalog; //库名称
private String name; //表名称

View File

@@ -1,6 +1,7 @@
package net.tccn.dict;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
@@ -9,7 +10,8 @@ import java.io.Serializable;
/**
* @author: liangxianyou
*/
@Data
@Getter
@Setter
@Table(name = "Dict", catalog = "db_meta")
public class Dict extends Doc<Dict> implements Serializable {
public static Dict dao = Doc.dao(Dict.class);

View File

@@ -1,6 +1,7 @@
package net.tccn.meta;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.Map;
@@ -8,7 +9,8 @@ import java.util.Map;
/**
* @author: liangxianyou
*/
@Data
@Getter
@Setter
public class Filter {
private String name;
private String label;

View File

@@ -1,13 +1,15 @@
package net.tccn.meta;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author: liangxianyou
*/
@Data
@Getter
@Setter
public class FromItem {
private String col;
private String label;

View File

@@ -1,6 +1,7 @@
package net.tccn.meta;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
@@ -9,7 +10,8 @@ import java.util.Map;
/**
* Created by liangxianyou at 2018/12/25 16:22.
*/
@Data
@Getter
@Setter
@Table(name = "MetaLink", catalog = "db_meta")
public class MetaLink extends Doc<MetaLink> {
public static MetaLink dao = Doc.dao(MetaLink.class);

View File

@@ -1,6 +1,7 @@
package net.tccn.meta;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
@@ -12,7 +13,8 @@ import java.util.Map;
/**
* Created by liangxianyou at 2018/12/24 16:15.
*/
@Data
@Getter
@Setter
@Table(name = "MetaService", catalog = "db_meta")
public class MetaService extends Doc<MetaService> {
public static MetaService dao = Doc.dao(MetaService.class);

View File

@@ -1,6 +1,7 @@
package net.tccn.meta;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import net.tccn.base.dbq.table.Field;
@@ -15,7 +16,8 @@ import java.util.stream.Collectors;
*
* @author: liangxianyou at 2018/10/17 12:58.
*/
@Data
@Getter
@Setter
@Table(name = "MetaTable", catalog = "db_meta")
public class MetaTable extends Doc<MetaTable> implements Serializable {
public static final MetaTable dao = MetaTable.dao(MetaTable.class);
@@ -27,6 +29,7 @@ public class MetaTable extends Doc<MetaTable> implements Serializable {
private String sysPlatId; //所属系统平台
private String dbPlatId; //所属数据平台
private String catalog; //所在database
private Integer status; //状态 0 默认, 9删除
private Integer hv;//临时
// ------------------------------------------------

View File

@@ -1,9 +1,6 @@
package net.tccn.meta;
import net.tccn.base.BaseService;
import net.tccn.base.JBean;
import net.tccn.base.Kv;
import net.tccn.base.MetaKit;
import net.tccn.base.*;
import net.tccn.base.dbq.table.Field;
import net.tccn.plat.MetaPlat;
import org.redkale.net.http.RestMapping;
@@ -29,7 +26,8 @@ public class MetadataService extends BaseService { //arango
-> (isEmpty(catalog) || catalog.equals(x.getCatalog())) &&
(isEmpty(dbPlatId) || dbPlatId.equals(x.getDbPlatId())) &&
(isEmpty(name) || x.getName().contains(name)) &&
(isEmpty(token) || x.getSysPlatId().equals(platId(token)))
(isEmpty(token) || x.getSysPlatId().equals(platId(token))) &&
(isEmpty(x.getStatus()) || x.getStatus() != 9)
).map(x -> Kv.of("name", x.getName())
.set("comment", x.getComment())
.set("catalog", x.getCatalog())
@@ -139,7 +137,7 @@ public class MetadataService extends BaseService { //arango
@RestMapping(name = "showsort", comment = "展示字段修改")
public JBean showSort(String name, List<Map<String, String>> shows, @RestParam(name = "platToken") String token) {
if (shows == null || shows.size() == 0) return null;
if (Utils.isEmpty(shows)) return null;
MetaService metaService = MetaKit.getMetaService(name, token);
metaService.setShows(shows);
@@ -149,7 +147,7 @@ public class MetadataService extends BaseService { //arango
@RestMapping(name = "exportsave", comment = "导出配置保存")
public JBean exportSave(String name, List<Map<String, String>> exports, @RestParam(name = "platToken") String token) {
if (exports == null || exports.size() == 0) return null;
if (Utils.isEmpty(exports)) return null;
MetaService metaService = MetaKit.getMetaService(name, token);
metaService.setExports(exports);
@@ -160,7 +158,7 @@ public class MetadataService extends BaseService { //arango
@RestMapping(name = "detailsave", comment = "详情配置保存")
public JBean detailSave(String name, List<Map<String, String>> details, @RestParam(name = "platToken") String token) {
if (details == null || details.size() == 0) return null;
if (Utils.isEmpty(details)) return null;
MetaService metaService = MetaKit.getMetaService(name, token);
metaService.setDetails(details);
@@ -171,7 +169,7 @@ public class MetadataService extends BaseService { //arango
@RestMapping(name = "editsave", comment = "表单配置保存")
public JBean editSave(String name, List<FromItem> edits, @RestParam(name = "platToken") String token) {
if (edits == null || edits.size() == 0) return null;
if (Utils.isEmpty(edits)) return null;
MetaService metaService = MetaKit.getMetaService(name, token);
metaService.setEdits(edits);
@@ -182,7 +180,7 @@ public class MetadataService extends BaseService { //arango
@RestMapping(name = "delsave", comment = "删除配置保存")
public JBean delSave(String name, Map<String, String> dels, @RestParam(name = "platToken") String token) {
if (dels == null || dels.size() == 0) return null;
if (Utils.isEmpty(dels)) return null;
MetaService metaService = MetaKit.getMetaService(name, token);
metaService.setDels(dels);
@@ -193,7 +191,7 @@ public class MetadataService extends BaseService { //arango
@RestMapping(name = "importsort", comment = "导入字段保存")
public JBean importSort(String serviceKey, List<String> items, @RestParam(name = "platToken") String token) {
if (isEmpty(items)) return null;
if (Utils.isEmpty(items)) return null;
MetaTable metaTable = MetaKit.getMetaTable(serviceKey, token);
//fixme: metaTable.setImports(items);
@@ -230,8 +228,9 @@ public class MetadataService extends BaseService { //arango
JBean jBean = new JBean();
List<Kv> list = MetaKit.getMetaTables().stream()
.filter(x -> (isEmpty(token) || x.getSysPlatId().equals(platId(token))))
.map(x -> {
.filter(x -> (isEmpty(token) || x.getSysPlatId().equals(platId(token)))
&& (x.getStatus() == null || x.getStatus() != 9)
).map(x -> {
Kv kv = Kv.of("name", x.getName())
.set("comment", x.getComment())
.set("alias", x.getAlias())
@@ -277,9 +276,7 @@ public class MetadataService extends BaseService { //arango
List<MetaLink> links = MetaKit.getMetaLinks();
if (!isEmpty(alias)) {
links = links.stream()
.filter(x -> x.getTables()[0].equals(alias) || x.getTables()[1].equals(alias))
.collect(Collectors.toList());
links = Utils.filter(links, x -> x.getTables()[0].equals(alias) || x.getTables()[1].equals(alias));
}
return jBean.setBody(links);

View File

@@ -1,17 +1,18 @@
package net.tccn.plat;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import org.redkale.convert.ConvertColumn;
import javax.persistence.Table;
import java.util.List;
/**
* 数据库平台
* @author: liangxianyou at 2018/11/14 12:58.
*/
@Data
@Getter
@Setter
@Table(name = "MetaDb", catalog = "db_meta")
public class MetaDb extends Doc<MetaDb> {
public static MetaDb dao = dao(MetaDb.class);

View File

@@ -1,14 +1,16 @@
package net.tccn.plat;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
import org.redkale.persistence.Entity;
import org.redkale.persistence.Table;
/**
* @author: liangxianyou at 2018/11/26 17:46.
*/
@Data
@Getter
@Setter
@Table(name = "MetaPlat", catalog = "db_meta")
public class MetaPlat extends Doc<MetaPlat> {
public static MetaPlat dao = dao(MetaPlat.class);

View File

@@ -32,7 +32,7 @@ public class _DbService extends BaseService {
dbKit = MetaKit.getDbKit(dbPlatId, "");
}
List<Map> list = dbKit.findList("SHOW DATABASES;", Map.class);
List<Map> list = dbKit.queryList("SHOW DATABASES;", Map.class);
Stream<String> database = list.stream().map(x -> String.valueOf(x.get("Database")));
@@ -44,7 +44,7 @@ public class _DbService extends BaseService {
DbKit dbKit = MetaKit.getDbKit(dbPlatId, "");
String sql = tplKit.getTpl("db.table_list", Kv.of("catalog", catalog).set("tables", tables));
return dbKit.findList(sql, Table.class);
return dbKit.queryList(sql, Table.class);
}
@RestMapping(ignore = true)
@@ -77,8 +77,8 @@ public class _DbService extends BaseService {
String sql = tplKit.getTpl("db.table_list", Kv.of("table", tableName));
String columnSql = String.format("SHOW FULL COLUMNS FROM %s.`%s`", catalog, tableName);
CompletableFuture<Table> tableFuture = dbKit.findfirstAsync(sql, Table.class);
CompletableFuture<List<Column>> columnFuture = dbKit.findListAsync(columnSql, Column.class);
CompletableFuture<Table> tableFuture = dbKit.findAsync(sql, Table.class);
CompletableFuture<List<Column>> columnFuture = dbKit.queryListAsync(columnSql, Column.class);
try {
Table table = tableFuture.get();

View File

@@ -1,6 +1,7 @@
package net.tccn.qtask;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.arango.Doc;
import javax.persistence.Table;
@@ -8,7 +9,8 @@ import javax.persistence.Table;
/**
* Created by liangxianyou at 2019/4/20 20:04.
*/
@Data
@Getter
@Setter
@Table(name = "DbTask", catalog = "db_meta")
public class DbTask extends Doc<DbTask> {
public static DbTask dao = dao(DbTask.class);

View File

@@ -1,6 +1,7 @@
package net.tccn.qtask;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.Kv;
import net.tccn.base.dbq.jdbc.api.DbAccount;
@@ -10,7 +11,8 @@ import net.tccn.base.dbq.jdbc.api.DbAccount;
* |-
* 任务对象
*/
@Data
@Getter
@Setter
public class Task {
private String name; // 任务标识,同一系统唯一

View File

@@ -58,6 +58,6 @@ public class QTaskMysql extends QTaskAbs implements QTask {
dbKit.exetute(sql);
}*/
return dbKit.findList(sql, Map.class);
return dbKit.queryList(sql, Map.class);
}
}

View File

@@ -1,6 +1,7 @@
package net.tccn.user;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import net.tccn.base.JBean;
import net.tccn.base.arango.Doc;
import org.redkale.util.Utility;
@@ -10,7 +11,8 @@ import javax.persistence.Table;
/**
* @author: liangxianyou at 2018/11/22 17:37.
*/
@Data
@Getter
@Setter
@Table(name = "MetaUser", catalog = "db_meta")
public class MetaUser extends Doc<MetaUser> {
public static MetaUser dao = dao(MetaUser.class);