metaService中支持详情页配置

This commit is contained in:
2019-06-01 20:34:51 +08:00
parent 94c8a01b98
commit 5f9fef90ef
5 changed files with 200 additions and 106 deletions

View File

@@ -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} = red.replacePoint(res) let {name, comment, table, edits, imports, shows, exports, filters, details} = red.replacePoint(res)
callback({name, comment, table, edits, imports, shows, exports, filters}); callback({name, comment, table, edits, imports, shows, exports, filters, details});
}); });
}, },
getServiceDetail({name}, callback) { getServiceDetail({name}, callback) {
@@ -70,6 +70,10 @@ const meta = {
exports = red.replace$(exports); exports = red.replace$(exports);
return red.postX('/meta/exportsave', {name, exports: JSON.stringify(exports)}) return red.postX('/meta/exportsave', {name, exports: JSON.stringify(exports)})
}, },
detailSave({name, details}) {
details = red.replace$(details);
return red.postX('/meta/detailsave', {name, details: JSON.stringify(details)})
},
// Meta-Table // Meta-Table
tableList() { tableList() {

View File

@@ -1,4 +1,3 @@
<row class="meta-service"> <row class="meta-service">
<div class="col-md-12"> <div class="col-md-12">
<div class="info" style="padding-left: 10px"> <div class="info" style="padding-left: 10px">
@@ -64,6 +63,9 @@
<span class="input-group-btn"> <span class="input-group-btn">
<button @click="status=6" :class="['btn',{'btn-primary':status==6}]" type="button"> 查询配置</button> <button @click="status=6" :class="['btn',{'btn-primary':status==6}]" type="button"> 查询配置</button>
</span> </span>
<span class="input-group-btn">
<button @click="status='detail'" :class="['btn',{'btn-primary':status=='detail'}]" type="button"> 详情配置</button>
</span>
<span class="input-group-btn" style="padding-left: 10px"> <span class="input-group-btn" style="padding-left: 10px">
<button @click="status=3" :class="['btn',{'btn-primary':status==3}]" type="button"> 导出配置</button> <button @click="status=3" :class="['btn',{'btn-primary':status==3}]" type="button"> 导出配置</button>
@@ -109,6 +111,7 @@
<td v-show="status==4"><input type="checkbox" v-model="serviceInfo.imports" :value="sheet + '$' + item.name"></td> <td v-show="status==4"><input type="checkbox" v-model="serviceInfo.imports" :value="sheet + '$' + item.name"></td>
<td v-show="status==5"><input type="checkbox" v-model="showFields" :value="sheet + '$' + item.name"></td> <td v-show="status==5"><input type="checkbox" v-model="showFields" :value="sheet + '$' + item.name"></td>
<td v-show="status==6"><input type="checkbox" v-model="filterArr" :value="sheet + '$' + item.name"></td> <td v-show="status==6"><input type="checkbox" v-model="filterArr" :value="sheet + '$' + item.name"></td>
<td v-show="status=='detail'"><input type="checkbox" v-model="detailArr" :value="sheet + '$' + item.name"></td>
<td v-text="item.name" style="background-color: rgb(235, 235, 228);"></td> <td v-text="item.name" style="background-color: rgb(235, 235, 228);"></td>
<td v-text="item.label"></td> <td v-text="item.label"></td>
@@ -130,16 +133,16 @@
<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">
<td class="icon icon-move"> <td class="icon icon-move">
<input name="col" :value="item.col" type="hidden"> <input type="hidden" name="item" :value="JSON.stringify(item)">
<input name="label" :value="item.label" type="hidden">
</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;"><input v-model="item.fmt" class="form-control" style="width: 130px;padding: 0px"></td>
</tr> </tr>
</table> </table>
</div> </div>
@@ -227,6 +230,33 @@
</tr> </tr>
</table> </table>
</div> </div>
<!-- details -->
<div id="detail" v-show="status=='detail'">
<div style="padding-left: 10px;background-color: #ccc;width: 100%"> 详情配置</div>
<table class="table table-bordered table-auto">
<thead>
<tr>
<th></th>
<th>数据字段</th>
<th>展示名称</th>
<th>格式化</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in serviceInfo.details">
<td class="icon icon-move">
<input type="hidden" name="item" :value="JSON.stringify(item)">
</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.fmt" class="form-control"
style="width: 130px;padding: 0px"></td>
</tr>
</tbody>
</table>
</div>
</div> </div>
@@ -274,7 +304,7 @@
</row> </row>
<script> <script>
let { getServiceInfo, getServiceDetail, getServiceList, tableLinkList, serviceSave, showSave, filterSave, exportSave } = meta; let {getServiceInfo, getServiceDetail, getServiceList, tableLinkList, serviceSave, showSave, filterSave, exportSave, detailSave} = meta;
let {showOk} = red let {showOk} = red
var vm = new Vue({ var vm = new Vue({
@@ -294,7 +324,8 @@
shows: [], shows: [],
exports: [], exports: [],
imports: [], imports: [],
filters: [{name: '', label: '', filterType: ['']}] filters: [{name: '', label: '', filterType: ['']}],
details: [],
}, },
serviceDetail: {tables: {a: {items: []}}}, serviceDetail: {tables: {a: {items: []}}},
@@ -312,7 +343,7 @@
filters: [],//查询配置 filters: [],//查询配置
status: 0, //页面默认状态 status: 0, //页面默认状态 0:默认 3:导出 4:导入 5:列表配置 6:查询配置 detail:详情配置 form:表单配置 del:删除策略配置
services: [],//业务列表 services: [],//业务列表
service: "", //页面选择的业务类型 service: "", //页面选择的业务类型
table: "",//表别名 table: "",//表别名
@@ -329,6 +360,9 @@
//exports //exports
exportArr: [], exportArr: [],
//details
detailArr: [],
}, },
watch: { watch: {
status: function (v) { status: function (v) {
@@ -364,9 +398,16 @@
exportArr.push(v['exports'][i]['col']) exportArr.push(v['exports'][i]['col'])
} }
this.exportArr = exportArr this.exportArr = exportArr
//details
let detailArr = []
for (let i in v['details']) {
detailArr.push(v['details'][i]['col'])
}
this.detailArr = detailArr
}, },
serviceDetail: function (v) { serviceDetail: function (v) {
var arr = []; let arr = [];
for (k in v.tables) { for (k in v.tables) {
arr.push(k); arr.push(k);
} }
@@ -428,11 +469,15 @@
if (!shows[j]['label']) { if (!shows[j]['label']) {
shows[j]['label'] = this.getFieldLabel(v[i]) shows[j]['label'] = this.getFieldLabel(v[i])
} }
if (!shows[j]['fmt']) {
shows[j]['fmt'] = this.getFiledInExt(v[i])
}
continue a continue a
} }
} }
let label = this.getFieldLabel(v[i]) let label = this.getFieldLabel(v[i])
shows.push({col: v[i], label: label}) let fmt = this.getFiledInExt(v[i])
shows.push({col: v[i], label: label, fmt: fmt})
} }
//去除删除的 //去除删除的
@@ -477,12 +522,59 @@
} }
this.serviceInfo.exports = _exports this.serviceInfo.exports = _exports
},
detailArr(v) {
let details = this.serviceInfo.details
//添加新增的
a:for (let i in v) {
b:for (let j in details) {
if (v[i] == details[j]['col']) {
if (!details[j]['label']) {
details[j]['label'] = this.getFieldLabel(v[i])
}
if (!details[j]['fmt']) {
details[j]['fmt'] = this.getFiledInExt(v[i])
}
continue a
}
}
// 新的
let label = this.getFieldLabel(v[i])
let fmt = this.getFiledInExt(v[i])
c:for (let j in details) {
if (v[i] == details[j]['col']) {
if (details[j]['label']) {
label = details[j]['label']
console.log(label)
}
if (details[j]['fmt']) {
fmt = details[j]['fmt']
}
continue c
}
}
details.push({col: v[i], label: label, fmt: fmt})
}
//去除删除的
let _details = []
a:for (let i in details) {
b:for (let j in v) {
if (details[i]['col'] == v[j]) {
_details.push(details[i])
continue a;
}
}
}
this.serviceInfo.details = _details
} }
}, },
methods: { methods: {
loadInfo(name) { loadInfo(name) {
getServiceInfo({name}, (json) => { getServiceInfo({name}, (json) => {
vm.serviceInfo = json; this.serviceInfo = json;
}) })
}, },
loadDetail(name) { loadDetail(name) {
@@ -495,30 +587,48 @@
vm.services = json; vm.services = json;
}); });
}, },
getFieldLabel: function (col) { getField: function (col) {
if (!col) { if (!col) {
return ""; return ""
} }
let tableInfo = vm.serviceDetail['tables'][col.split("$")[0]]; let tableInfo = vm.serviceDetail['tables'][col.split("$")[0]];
if (tableInfo) { if (tableInfo) {
for (let i = 0; i < tableInfo.items.length; i++) { for (let i = 0; i < tableInfo.items.length; i++) {
if (tableInfo.items[i].name == col.split("$")[1]) { if (tableInfo.items[i].name == col.split("$")[1]) {
return tableInfo.items[i].label; return tableInfo.items[i];
} }
} }
} }
return ''; return ""
},
getFieldLabel: function (col) {
let field = this.getField(col)
if (!field) {
return ""
}
return field["label"]
},
getFiledInExt: function (col) {
let field = this.getField(col)
if (!field) {
return ""
}
return field["inExt"]
}, },
setMove: function () { setMove: function () {
$(`#filter>table>tbody, $(`#filter>table>tbody,
#show>table>tbody, #show>table>tbody,
#export>table>tbody, #export>table>tbody,
#detail>table>tbody,
#show>table>tbody`).sortable({ #show>table>tbody`).sortable({
selector: 'tr', selector: 'tr',
trigger: '.icon', trigger: '.icon',
finish: function (e) {} finish: function (e) {
}
}); });
@@ -526,37 +636,17 @@
$('#sortableList,table>tbody').sortable({ $('#sortableList,table>tbody').sortable({
selector: '.list-group-item, tr', selector: '.list-group-item, tr',
finish: function (e) { finish: function (e) {
var rows = e.list; let rows = e.list;
vm.itemSort = []; vm.itemSort = [];
for (var i = 0; i < rows.length; i++) { for (let i = 0; i < rows.length; i++) {
var item = $(rows[i]).find("input[name='name']").val(); let item = $(rows[i]).find("input[name='name']").val();
vm.itemSort.push(item); vm.itemSort.push(item);
} }
}, },
// 设置更多选项... // 设置更多选项...
}); });
}
else if (this.status == 5) {
/*$('#show>table>tbody').sortable({
selector: 'tr',
trigger: '.icon',
finish: function (e) {}
});*/
} else if (this.status == 4) { } else if (this.status == 4) {
$('#import>table>tbody').sortable({ $('#import>table>tbody').sortable({
selector: 'tr',
finish: function (e) {
var rows = e.list;
var shows = [];
for (var i = 0; i < rows.length; i++) {
var item = $(rows[i]).find("input[name='name']").val();
shows.push(item);
}
vm.serviceInfo.imports = shows;
}
});
} else if (this.status == 3) {
/*$('#export>table>tbody').sortable({
selector: 'tr', selector: 'tr',
finish: function (e) { finish: function (e) {
let rows = e.list; let rows = e.list;
@@ -565,20 +655,11 @@
let item = $(rows[i]).find("input[name='name']").val(); let item = $(rows[i]).find("input[name='name']").val();
shows.push(item); shows.push(item);
} }
vm.serviceInfo.exports = shows; vm.serviceInfo.imports = shows;
} }
});*/ });
} } else {
else if (this.status == 6) { //$('table>tbody').sortable('destroy');
/*$('#filter>table>tbody').sortable({
selector: 'tr',
trigger: '.icon',
finish: function (e) {}
});*/
}
else {
$('table>tbody').sortable('destroy');
} }
}, },
/** /**
@@ -607,15 +688,12 @@
serviceKey: vm.table, serviceKey: vm.table,
items: JSON.stringify(vm.itemSort) items: JSON.stringify(vm.itemSort)
}).then(() => showOk()); }).then(() => showOk());
} } else if (vm.status == 2 && vm.itemEdit.length > 0) {
else if (vm.status == 2 && vm.itemEdit.length > 0) {
red.postX("/meta/itemupdate", { red.postX("/meta/itemupdate", {
serviceKey: vm.table, serviceKey: vm.table,
items: JSON.stringify(vm.itemEdit) items: JSON.stringify(vm.itemEdit)
}).then(() => showOk()); }).then(() => showOk());
} } else if (/*vm.status == 3 ||*/ vm.status == 4 /*|| vm.status == 5*/) {
else if (/*vm.status == 3 ||*/ vm.status == 4 /*|| vm.status == 5*/) {
var urls = {3: "/meta/exportsort", 4: "/meta/importsort", 5: "/meta/showsort"}; var urls = {3: "/meta/exportsort", 4: "/meta/importsort", 5: "/meta/showsort"};
var items = {3: vm.serviceInfo.exports, 4: vm.serviceInfo.imports, 5: vm.serviceInfo.shows}; var items = {3: vm.serviceInfo.exports, 4: vm.serviceInfo.imports, 5: vm.serviceInfo.shows};
@@ -625,21 +703,18 @@
serviceKey: this.service, serviceKey: this.service,
items: dataStr items: dataStr
}).then(() => showOk()); }).then(() => showOk());
} } else if (vm.status == 5) {
else if (vm.status == 5) {
let doms = $("#show>table>tbody>tr") let doms = $("#show>table>tbody>tr")
let shows = [] let shows = []
for (let i = 0; i < doms.length; i++) { for (let i = 0; i < doms.length; i++) {
let col = $(doms[i]).find("input[name='col']").val(); let item = $(doms[i]).find("input[name='item']").val();
let label = $(doms[i]).find("input[name='label']").val(); shows.push(JSON.parse(item))
shows.push({col, label})
} }
showSave({name: this.service, shows}).then(res => {red.showOk()}) showSave({name: this.service, shows}).then(res => {
} red.showOk()
})
else if (vm.status == 6) { } else if (vm.status == 6) {
let doms = $("#filter>table>tbody>tr") let doms = $("#filter>table>tbody>tr")
let filters = [] let filters = []
for (let i = 0; i < doms.length; i++) { for (let i = 0; i < doms.length; i++) {
@@ -647,8 +722,7 @@
filters.push(JSON.parse(item)) filters.push(JSON.parse(item))
} }
filterSave({name: this.service, filters}).then(res => red.showOk()) filterSave({name: this.service, filters}).then(res => red.showOk())
} } else if (vm.status == 3) {
else if (vm.status == 3) {
let doms = $("#export>table>tbody>tr") let doms = $("#export>table>tbody>tr")
let exports = [] let exports = []
for (let i = 0; i < doms.length; i++) { for (let i = 0; i < doms.length; i++) {
@@ -656,14 +730,19 @@
exports.push(JSON.parse(item)) exports.push(JSON.parse(item))
} }
exportSave({name: this.service, exports}).then(res => red.showOk()) exportSave({name: this.service, exports}).then(res => red.showOk())
} else if (vm.status == 'detail') {
let doms = $("#detail>table>tbody>tr")
let details = []
for (let i = 0; i < doms.length; i++) {
let item = $(doms[i]).find("input[name='item']").val();
details.push(JSON.parse(item))
} }
console.log(details)
else if (vm.status == 7) { detailSave({name: this.service, details}).then(res => red.showOk())
} 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())
} } else {
else {
red.showMsg(); red.showMsg();
} }
}, },

View File

@@ -202,7 +202,7 @@ public final class MetaKit {
List<Map<String, String>> shows = metaService.getShows(); List<Map<String, String>> shows = metaService.getShows();
//List<Map> edits = metaService.getEdits(); //List<Map> edits = metaService.getEdits();
List<String> details = metaService.getDetails(); List<Map<String, String>> details = metaService.getDetails();
List<Filter> filters = metaService.getFilters(); List<Filter> filters = metaService.getFilters();
String comment = metaService.getComment(); String comment = metaService.getComment();
@@ -292,13 +292,13 @@ public final class MetaKit {
});*/ });*/
//details //details
List _details = new ArrayList();//details; /*List _details = new ArrayList();//details;
details.forEach(x -> { details.forEach(x -> {
Kv kv = Kv.of(); Kv kv = Kv.of();
kv.set("col", x); kv.set("col", x);
_details.add(kv); _details.add(kv);
}); });*/
return Kv.of() return Kv.of()
.set("title", comment) .set("title", comment)
@@ -306,7 +306,7 @@ public final class MetaKit {
.set("shows", shows) .set("shows", shows)
.set("filters", _filters) .set("filters", _filters)
.set("edits", _edits) .set("edits", _edits)
.set("details", _details); .set("details", details);
} }
@Comment("获取导出excel表头配置k-v") @Comment("获取导出excel表头配置k-v")

View File

@@ -23,7 +23,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<String> details = new ArrayList<>(); private List<Map<String,String>> details = new ArrayList<>();
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<>();

View File

@@ -161,6 +161,17 @@ public class MetadataService extends BaseService { //arango
return JBean.OK; return JBean.OK;
} }
@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;
MetaService metaService = MetaKit.getMetaService(name, token);
metaService.setDetails(details);
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;