a-table 表格 (vue2)
基础用法
<template>
<div>
<a-table
ref="table"
:columns="columns"
:dataSource="dataSource"
bordered
rowKey="id"
:pagination="ipagination"
:loading="loading"
>
</a-table>
</div>
</template>
<script>
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
export default{
name: '',
mixins:[JeecgListMixin, mixinDevice],
data () {
columns: [
{
title:'',
align:"left",
dataIndex: ''
},
],
}
}
</script>
拓展
双击点开详情
<template>
<div>
<a-table
:customRow="customRow"
>
</a-table>
</div>
<Detail ref="modalForm" @ok="modalFormOk"></Detail>
</template>
<script>
methods: {
customRow(record, index) {
const that = this;
return {
on: {
dblclick: () => {
that.dblClickDetail(record, index);
}
}
};
},
}
</script>
标题左对齐文本右对齐
<script>
export default{
data () {
columns: [
{
title:'',
align:"left",
dataIndex: '',
// 文本右对齐
customCell: () => {
return {
style: {
'text-align': 'right'
}
};
}
},
],
}
}
</script>
添加操作按钮并放在列表最右边
<template>
<div>
<a-table>
<span slot="action" slot-scope="text, record">
<a @click="handleEdit(record)">编辑</a>
<a-divider type="vertical" />
<a-dropdown>
<a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
<a-menu slot="overlay">
<a-menu-item>
<a @click="handleDetail(record)">详情</a>
</a-menu-item>
<a-menu-item>
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
<a>删除</a>
</a-popconfirm>
</a-menu-item>
</a-menu>
</a-dropdown>
</span>
</a-table>
</div>
</template>
<script>
export default{
data () {
columns: [
{
title: '操作',
dataIndex: 'action',
align:"center",
fixed:"right",
scopedSlots: { customRender: 'action' }
}
],
}
}
</script>
列表可选择 (单选:radio 多选:checkbox)
<template>
<div>
<a-table
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}"
>
</a-table>
</div>
</template>
列表文本保留3位小数
<script>
import accounting from 'accounting';
export default{
data () {
columns: [
{
title:'',
align:"left",
dataIndex: '',
// 保留3位小数
customRender: function (text) {
return text ? accounting.formatNumber(text, 3) : ''
}
},
],
}
}
</script>
JeecgListMixin.js
import { filterObj } from "@/utils/util";
import { deleteAction, getAction, downFile } from "@/api/manage";
import Vue from "vue";
import { ACCESS_TOKEN } from "@/store/mutation-types";
import { getProjectFlow } from '@/api/api';
export const JeecgListMixin = {
data() {
return {
tokenHeader: { "X-Access-Token": Vue.ls.get(ACCESS_TOKEN) },
queryParam: {},
dataSource: [],
ipagination: {
current: 1,
pageSize: 10,
pageSizeOptions: ["10", "20", "30"],
showTotal: (total, range) => {
return range[0] + "-" + range[1] + " 共" + total + "条";
},
showQuickJumper: true,
showSizeChanger: true,
total: 0,
},
isorter: {
column: "createTime",
order: "desc",
},
filters: {},
loading: false,
selectedRowKeys: [],
selectionRows: [],
toggleSearchStatus: false,
superQueryFlag: false,
superQueryParams: "",
labelCol: {
xs: { span: 24 },
sm: { span: 8 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
},
disableMixinInitProject: true,
pageId: '',
pageUrl: '',
disableMixinWatch: false
};
},
computed: {
userInfo() {
return this.$store.getters.userInfo;
}
},
watch: {
$route(to, from) {
if (!this.disableMixinWatch) {
if (to.path.startsWith(this.pageUrl)) {
let param = this.$store.getters.routerParam || {}
if (param[this.pageId]) {
this.initQueryParam()
this.loadData();
}
}
}
}
},
created() {
if (!this.disableMixinCreated) {
console.log(" -- mixin created -- ");
if (!this.disableMixinInitProject) {
this.queryParam.projectCode = this.userInfo.projectCode
}
this.initQueryParam()
this.loadData();
this.initDictConfig();
}
this.pageUrl = this.$router.currentRoute.path
},
methods: {
initQueryParam() {
if (this.pageId) {
let param = this.$store.getters.routerParam || {}
if (param[this.pageId]) {
this.queryParam = Object.assign(this.queryParam, param[this.pageId])
param[this.pageId] = {}
this.$store.commit('SET_ROUTER_PARAM', param)
}
}
},
initColumns() {
var key = this.$route.name + ':colsettings';
let colSettings = Vue.ls.get(key);
if (colSettings == null || colSettings === undefined) {
let allSettingColumns = [];
this.defColumns.forEach(function (item, i, array) {
allSettingColumns.push(item.dataIndex);
})
this.settingColumns = allSettingColumns;
this.columns = this.defColumns;
} else {
this.settingColumns = colSettings;
const cols = this.defColumns.filter(item => {
if (item.key === 'rowIndex' || item.dataIndex === 'action') {
return true;
}
if (colSettings.includes(item.dataIndex)) {
return true;
}
return false;
})
this.columns = cols;
}
},
onColSettingsChange (checkedValues) {
var key = this.$route.name + ':colsettings';
Vue.ls.set(key, checkedValues, 7 * 24 * 60 * 60 * 1000)
this.settingColumns = checkedValues;
const cols = this.defColumns.filter(item => {
if (item.key === 'rowIndex' || item.dataIndex === 'action') {
return true
}
if (this.settingColumns.includes(item.dataIndex)) {
return true
}
return false
})
this.columns = cols;
},
loadData(arg) {
if (!this.url.list) {
console.error("请设置url.list属性!", this.url)
return;
}
if (arg === 1) {
this.ipagination.current = 1;
}
var params = this.getQueryParams();
this.loading = true;
const that = this;
getAction(this.url.list, params).then((res) => {
if (res.success) {
that.loadDataAfter(res.result.records);
this.dataSource = res.result.records;
this.ipagination.total = res.result.total;
}
if (res.code === 510) {
this.$message.warning(res.message);
}
this.loading = false;
});
},
loadDataAfter(data){
this.onClearSelected();
},
initDictConfig() {
console.log("--这是一个假的方法!");
},
handleSuperQuery(params, matchType) {
if(!params){
this.superQueryParams=''
this.superQueryFlag = false
}else{
this.superQueryFlag = true
this.superQueryParams=JSON.stringify(params)
this.superQueryMatchType = matchType
}
this.loadData(1)
},
getQueryParams() {
let sqp = {};
if (this.superQueryParams){
sqp['superQueryParams']=encodeURI(this.superQueryParams)
sqp['superQueryMatchType'] = this.superQueryMatchType
}
var param = Object.assign(
sqp,
this.queryParam,
this.isorter,
this.filters
);
param.field = this.getQueryField();
param.pageNo = this.ipagination.current;
param.pageSize = this.ipagination.pageSize;
return filterObj(param);
},
getQueryField() {
var str = "id,";
this.columns.forEach(function (value) {
str += "," + value.dataIndex;
});
return str;
},
onSelectChange(selectedRowKeys, selectionRows) {
this.selectedRowKeys = selectedRowKeys;
this.selectionRows = selectionRows;
},
onClearSelected() {
this.selectedRowKeys = [];
this.selectionRows = [];
},
searchQuery() {
this.loadData(1);
},
superQuery() {
this.$refs.superQueryModal.show();
},
searchReset() {
this.queryParam = {};
if (!this.disableMixinInitProject) {
this.queryParam.projectCode = this.userInfo.projectCode
}
this.loadData(1);
},
batchDel: function (validFun) {
if (!this.url.deleteBatch) {
this.$message.error("请设置url.deleteBatch属性!");
return;
}
if (this.selectedRowKeys.length <= 0) {
this.$message.warning("请选择一条记录!");
return;
} else {
if (validFun && typeof validFun === "function") {
if (!validFun()) {
return;
}
}
var ids = "";
for (var a = 0; a < this.selectedRowKeys.length; a++) {
ids += this.selectedRowKeys[a] + ",";
}
var that = this;
this.$confirm({
title: "确认删除",
content: "是否删除选中数据?",
onOk: function () {
that.loading = true;
deleteAction(that.url.deleteBatch, { ids: ids })
.then((res) => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
} else {
that.$message.warning(res.message);
}
})
.finally(() => {
that.loading = false;
});
},
});
}
},
handleDelete: function (id) {
if (!this.url.delete) {
this.$message.error("请设置url.delete属性!");
return;
}
var that = this;
deleteAction(that.url.delete, { id: id }).then((res) => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
} else {
that.$message.warning(res.message);
}
});
},
handleView: function (record) {
this.$refs.modalForm.mode = 1;
this.$refs.modalForm.edit(record);
this.$refs.modalForm.title = "详情";
this.$refs.modalForm.disableSubmit = false;
},
handleEdit: function (record) {
this.$refs.modalForm.mode = 3;
this.$refs.modalForm.edit(record);
this.$refs.modalForm.title = "编辑";
this.$refs.modalForm.disableSubmit = false;
},
handleAdd: function () {
this.$refs.modalForm.mode = 2;
this.$refs.modalForm.add();
this.$refs.modalForm.title = "新增";
this.$refs.modalForm.disableSubmit = false;
},
handleTableChange(pagination, filters, sorter) {
if (Object.keys(sorter).length > 0) {
this.isorter.column = sorter.field;
this.isorter.order = "ascend" == sorter.order ? "asc" : "desc";
}
this.ipagination = pagination;
this.loadData();
},
handleToggleSearch() {
this.toggleSearchStatus = !this.toggleSearchStatus;
},
modalFormOk() {
this.loadData();
},
handleDetail: function (record) {
this.$refs.modalForm.mode = 1;
this.$refs.modalForm.edit(record);
this.$refs.modalForm.title = "详情";
this.$refs.modalForm.disableSubmit = true;
},
handleExportXls2() {
let paramsStr = encodeURI(JSON.stringify(this.getQueryParams()));
let url = `${window._CONFIG["domianURL"]}/${this.url.exportXlsUrl}?paramsStr=${paramsStr}`;
window.location.href = url;
},
handleExportXls(fileName) {
if (!fileName || typeof fileName != "string") {
fileName = "导出文件";
}
let sqp = {};
if (this.superQueryParams) {
sqp["superQueryParams"] = encodeURI(this.superQueryParams);
}
var param = Object.assign(
sqp,
this.queryParam,
this.isorter,
this.filters
);
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
param["selections"] = this.selectedRowKeys.join(",");
}
console.log("导出参数", param);
downFile(this.url.exportXlsUrl, param).then((data) => {
if (!data) {
this.$message.warning("文件下载失败");
return;
}
if (typeof window.navigator.msSaveBlob !== "undefined") {
window.navigator.msSaveBlob(new Blob([data]), fileName + ".xls");
} else {
let url = window.URL.createObjectURL(new Blob([data]));
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", fileName + ".xls");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
}
});
},
handleImportExcel(info) {
if (info.file.status !== "uploading") {
console.log(info.file, info.fileList);
}
if (info.file.status === "done") {
if (info.file.response.success) {
if (info.file.response.code === 201) {
let {
message,
result: { msg, fileUrl, fileName },
} = info.file.response;
let href = window._CONFIG["domianURL"] + fileUrl;
this.$warning({
title: message,
content: (
<div>
<span>{msg}</span>
<span>
具体详情请{" "}
<a href={href} target="_blank" download={fileName}>
点击下载
</a>{" "}
</span>
</div>
),
});
} else {
this.$message.success(
info.file.response.message || `${info.file.name} 文件上传成功`
);
}
this.loadData();
} else {
this.$message.error(
`${info.file.name} ${info.file.response.message}.`
);
}
} else if (info.file.status === "error") {
this.$message.error(`文件上传失败: ${info.file.msg} `);
}
},
getImgView(text) {
if (text && text.indexOf(",") > 0) {
text = text.substring(0, text.indexOf(","));
}
return window._CONFIG["fileDomainURL"] + "/mbp/common/static/" + text;
},
uploadFile(text) {
if (!text) {
this.$message.warning("未知的文件");
return;
}
if (text.indexOf(",") > 0) {
text = text.substring(0, text.indexOf(","));
}
window.open(window._CONFIG["fileDomainURL"] + "/download/" + text);
},
customRow(record, index) {
const that = this;
return {
on: {
dblclick: () => {
that.dblClickDetail(record, index);
},
},
};
},
dblClickDetail(record, index) {
this.handleEdit(record);
},
async getApproveType(params) {
let param = {
projectCode: params.projectCode,
url: this.$router.currentRoute.path
}
let res = await getAction('/sysconstant/projectFlow/F1590094/list', param)
if (!res.success) {
if (!param.skipMessage) {
this.$message.warning(res.message);
}
return res
}
if (res.result.total === 0) {
if (!param.skipMessage) {
this.$message.warning('请先设置项目流程!');
}
res.message = '请先设置项目流程!'
res.success = false
return res
}
res.approvalType = res.result.records[0].approvalType
if (this.selectionRows.length > 0 && res.approvalType === 'S') {
if (!param.skipMessage) {
let checkRes = await this.checkApproveType(this.selectionRows)
if (!checkRes.success) {
return checkRes;
}
}
}
return res
},
async checkApproveType(selectionRows) {
let projectCodeList = []
let projectNameList = []
for (let row of selectionRows) {
if (row.projectCode && !projectCodeList.includes(row.projectCode)) {
projectCodeList.push(row.projectCode)
projectNameList.push(row.projectCode_dictText || row.projectName || row.projectCode)
}
}
if (projectCodeList.length === 0) {
return { success: true }
}
let param = {
projectCode: projectCodeList.join(','),
url: this.$router.currentRoute.path
}
let res = await getAction('/sysconstant/projectFlow/F1590094/list', param)
if (!res.success) {
this.$message.warning(res.message);
return res
}
if (res.result.total !== projectCodeList.length) {
let errLst = projectNameList.filter(code => res.result.records.filter(r2 => r2.projectCode === code).length === 0)
this.$message.warning(`请先设置项目流程(${errLst.join(',')})!`);
res.success = false
return res
}
if (res.result.records.filter(r => r.approvalType !== 'S').length > 0) {
this.$message.warning(`非系统界面审批不能批量操作!`);
res.success = false
return res
}
res.approvalType = res.result.records[0].approvalType
return res
}
}
};