Files
meta-kit/root/metadata/dataList.html
lxyer 211e59ea3b 1、支持列表自定义表头
2、业务完事,代码优化
2019-04-23 20:54:42 +08:00

315 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<row class="data-list">
<div class="info">
<a @click="showInfo()" href="javascript:;"><i class="icon icon-info"></i></a>
</div>
<!-- info -->
<div class="modal fade" id="f-info">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">关闭</span></button>
<h4 class="modal-title">功能概览</h4>
</div>
<div class="modal-body" style="text-align: center">
<img src="../res/img/meta_flow.png">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<!--<h3>高级查询 - [测试用例]</h3>
<div class="col-md-6">
<select class="form-control" v-model="service" style="width: 300px;">
<option v-for="t in services" :value="t.name">{{t.comment}}&nbsp;&nbsp;&nbsp;[{{t.name}}]</option>
</select>
</div>-->
<!-- 业务列表 -->
<div class="col-md-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" >
<a @click="service=item.name" :title="`${item.name}`" v-text="`${item.name} [${item.comment}]`" href="javascript:;"></a>
</li>
</ul>
</div>
<!-- 预览功能 -->
<div class="col-md-10">
<div class="col-md-4 pull-right">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default" type="button">添加过滤条件</button>
</span>
<select class="form-control" v-model="addFilter" style="width: 130px;">
<option v-for="f in cfg.filters" :value="f.name" :disabled="f.checked">{{f.label}}</option>
</select>
<span class="input-group-btn">
<button @click="findList()" class="btn btn-primary" type="button"> 查询</button>
</span>
<span class="input-group-btn" style="padding-left: 10px">
<button @click="exportExcel" class="btn" type="button"> 导出</button>
</span>
</div>
</div>
<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="input-group item">
<span class="input-group-addon" style="width: 130px;">{{filter.label}}</span>
<select class="form-control" v-model="filter['type']" style="width: 100px">
<option v-for="(t, index) in filter.filterType" :value="t.name" v-text="t.remark"></option>
</select>
<span class="input-group-addon fix-border fix-padding"></span>
<input type="text" class="form-control" v-model="filter['value']">
<span class="input-group-addon fix-border fix-padding" style="padding: 5px" title="删除过滤条件">
<a href="javascript:;" @click="filter.checked = false;"><i class="icon icon-trash"></i></a>
</span>
</div>
</div>
<!-- 数据表格 -->
<div class="col-md-12" style="padding-top: 10px;overflow:auto;">
<table class="table table-bordered table-hover" style="width: 100%">
<thead>
<tr>
<th v-for="field in cfg.shows"
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}"
@click="sortEvent(field.col)"
>
</th>
</tr>
</thead>
<tbody>
<tr v-for="row in list.rows">
<td v-for="field in cfg.shows" v-title="dealField(row, field.col)" v-text="dealField(row, field.col)"></td>
</tr>
</tbody>
</table>
</div>
<div v-show="!list || list.rows == 0" style="text-align: center">
<img src="../res/img/none.png">
<p>暂无数据</p>
</div>
<div>
<ul class="pager pull-right" style="margin: 5px 10px">
<li class="previous">
<a style="border: 0;">共{{list.total}}条数据</a>
</li>
<li :class="['previous', {'disabled':limit.pn==1}]">
<a @click="findList(-- limit.pn)" href="javascript:;">«上一页</a>
</li>
<li :class="['next', {'disabled':limit.pn >= limit.total}]">
<a @click="findList(limit.pn = ++limit.pn )" href="javascript:;">»下一页</a>
</li>
<li class="previous">
<a style="border-bottom: 0;border-right: 0;border-top: 0;">到第<input v-model="limit.pn" style="width: 30px;height: 21px;">/ {{limit.total}}页</a>
</li>
<li class="previous">
<a @click="findList(limit.pn)" href="javascript:;">确定</a>
</li>
</ul>
</div>
</div>
</row>
<script>
let {getServiceList, getCfg, getDataList} = meta;
var vm = new Vue({
el:".data-list",
data: {
cfg:{
items:[],
shows: [],
filters: []
},
services:[],
service:"",
//tables: [],
//table: "",
//filters: [],
addFilter: "recompany",
para: {},
list: {rows:[], total:0},
limit: {pn: 1, ps: 10, total: 0},
order:{col:"id", desc:1}
},
watch: {
addFilter(v) {
this.cfg.filters.forEach(function (f) {
if (f.name == v) {
f["checked"] = true;
vm.addFilter = "";
}
})
},
service() {
this.loadCfg();
this.limit = {pn: 1, ps: 10, total: 0};
this.order = {col:"", desc:1};
this.findList();
},
list () {
let limit = this.limit;
let list = this.list;
let total = parseInt(list.total/limit.ps) + (list.total%limit.ps > 0 ? 1 : 0);
this.limit["total"] = total;
}
},
methods: {
findList() {
vm.list = {rows:[], total:0};
// filters
let filters = [];
//filters.push({col: "status", value: 9, type: "NOTEQUAL"});
for (i in this.cfg.filters) {
let filter = this.cfg.filters[i];
if (filter.checked && filter['value']) {
let {name: col, value, type} = filter;
filters.push({col, value, type});
}
}
// orders
let orders = [];
//截取真实字段名,(考虑如果多表关联情况,是否需要加入真实字段名)
if (vm.order.col) {
var end = vm.order.col.indexOf("\|");
if (end < 0) {
end = vm.order.col.indexOf("=")
}
var col = vm.order.col;
if (end > 0) {
col = vm.order.col.substring(0, end);
}
orders.push({col: col, desc: vm.order.desc});
}
// fbean
let fbean = {
name: this.service,
filters: filters,
orders: orders,
limit: vm.limit,
};
getDataList(fbean, json => {
console.log(json)
vm.list = json;
});
},
exportExcel() {
var data = [];
for (k in vm.para) {
if (vm.para[k] != '') {
var d = {};
d["col"] = k;
d["value"] = vm.para[k];
d["type"] = $("select[name=" + k + "_cate]").val();
data.push(d);
}
}
//data.push({col: "status", value: 9, type: "NOTEQUAL"});
var fBean = {
keyService: vm.table,
filters: data,
orders: [{col: "status", desc: -1}],
limit: {ps: 5}
}
location.href = "/export/data?fBean=" + JSON.stringify(fBean) + "&platToken=" + red.getPlatToken() + "&cate=csv";
return;
},
serviceList() {
getServiceList(json => {
vm.services = json;
vm.service = json[0].name;
});
},
loadCfg() {
getCfg({name: this.service}).then(res => this.cfg = res);
},
dealField(bean, field) {
var str = "";
if (!bean || !field) {
} else if (typeof(field) === 'function') {
str = field(bean);
} else if (field.indexOf("||") > 0) {//处理字典数据
var dic_type = field.split("||")[1];
var v = bean[field.split("||")[0]];
str = kvExtDeal(dic_type, v);
} else if (field.indexOf("|") > 0) {//处理字典数据
var dic_type = field.split("|")[1];
var v = bean[field.split("|")[0]];
str = v;//kvDeal(dic_type, v);
}
else if (field.indexOf("=") > 0) {//处理字典数据
var fun = field.split("=")[1];
var v = bean[field.split("=")[0]];
return v;
//eval("str =$funs."+ fun +"('"+ v +"')");
}
else if (field.indexOf("-") > 0) {
var name = field.split("-")[0];
var path = field.split("-")[1];
if (bean[name]) {
var href = config.services.issct + "/downLoadFdfs?fileId=" + encodeURI(bean[path]) + "&filename=" + encodeURI(bean[name]);
str = "<a href='" + href + "' target='_blank'>" + bean[name] + "</a>";
}
} else if (bean[field] === 0) { //特殊值 "0" 处理
str = "0";
} else if (bean[field] == "unknown") { //特殊值处理
str = "";
} else {
str = bean[field.replace('$', '.')] || "";
}
return str;
},
sortEvent(col) {
if (vm.order.col == col) {
vm.order.desc = -vm.order.desc
} else {
vm.order.col = col;
vm.order.desc = 1;
}
vm.findList();
},
getFieldLabel: function (col) {
if (!col) {
return "";
}
let items = this.cfg.items[col.split(".")[0]];
if (items) {
return items[col.split(".")[1]]['label']
}
return '';
},
showInfo() {
$('#f-info').modal({moveable: true})
}
},
mounted() {
this.serviceList();
}
});
</script>