1、metaTable中加入字段主键设置
2、添加删除策略配置 3、列表配置中加入"HIDDEN"配置,以及预览中加入解析逻辑
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<application port="5001">
|
<application port="5001" xmlns="application.xsd">
|
||||||
|
|
||||||
<resources>
|
<resources>
|
||||||
<listener value="net.tccn.base.MetaListenter"/>
|
<listener value="net.tccn.base.MetaListenter"/>
|
||||||
<properties load="config.txt"></properties>
|
<properties load="config.txt"></properties>
|
||||||
@@ -12,10 +11,9 @@
|
|||||||
<remoteaddr value="request.headers.X-RemoteAddress"/>
|
<remoteaddr value="request.headers.X-RemoteAddress"/>
|
||||||
</request>
|
</request>
|
||||||
<response>
|
<response>
|
||||||
<addheader name="X-Node" value="system.property.APP_NODE" />
|
<addheader name="X-Node" value="system.property.APP_NODE"/>
|
||||||
</response>
|
</response>
|
||||||
<resource-servlet>
|
<resource-servlet/>
|
||||||
</resource-servlet>
|
|
||||||
|
|
||||||
<rest autoload="true" base="net.tccn.servlet.BaseServlet"/>
|
<rest autoload="true" base="net.tccn.servlet.BaseServlet"/>
|
||||||
<services autoload="true"/>
|
<services autoload="true"/>
|
||||||
|
|||||||
110
conf/application.xsd
Normal file
110
conf/application.xsd
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" xmlns="http://www.w3school.com.cn">
|
||||||
|
|
||||||
|
<!-- **************************************************** -->
|
||||||
|
<!-- 复合元素定义 -->
|
||||||
|
|
||||||
|
<!-- server -->
|
||||||
|
<xs:element name="request">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element name="remoteaddr">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="value" type="xs:string"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="response">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element name="addheader">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="name" type="xs:string"></xs:attribute>
|
||||||
|
<xs:attribute name="value" type="xs:string"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="resource-servlet"></xs:element>
|
||||||
|
<xs:element name="rest">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="autoload"></xs:attribute>
|
||||||
|
<xs:attribute name="base"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="services">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="autoload"></xs:attribute>
|
||||||
|
<xs:attribute name="base"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="servlets">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="autoload"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="render">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="value"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
|
||||||
|
<xs:element name="resources">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element name="listener">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="value" type="xs:string"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="properties">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:attribute name="load" type="xs:anyURI"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="server">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element ref="request"/>
|
||||||
|
<xs:element ref="response"/>
|
||||||
|
<xs:element ref="resource-servlet"/>
|
||||||
|
<xs:element ref="rest"/>
|
||||||
|
<xs:element ref="services"/>
|
||||||
|
<xs:element ref="servlets"/>
|
||||||
|
<xs:element ref="render"/>
|
||||||
|
</xs:sequence>
|
||||||
|
|
||||||
|
<xs:attribute name="protocol" type="xs:string"></xs:attribute>
|
||||||
|
<xs:attribute name="host" type="xs:string"></xs:attribute>
|
||||||
|
<xs:attribute name="port" type="xs:string"></xs:attribute>
|
||||||
|
<xs:attribute name="root" type="xs:string"></xs:attribute>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- **************************************************** -->
|
||||||
|
|
||||||
|
<xs:element name="application">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element ref="resources"/>
|
||||||
|
<xs:element ref="server"/>
|
||||||
|
|
||||||
|
</xs:sequence>
|
||||||
|
|
||||||
|
<xs:attribute name="port" type="xs:integer"/>
|
||||||
|
<xs:attribute name="version" type="xs:string"/>
|
||||||
|
<xs:attribute name="xmlns" type="xs:string"/>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
|
||||||
|
</xs:schema>
|
||||||
@@ -19,9 +19,9 @@ const meta = {
|
|||||||
getServiceInfo({name}, callback) {
|
getServiceInfo({name}, callback) {
|
||||||
red.getJSON("/meta/service_info",{name}, res => {
|
red.getJSON("/meta/service_info",{name}, res => {
|
||||||
|
|
||||||
let {name, comment, table, edits, imports, shows, exports, filters, details} = red.replacePoint(res)
|
let {name, comment, table, edits, imports, shows, exports, filters, details, dels} = red.replacePoint(res)
|
||||||
|
|
||||||
callback({name, comment, table, edits, imports, shows, exports, filters, details});
|
callback({name, comment, table, edits, imports, shows, exports, filters, details, dels});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
getServiceDetail({name}, callback) {
|
getServiceDetail({name}, callback) {
|
||||||
@@ -78,6 +78,10 @@ const meta = {
|
|||||||
edits = red.replace$(edits);
|
edits = red.replace$(edits);
|
||||||
return red.postX('/meta/editsave', {name, edits: JSON.stringify(edits)})
|
return red.postX('/meta/editsave', {name, edits: JSON.stringify(edits)})
|
||||||
},
|
},
|
||||||
|
delSave({name, dels}) {
|
||||||
|
dels = red.replace$(dels);
|
||||||
|
return red.postX('/meta/delsave', {name, dels: JSON.stringify(dels)})
|
||||||
|
},
|
||||||
|
|
||||||
// Meta-Table
|
// Meta-Table
|
||||||
tableList() {
|
tableList() {
|
||||||
@@ -99,6 +103,10 @@ const meta = {
|
|||||||
} else if (cate == 'json') {
|
} else if (cate == 'json') {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
del({name, id}) {
|
||||||
|
return red.postX('/data/del', {name, data: JSON.stringify({id})})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ const qtask = {
|
|||||||
return red.postX('_qtask/save',{task})
|
return red.postX('_qtask/save',{task})
|
||||||
},
|
},
|
||||||
qtaskDebug({task}) {
|
qtaskDebug({task}) {
|
||||||
return red.postX('_qtask/debug',{task})
|
return red.postX('_qtask/debug',{task:JSON.stringify(task)})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -74,9 +74,11 @@
|
|||||||
<table class="table table-bordered table-hover" style="width: 100%">
|
<table class="table table-bordered table-hover" style="width: 100%">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<!-- 'sort':field.order>0 -->
|
||||||
<th v-for="field in cfg.shows"
|
<th v-for="field in cfg.shows"
|
||||||
|
v-if="field.fmt != 'HIDDEN'"
|
||||||
v-text="field.label || getFieldLabel(field.col)"
|
v-text="field.label || getFieldLabel(field.col)"
|
||||||
:class="{'sort':field.order>0, 'sort-up':field.col==order.col && order.desc==1, 'sort-down':field.col==order.col && order.desc!=1}"
|
:class="{'sort':1, 'sort-up':field.col==order.col && order.desc==1, 'sort-down':field.col==order.col && order.desc!=1}"
|
||||||
@click="sortEvent(field.col)"></th>
|
@click="sortEvent(field.col)"></th>
|
||||||
<th>操作</th>
|
<th>操作</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -86,10 +88,14 @@
|
|||||||
<!--
|
<!--
|
||||||
<td v-for="field in cfg.shows" v-title="dealFieldFmt(row, field.col)" v-text="dealFieldFmt(row, field.col)"></td>
|
<td v-for="field in cfg.shows" v-title="dealFieldFmt(row, field.col)" v-text="dealFieldFmt(row, field.col)"></td>
|
||||||
-->
|
-->
|
||||||
<td v-for="fieldFmt in cfg.shows" v-title="dealFieldFmt(row, fieldFmt)" v-html="dealFieldFmt(row, fieldFmt)"></td>
|
<td v-for="field in cfg.shows"
|
||||||
|
v-if="field.fmt != 'HIDDEN'"
|
||||||
|
v-title="dealFieldFmt(row, field)"
|
||||||
|
v-html="dealFieldFmt(row, field)"></td>
|
||||||
<td>
|
<td>
|
||||||
<a href="javascript:;" @click="detailData=row; detail()">详情</a>
|
<a href="javascript:;" @click="detailData=row; detail()">详情</a>
|
||||||
<a href="javascript:;" @click="detailData=row; edit()">编辑</a>
|
<a href="javascript:;" @click="detailData=row; edit()">编辑</a>
|
||||||
|
<a href="javascript:;" @click="detailData=row; del()">删除</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -223,7 +229,8 @@
|
|||||||
return {1:"男",2:"女"}[v] || "未知性别"
|
return {1:"男",2:"女"}[v] || "未知性别"
|
||||||
}
|
}
|
||||||
|
|
||||||
let {getServiceList, getCfg, getDataList, exportData} = meta;
|
let {getServiceList, getCfg, getDataList, exportData, del} = meta
|
||||||
|
let {showOk} = red
|
||||||
var vm = new Vue({
|
var vm = new Vue({
|
||||||
el:".data-list",
|
el:".data-list",
|
||||||
data: {
|
data: {
|
||||||
@@ -237,11 +244,12 @@
|
|||||||
services: [],
|
services: [],
|
||||||
service: "",
|
service: "",
|
||||||
|
|
||||||
addFilter: "recompany",
|
addFilter: "",
|
||||||
para: {},
|
para: {},
|
||||||
list: {rows: [], total: 0},
|
list: {rows: [], total: 0},
|
||||||
limit: {pn: 1, ps: 10, total: 0},
|
limit: {pn: 1, ps: 10, total: 0},
|
||||||
order: {col: "id", desc: 1},
|
order: {col: "id", desc: 1},
|
||||||
|
pk: "",
|
||||||
detailData: {}
|
detailData: {}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -271,7 +279,6 @@
|
|||||||
this.list = {rows:[], total:0};
|
this.list = {rows:[], total:0};
|
||||||
let fbean = this.buildFBean();
|
let fbean = this.buildFBean();
|
||||||
getDataList(fbean, json => {
|
getDataList(fbean, json => {
|
||||||
console.log(json)
|
|
||||||
vm.list = json;
|
vm.list = json;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -420,6 +427,12 @@
|
|||||||
edit() {
|
edit() {
|
||||||
$('#edit').modal({moveable: true});
|
$('#edit').modal({moveable: true});
|
||||||
},
|
},
|
||||||
|
del() {
|
||||||
|
let name = this.service
|
||||||
|
let pk = this.detailData[this.cfg.pk]
|
||||||
|
|
||||||
|
del({name, id: pk}).then(res => showOk)
|
||||||
|
},
|
||||||
showInfo() {
|
showInfo() {
|
||||||
$('#f-info').modal({moveable: true})
|
$('#f-info').modal({moveable: true})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,10 @@
|
|||||||
<button @click="status='detail'" :class="['btn',{'btn-primary':status=='detail'}]" type="button"> 详情配置</button>
|
<button @click="status='detail'" :class="['btn',{'btn-primary':status=='detail'}]" type="button"> 详情配置</button>
|
||||||
</span>
|
</span>
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button @click="status='edit'" :class="['btn',{'btn-primary':status=='form'}]" type="button"> 表单配置</button>
|
<button @click="status='edit'" :class="['btn',{'btn-primary':status=='edit'}]" type="button"> 表单配置</button>
|
||||||
|
</span>
|
||||||
|
<span class="input-group-btn">
|
||||||
|
<button @click="status='del'" :class="['btn',{'btn-primary':status=='del'}]" type="button"> 删除配置</button>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span class="input-group-btn" style="padding-left: 10px">
|
<span class="input-group-btn" style="padding-left: 10px">
|
||||||
@@ -137,7 +140,8 @@
|
|||||||
<th></th>
|
<th></th>
|
||||||
<th>数据字段</th>
|
<th>数据字段</th>
|
||||||
<th>表头名称</th>
|
<th>表头名称</th>
|
||||||
<th>格式化</th>
|
<th>格式化类型</th>
|
||||||
|
<th>附加参数</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tr v-for="(item, index) in serviceInfo.shows">
|
<tr v-for="(item, index) in serviceInfo.shows">
|
||||||
@@ -146,7 +150,19 @@
|
|||||||
</td>
|
</td>
|
||||||
<td v-text="item.col" style="background-color: rgb(235, 235, 228);"></td>
|
<td v-text="item.col" style="background-color: rgb(235, 235, 228);"></td>
|
||||||
<td style="padding: 1px;"><input v-model="item.label" class="form-control" style="width: 130px;padding: 0px"></td>
|
<td style="padding: 1px;"><input v-model="item.label" class="form-control" style="width: 130px;padding: 0px"></td>
|
||||||
|
<td style="padding: 1px;">
|
||||||
|
<select v-model="item.inType" class="form-control" style="width: 130px">
|
||||||
|
<option></option>
|
||||||
|
<option v-for="x in inTypes" :value="x">{{x}}</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<td style="padding: 1px;" title="格式化类型为:funs或qtask的时候需要填写附加参数">
|
||||||
|
<input v-show="item.inType == 'FUNC' || item.inType == 'QTASK' || item.inType == 'DICT'" v-model="item.inExt" class="form-control" style="width: 130px;padding: 0px">
|
||||||
|
<input disabled v-show="item.inType != 'FUNC' && item.inType != 'QTASK' && item.inType != 'DICT'" v-model="item.inExt" class="form-control" style="width: 130px;padding: 0px">
|
||||||
|
</td>
|
||||||
|
<!--
|
||||||
<td style="padding: 1px;"><input v-model="item.fmt" class="form-control" style="width: 130px;padding: 0px"></td>
|
<td style="padding: 1px;"><input v-model="item.fmt" class="form-control" style="width: 130px;padding: 0px"></td>
|
||||||
|
-->
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@@ -293,6 +309,49 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- del -->
|
||||||
|
<div id="del" v-show="status=='del'">
|
||||||
|
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 删除策略</div>
|
||||||
|
<div class="panel-body" style="overflow:auto;">
|
||||||
|
<form class="form-horizontal">
|
||||||
|
<!--
|
||||||
|
<label class="radio-inline">
|
||||||
|
<input type="radio" v-model="serviceInfo.dels.cate" value="UP_FIELD"> 策略一(更新主表字段)
|
||||||
|
</label>
|
||||||
|
-->
|
||||||
|
<label class="radio-inline">
|
||||||
|
<input type="radio" v-model="serviceInfo.dels.cate" value="SQL"> 策略一(执行完整SQL)
|
||||||
|
</label>
|
||||||
|
<label class="radio-inline">
|
||||||
|
<input disabled type="radio" v-model="serviceInfo.dels.cate" value="QTASK"> 策略二(执行QTask)
|
||||||
|
</label>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<div v-show="serviceInfo.dels.cate == 'UP_FIELD'" class="form-group">
|
||||||
|
<label for="name" class="col-md-2">SQL</label>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<textarea v-model="serviceInfo.dels.sql1" disabled style="width: 100%;" rows="5"></textarea>
|
||||||
|
<!--
|
||||||
|
<input v-model="serviceInfo.dels.name" class="form-control" id="name" placeholder="请输入Table名称">
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-show="serviceInfo.dels.cate == 'SQL'" class="form-group">
|
||||||
|
<label for="name" class="col-md-2">SQL</label>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<textarea v-model="serviceInfo.dels.sql" style="width: 100%;" rows="5"></textarea>
|
||||||
|
<!--
|
||||||
|
<input v-model="serviceInfo.dels.name" class="form-control" id="name" placeholder="请输入Table名称">
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@@ -340,7 +399,7 @@
|
|||||||
</row>
|
</row>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
let {getServiceInfo, getServiceDetail, getServiceList, tableLinkList, serviceSave, showSave, filterSave, exportSave, detailSave, editSave} = meta;
|
let {getServiceInfo, getServiceDetail, getServiceList, tableLinkList, serviceSave, showSave, filterSave, exportSave, detailSave, editSave, delSave} = meta;
|
||||||
let {showOk} = red
|
let {showOk} = red
|
||||||
|
|
||||||
var vm = new Vue({
|
var vm = new Vue({
|
||||||
@@ -350,7 +409,7 @@
|
|||||||
sheetArr: ["a"],//别名
|
sheetArr: ["a"],//别名
|
||||||
sheet: "a",//别名
|
sheet: "a",//别名
|
||||||
|
|
||||||
inTypes: ["INPUT", "SELECT_EXT", "INPUT_DT"],
|
inTypes: ["INPUT", "DICT", "INPUT_DAY", "INPUT_TIME", "FUNC", "QTASK", "HIDDEN"],
|
||||||
dataTypes: ["bigint(20)", "varchar(255)", "varchar(64)", "varchar(32)", "varchar(16)", "int(11)", "int(3)", "int(2)", "datetime"],
|
dataTypes: ["bigint(20)", "varchar(255)", "varchar(64)", "varchar(32)", "varchar(16)", "int(11)", "int(3)", "int(2)", "datetime"],
|
||||||
filterCate: ["EQUAL", "NOTEQUAL", "LIKE", "IN"],
|
filterCate: ["EQUAL", "NOTEQUAL", "LIKE", "IN"],
|
||||||
serviceInfo: {
|
serviceInfo: {
|
||||||
@@ -363,6 +422,7 @@
|
|||||||
filters: [{name: '', label: '', filterType: ['']}],
|
filters: [{name: '', label: '', filterType: ['']}],
|
||||||
details: [],
|
details: [],
|
||||||
edits: [],
|
edits: [],
|
||||||
|
dels: {cate: "", sql: "", qtask: ""}
|
||||||
},
|
},
|
||||||
serviceDetail: {tables: {a: {items: []}}},
|
serviceDetail: {tables: {a: {items: []}}},
|
||||||
|
|
||||||
@@ -403,6 +463,8 @@
|
|||||||
|
|
||||||
//edits
|
//edits
|
||||||
editArr: [],
|
editArr: [],
|
||||||
|
|
||||||
|
//del
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
status: function (v) {
|
status: function (v) {
|
||||||
@@ -460,6 +522,18 @@
|
|||||||
}
|
}
|
||||||
this.sheetArr = arr;//别名
|
this.sheetArr = arr;//别名
|
||||||
this.sheet = arr[0];
|
this.sheet = arr[0];
|
||||||
|
|
||||||
|
// 处理dels 策略
|
||||||
|
let dels = this.serviceInfo["dels"] || {}
|
||||||
|
//console.log("dels", dels)
|
||||||
|
let cate = dels["cate"] || "UP_FIELD"
|
||||||
|
let sql1 = dels["sql1"] || "update #(table) set status=9 where id=#(id);"
|
||||||
|
let sql = dels["sql"] || `update ${v['tables'][this.serviceInfo.table]['name']} set status=9 where id=#(id);`
|
||||||
|
let qtask = dels["qtask"] || ""
|
||||||
|
|
||||||
|
let serviceInfo = this.serviceInfo
|
||||||
|
serviceInfo["dels"] = {cate, sql1, sql, qtask}
|
||||||
|
this.serviceInfo = serviceInfo
|
||||||
},
|
},
|
||||||
sheet: function (v) {
|
sheet: function (v) {
|
||||||
this.table = v;
|
this.table = v;
|
||||||
@@ -656,6 +730,7 @@
|
|||||||
methods: {
|
methods: {
|
||||||
loadInfo(name) {
|
loadInfo(name) {
|
||||||
getServiceInfo({name}, (json) => {
|
getServiceInfo({name}, (json) => {
|
||||||
|
json.dels = json.dels || {cate:"", sql1:"", sql:"", qtask:""}
|
||||||
this.serviceInfo = json;
|
this.serviceInfo = json;
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@@ -830,6 +905,11 @@
|
|||||||
}
|
}
|
||||||
console.log(edits)
|
console.log(edits)
|
||||||
editSave({name: this.service, edits}).then(res => red.showOk())
|
editSave({name: this.service, edits}).then(res => red.showOk())
|
||||||
|
} else if (vm.status == 'del') {
|
||||||
|
let dels = this.serviceInfo.dels
|
||||||
|
|
||||||
|
console.log(dels)
|
||||||
|
delSave({name: this.service, dels}).then(res => red.showOk())
|
||||||
} else if (vm.status == 7) {
|
} else if (vm.status == 7) {
|
||||||
console.log(vm.row);
|
console.log(vm.row);
|
||||||
red.postX("/meta/dbplatupdate", vm.row).then(() => showOk())
|
red.postX("/meta/dbplatupdate", vm.row).then(() => showOk())
|
||||||
|
|||||||
@@ -72,7 +72,7 @@
|
|||||||
<th>数据类型</th>
|
<th>数据类型</th>
|
||||||
<th>输入类型</th>
|
<th>输入类型</th>
|
||||||
<th>附加属性</th>
|
<th>附加属性</th>
|
||||||
<th>备注</th>
|
<th>主键</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-for="(item, index) in meta.items" class="item">
|
<tr v-for="(item, index) in meta.items" class="item">
|
||||||
<td v-show="status==1" class="icon icon-move"></td>
|
<td v-show="status==1" class="icon icon-move"></td>
|
||||||
@@ -81,9 +81,12 @@
|
|||||||
<td v-show="status!=2" v-text="item.type"></td>
|
<td v-show="status!=2" v-text="item.type"></td>
|
||||||
<td v-show="status!=2" v-text="item.inType"></td>
|
<td v-show="status!=2" v-text="item.inType"></td>
|
||||||
<td v-show="status!=2" v-text="item.inExt"></td>
|
<td v-show="status!=2" v-text="item.inExt"></td>
|
||||||
<td v-show="status!=2" v-text="item.remark"></td>
|
<td v-show="status!=2">
|
||||||
|
<i v-if="item.pk" class="icon icon-check"></i>
|
||||||
|
</td>
|
||||||
|
|
||||||
<td v-show="status==2">
|
<td v-show="status==2">
|
||||||
|
<input type="hidden" name="item" :value="JSON.stringify(item)">
|
||||||
<input v-model="item" type="hidden">
|
<input v-model="item" type="hidden">
|
||||||
<input :value="item.name" disabled class="form-control">
|
<input :value="item.name" disabled class="form-control">
|
||||||
<input v-model="item.name" type="hidden">
|
<input v-model="item.name" type="hidden">
|
||||||
@@ -98,7 +101,11 @@
|
|||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
<td v-show="status==2"><input v-model="item.inExt" class="form-control"></td>
|
<td v-show="status==2"><input v-model="item.inExt" class="form-control"></td>
|
||||||
<td v-show="status==2"><input v-model="item.remark" class="form-control"></td>
|
<td v-show="status==2" style="text-align: center">
|
||||||
|
<label>
|
||||||
|
<input v-model="item.pk" type="checkbox">
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@@ -204,7 +211,7 @@
|
|||||||
let itemOv = this.oldItems || [];
|
let itemOv = this.oldItems || [];
|
||||||
if (itemOv.length == 0) return;
|
if (itemOv.length == 0) return;
|
||||||
|
|
||||||
let attr = ["label", "name", "remark", "type", "inType","inExt"];
|
let attr = ["label", "name", "pk", "type", "inType","inExt"];
|
||||||
let itemEdit = [];
|
let itemEdit = [];
|
||||||
a:for (let i = 0; i < itemOv.length; i++) {
|
a:for (let i = 0; i < itemOv.length; i++) {
|
||||||
for (let j = 0; j < attr.length; j++) {
|
for (let j = 0; j < attr.length; j++) {
|
||||||
|
|||||||
@@ -231,6 +231,22 @@ public final class MetaKit {
|
|||||||
.filter(y -> x.split("[.]")[1].equals(y.getName()))
|
.filter(y -> x.split("[.]")[1].equals(y.getName()))
|
||||||
.findFirst().ifPresent(y -> _shows.add(Kv.of("col", x).set("order", true)));
|
.findFirst().ifPresent(y -> _shows.add(Kv.of("col", x).set("order", true)));
|
||||||
});*/
|
});*/
|
||||||
|
List<Kv> _shows = shows.stream().map(x -> {
|
||||||
|
Kv kv = Kv.of();
|
||||||
|
kv.putAll(x);
|
||||||
|
|
||||||
|
if ("FUNC".equalsIgnoreCase(x.get("inType")) || "QTASK".equalsIgnoreCase(x.get("inType")) || "DICT".equalsIgnoreCase(x.get("inType"))) {
|
||||||
|
kv.set("fmt", x.get("inType") + "|" + x.get("inExt"));
|
||||||
|
} else if ("HIDDEN".equalsIgnoreCase(x.get("inType"))) {
|
||||||
|
kv.set("fmt", "HIDDEN");
|
||||||
|
} else {
|
||||||
|
kv.set("fmt", "");
|
||||||
|
}
|
||||||
|
kv.remove("inType");
|
||||||
|
kv.remove("inExt");
|
||||||
|
return kv;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
|
||||||
//filters
|
//filters
|
||||||
List<Map> _filters = new ArrayList<>();
|
List<Map> _filters = new ArrayList<>();
|
||||||
@@ -300,10 +316,28 @@ public final class MetaKit {
|
|||||||
_details.add(kv);
|
_details.add(kv);
|
||||||
});*/
|
});*/
|
||||||
|
|
||||||
|
//pk:业务主表的主键
|
||||||
|
StringBuffer _pks = new StringBuffer();
|
||||||
|
MetaTable mainTable = metaTables.get(metaService.getTable());
|
||||||
|
mainTable.getItems().stream().filter(x -> x.getPk() != null && x.getPk()).forEach(x -> {
|
||||||
|
_pks.append(String.format("%s.%s,", metaService.getTable(), x.getName()));
|
||||||
|
});
|
||||||
|
if (_pks.length() > 0) {
|
||||||
|
_pks.deleteCharAt(_pks.length() -1);
|
||||||
|
}
|
||||||
|
if (_pks.length() == 0) { // 默认主键
|
||||||
|
List<Field> items = metaTables.get(metaService.getTable()).getItems();
|
||||||
|
//存在id字段,取id
|
||||||
|
items.stream().filter(x -> x.getName().equalsIgnoreCase("id")).findAny().ifPresent(x -> {
|
||||||
|
_pks.append(String.format("%s.%s", metaService.getTable(), x.getName()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return Kv.of()
|
return Kv.of()
|
||||||
|
.set("pk", _pks.toString())
|
||||||
.set("title", comment)
|
.set("title", comment)
|
||||||
.set("items", _items2)
|
.set("items", _items2)
|
||||||
.set("shows", shows)
|
.set("shows", _shows)
|
||||||
.set("filters", _filters)
|
.set("filters", _filters)
|
||||||
.set("edits", edits)
|
.set("edits", edits)
|
||||||
.set("details", details);
|
.set("details", details);
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package net.tccn.base;
|
|||||||
|
|
||||||
import com.jfinal.plugin.activerecord.SqlPara;
|
import com.jfinal.plugin.activerecord.SqlPara;
|
||||||
import com.jfinal.plugin.activerecord.sql.SqlKit;
|
import com.jfinal.plugin.activerecord.sql.SqlKit;
|
||||||
|
import com.jfinal.template.Engine;
|
||||||
|
import com.jfinal.template.Template;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileFilter;
|
import java.io.FileFilter;
|
||||||
@@ -131,4 +133,12 @@ public class TplKit {
|
|||||||
public void parseTpl() {
|
public void parseTpl() {
|
||||||
kit.parseSqlTemplate();
|
kit.parseSqlTemplate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------
|
||||||
|
private static Engine engine = Engine.use();
|
||||||
|
|
||||||
|
public static String parseTpl(String tpl, Map data) {
|
||||||
|
Template template = engine.getTemplateByString(tpl);
|
||||||
|
return template.renderToString(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import net.tccn.base.PageBean;
|
|||||||
import net.tccn.dbq.fbean.FBean;
|
import net.tccn.dbq.fbean.FBean;
|
||||||
import net.tccn.dbq.jdbc.api.DbKit;
|
import net.tccn.dbq.jdbc.api.DbKit;
|
||||||
import net.tccn.dbq.parser.ParseMysql;
|
import net.tccn.dbq.parser.ParseMysql;
|
||||||
import net.tccn.dbq.parser.Parser;
|
|
||||||
import net.tccn.meta.MetaService;
|
import net.tccn.meta.MetaService;
|
||||||
import net.tccn.meta.MetaTable;
|
import net.tccn.meta.MetaTable;
|
||||||
|
|
||||||
@@ -15,7 +14,7 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
public class DbExecutors {
|
public class DbExecutors {
|
||||||
private final static Parser PARSER = new ParseMysql();
|
private final static ParseMysql PARSER = new ParseMysql();
|
||||||
|
|
||||||
public static PageBean findPage(FBean fBean) throws ExecutionException, InterruptedException {
|
public static PageBean findPage(FBean fBean) throws ExecutionException, InterruptedException {
|
||||||
//sql解析
|
//sql解析
|
||||||
@@ -37,4 +36,15 @@ public class DbExecutors {
|
|||||||
|
|
||||||
return PageBean.by(rows, total);
|
return PageBean.by(rows, total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void del(String name, Map data, String token) {
|
||||||
|
MetaService metaService = MetaKit.getMetaService(name, token);
|
||||||
|
|
||||||
|
MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable());
|
||||||
|
|
||||||
|
DbKit dbKit = MetaKit.getDbKit(mainTable.getDbPlatId());
|
||||||
|
|
||||||
|
String delSql = PARSER.parseDel(name, data, token);
|
||||||
|
dbKit.exetute(delSql);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ public class Field {
|
|||||||
private String type;
|
private String type;
|
||||||
private String inType;
|
private String inType;
|
||||||
private String inExt;
|
private String inExt;
|
||||||
|
private Boolean pk; // 是否主键
|
||||||
|
|
||||||
public Field() {}
|
public Field() {}
|
||||||
|
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ public class DbKit implements DbSource{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> T findfirst(String sql, Class<T> type) {
|
public <T> T findFirst(String sql, Class<T> type) {
|
||||||
return dbSource.findfirst(sql, type);
|
return dbSource.findFirst(sql, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -72,7 +72,7 @@ public class DbKit implements DbSource{
|
|||||||
|
|
||||||
// -----------------------------------------
|
// -----------------------------------------
|
||||||
public <T> CompletableFuture<T> findfirstAsync(String sql, Class<T> type) {
|
public <T> CompletableFuture<T> findfirstAsync(String sql, Class<T> type) {
|
||||||
return CompletableFuture.supplyAsync(() -> findfirst(sql, type));
|
return CompletableFuture.supplyAsync(() -> findFirst(sql, type));
|
||||||
}
|
}
|
||||||
public <T> CompletableFuture<List<T>> findListAsync(String sql, Class<T> type) {
|
public <T> CompletableFuture<List<T>> findListAsync(String sql, Class<T> type) {
|
||||||
return CompletableFuture.supplyAsync(() -> findList(sql, type));
|
return CompletableFuture.supplyAsync(() -> findList(sql, type));
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ public interface DbSource extends IService {
|
|||||||
|
|
||||||
<T> List<T> findList(String sql, Class<T> type);
|
<T> List<T> findList(String sql, Class<T> type);
|
||||||
|
|
||||||
<T> T findfirst(String sql, Class<T> type);
|
<T> T findFirst(String sql, Class<T> type);
|
||||||
|
|
||||||
<T> T queryColumn(String sql, Class<T> type);
|
<T> T queryColumn(String sql, Class<T> type);
|
||||||
|
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class DbSourceMysql implements DbSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> T findfirst(String sql, Class<T> type) {
|
public <T> T findFirst(String sql, Class<T> type) {
|
||||||
List<T> list = findList(sql, type);
|
List<T> list = findList(sql, type);
|
||||||
return list.size() > 0 ? list.get(0) : null;
|
return list.size() > 0 ? list.get(0) : null;
|
||||||
}
|
}
|
||||||
@@ -146,14 +146,17 @@ public class DbSourceMysql implements DbSource {
|
|||||||
try (
|
try (
|
||||||
PreparedStatement ps = connection.prepareStatement(sql);
|
PreparedStatement ps = connection.prepareStatement(sql);
|
||||||
){
|
){
|
||||||
ps.executeUpdate();
|
ps.execute();
|
||||||
|
//ps.executeUpdate();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
release(connection);
|
release(connection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//fixme: lxy 处理连接超过8小时失效问题
|
||||||
private Connection connection() {
|
private Connection connection() {
|
||||||
Connection connection = connection(0);
|
Connection connection = connection(0);
|
||||||
if (connection != null && catalog != null) {
|
if (connection != null && catalog != null) {
|
||||||
@@ -178,6 +181,10 @@ public class DbSourceMysql implements DbSource {
|
|||||||
System.out.println("创建新的连接:" + x);
|
System.out.println("创建新的连接:" + x);
|
||||||
} else {
|
} else {
|
||||||
conn = queue.take();
|
conn = queue.take();
|
||||||
|
if (conn.isClosed()) {
|
||||||
|
System.out.println("connetion had closed,");
|
||||||
|
conn = connection(n);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (SQLException | InterruptedException e) {
|
} catch (SQLException | InterruptedException e) {
|
||||||
if (e instanceof InterruptedException) {
|
if (e instanceof InterruptedException) {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package net.tccn.dbq.parser;
|
|||||||
|
|
||||||
import net.tccn.base.Kv;
|
import net.tccn.base.Kv;
|
||||||
import net.tccn.base.MetaKit;
|
import net.tccn.base.MetaKit;
|
||||||
|
import net.tccn.base.TplKit;
|
||||||
import net.tccn.dbq.fbean.*;
|
import net.tccn.dbq.fbean.*;
|
||||||
import net.tccn.meta.MetaLink;
|
import net.tccn.meta.MetaLink;
|
||||||
import net.tccn.meta.MetaService;
|
import net.tccn.meta.MetaService;
|
||||||
@@ -132,4 +133,22 @@ public class ParseMysql implements Parser {
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String parseDel(String name, Map data, String token) {
|
||||||
|
MetaService metaService = MetaKit.getMetaService(name, token);
|
||||||
|
Map<String, String> dels = metaService.getDels();
|
||||||
|
MetaTable mainTable = MetaKit.getMetaTableByAlias(metaService.getTable());
|
||||||
|
|
||||||
|
String sql = "";
|
||||||
|
if ("UP_FIELD".equalsIgnoreCase(dels.get("cate"))) {
|
||||||
|
data.put("table", mainTable.getName());
|
||||||
|
sql = TplKit.parseTpl("update #(table) set status=9 where id=#(id)", data);
|
||||||
|
} else if ("SQL".equalsIgnoreCase(dels.get("cate"))) {
|
||||||
|
sql = TplKit.parseTpl(dels.get("sql"), data);
|
||||||
|
} else if ("QTASK".equalsIgnoreCase(dels.get("cate"))) {
|
||||||
|
sql = TplKit.parseTpl("qtask", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import net.tccn.base.arango.Doc;
|
|||||||
|
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -24,6 +25,7 @@ public class MetaService extends Doc<MetaService> {
|
|||||||
private List<Map<String,String>> shows = new ArrayList<>();
|
private List<Map<String,String>> shows = new ArrayList<>();
|
||||||
private List<Map<String,String>> edits = new ArrayList<>();
|
private List<Map<String,String>> edits = new ArrayList<>();
|
||||||
private List<Map<String,String>> details = new ArrayList<>();
|
private List<Map<String,String>> details = new ArrayList<>();
|
||||||
|
private Map<String, String> dels = new HashMap<>();
|
||||||
private List<Filter> filters = new ArrayList<>();//{name:"", label:"", checked:true, }
|
private List<Filter> filters = new ArrayList<>();//{name:"", label:"", checked:true, }
|
||||||
private List<Map<String,String>> exports = new ArrayList<>();
|
private List<Map<String,String>> exports = new ArrayList<>();
|
||||||
|
|
||||||
|
|||||||
@@ -79,4 +79,14 @@ public class DataService extends BaseService {
|
|||||||
return HttpScope.refer("excel");
|
return HttpScope.refer("excel");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RestMapping(name = "del", auth = false, comment = "数据删除")
|
||||||
|
public JBean del(String name, Map<String, String> data, @RestParam(name = "platToken") String token) {
|
||||||
|
JBean jBean = new JBean();
|
||||||
|
try {
|
||||||
|
DbExecutors.del(name, data, token);
|
||||||
|
} catch (Exception e) {
|
||||||
|
jBean.set(-1, "删除数据失败!");
|
||||||
|
}
|
||||||
|
return jBean;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,6 +183,17 @@ public class MetadataService extends BaseService { //arango
|
|||||||
return JBean.OK;
|
return JBean.OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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;
|
||||||
|
|
||||||
|
MetaService metaService = MetaKit.getMetaService(name, token);
|
||||||
|
metaService.setDels(dels);
|
||||||
|
|
||||||
|
MetaKit.save(metaService);
|
||||||
|
return JBean.OK;
|
||||||
|
}
|
||||||
|
|
||||||
@RestMapping(name = "importsort", comment = "导入字段保存")
|
@RestMapping(name = "importsort", comment = "导入字段保存")
|
||||||
public JBean importSort(String serviceKey, List<String> items, @RestParam(name = "platToken") String token) {
|
public JBean importSort(String serviceKey, List<String> items, @RestParam(name = "platToken") String token) {
|
||||||
if (isEmpty.test(items)) return null;
|
if (isEmpty.test(items)) return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user