表格类
1 构造者函数+基本功能
class ListDataCls {
constructor(config) {
if (Reflect.has(config, 'isChart')) {
this.isChart = false;
this.charts = null;
}
deepAssign(this, config);
}
async getBaseInfo(params, setting = {}) {}
getListData() {}
setBaseData(table, setting = {}) {}
initFullData() {}
changePageNum(page) {}
changePageSize(pageSize) {}
changeTableSort(sortdata, tabledata) {}
changeSelections(selection) {}
}
1. 引入常量
const TABLE_TIPS = {
default: '暂无数据',
loading: '数据查询中',
fail: '数据加载失败'
};
const API_CODE = {
success: 1,
noPermission: 403
};
const appTrackMessage = {
error(err, errSymbol) {
Message.error(`${err instanceof Error ? err.message : err} (错误码${errSymbol})`);
},
warning(err, errSymbol) {
Message.warning(`${err instanceof Error ? err.message : err} (警告码${errSymbol})`);
}
};
2. 公共字段
title = '';
permitted = true;
tips = '暂无数据';
apis = { list: '' };
query = {
dataKey: 'list_data',
queryId: null,
queryKey: ''
queryParams: {};
};
remarks = {
enable: true,
editable: false,
dynamic: false,
data: ''
};
tables = {
visible: true,
isSetColumns: false,
isIview: false,
isFootOnTop: true,
isFullData: false,
meaningFieldsMap: {},
fieldsSort: []
};
columns = [];
data = [];
footData = [];
showData = [];
selections = [];
tableSort = {
isRemote: false,
order: '',
which: null
};
pages = {
enable: true,
pageType: null,
current: 1,
size: 30,
sizeOptions: [10, 20, 30, 50, 100, 200, 500, 1000],
total: 0,
isShowTotal: true
};
2 事件处理程序
1. 对象属性合并
function deepAssign(target, ...sources) {
for (const source of sources) {
for (const key in source) {
if (Util.typeOf(target[key]) === 'object') {
deepAssign(target[key], source[key]);
} else {
target[key] = source[key];
}
}
}
return target;
}
2. 响应数据预处理
function _successResolve() {
return true;
}
3. 检查表格的填充条目是否数组
checkRawTableRowIsArray(data) {
for (let i in data) {
return Array.isArray(data[i]);
}
return false;
}
4. 使用iview的table && 单条表格数据是数组时,需变为对象
tableDataToObj(data, backData = []) {
data.forEach(item => {
let child = {};
item.forEach((item, index) => {
child['key' + index] = item;
});
backData.push(child);
});
return backData;
}
5. 字符串提取数字:(==='-' => 0,/^[0-9]%$/.test()
截取到%之前)
extractNumber(num) {
if (num === '-') {
return 0;
} else if (/(\d+)(%)/.test(String(num))) {
return parseFloat(num.substring(0, String(num).indexOf('%')));
} else if (/^(\d+)(~)(\d+)/.test(String(num))) {
return parseFloat(num.substring(0, String(num).indexOf('~')));
} else if (/^(\d+)(%)(~)(\d+)/.test(String(num))) {
return parseFloat(num.substring(0, String(num).indexOf('~')));
} else {
return num;
}
}
6. 字符串排序
function sortString(a, b) {
if (String(a) < String(b)) {
return -1;
} else if (String(a) > String(b)) {
return 1;
} else {
return 0;
}
}
3 处理应用程序逻辑具体实现
1. 获取接口基本信息
async getBaseInfo(params, setting = {}) {
const { isSetColumns } = setting;
let reqConfig = {};
params && (reqConfig.params = params);
const { data: result } = await $axios.get(this.apis.list, reqConfig).catch(err => {
Message.error('getApiInfo请求出错!');
throw err;
});
if (result.code === API_CODE.success) {
const table = result.data;
isSetColumns && this.setColumns(table.fields, table.fields_sort, this.meaningFieldsMap);
} else if (result.code === API_CODE.noPermission) {
this.isPermission = false;
throw new Error(result.msg);
} else {
Message.warning(result.msg);
throw new Error(result.msg);
}
return result;
}
2. 请求页面数据
getListData(url, setting) {
return this.getListDataCore(url, setting);
}
getListDataCore(url = this.apis.list, setting = {}) {
const { noVerify, noSpin } = setting;
const requestConfig = { noSpin };
let params = {
page_num: this.pages.current,
page_size: this.pages.size
};
if (this.tableSort.order) {
params.sort_type = this.tableSort.order;
params.sort_index = this.tableSort.which;
}
if (this.isChart) {
params.is_chart = 1;
}
Object.assign(params, this.query.queryParams)
if (!noVerify && !this.verify(params)) {
return Promise.reject(new Error('验证不通过'));
}
this.selections = [];
this.tips = TABLE_TIPS.loading;
if (this.isChart) {
this.charts.setStatusCode(1);
}
return await getDataListFunc(url, params, requestConfig, setting)
}
async getDataListFunc(url, params, requestConfig, setting = {}) {
try {
let { data: result } = await $axios.post(url, params, requestConfig);
let isSecondaryError = result.code != API_CODE.success;
if (typeof result !== 'object') {
throw new Error('返回的数据格式错误!');
}
if (result.code === API_CODE.success) {
this.setListData(result, isSecondaryError, setting)
return result;
} else {
Message.warning(result.msg);
throw new Error(result.msg);
}
} catch(err) {
if (!$axios.isCancel(err)) {
appTrackMessage.error(err, 2);
}
throw err;
}
}
setListData(result, isSecondaryError, setting = {}) {
try {
let { successResolve = _successResolve } = setting
result.queryParams = params;
this.tips = TABLE_TIPS.default;
this.charts.setStatusCode(2);
if (!successResolve(result)) {
return result;
}
let table = result.data;
switch (true) {
case setting.onlyChartData:
table = this.charts.resolveChart(result);
break;
case this.isChart:
table = this.charts.resolveChart(result);
this.setBaseData(table, setting);
this.initFullData();
break;
case this.tables.isFullData || table.is_full_data:
this.setBaseData(table, setting);
this.initFullData();
break;
default:
this.setBaseData(table, setting);
this.setListShowData();
}
if (table.total_page > 1 && table[this.query.dataKey].length <= 0) {
Message.warning(result.msg);
}
return result;
} catch(err) {
if (isSecondaryError) {
this.tips = err.message;
} else {
this.tips = TABLE_TIPS.fail;
}
this.charts.setStatusCode(-1);
this.clearTable();
console.error(err);
}
}
clearTable() {
this.data = [];
this.footData = [];
this.showData = [];
this.overviews.fields = [];
this.overviews.data = [];
this.pages.total = 0;
}
3. 获取数据后,表格数据处理
setBaseData(table, setting = {}) {
const { isSetColumns = this.tables.isSetColumns } = setting;
const tableData = table[this.query.dataKey];
if (table.key_fields) {
this.meaningFieldsMap = table.key_fields;
}
if (isSetColumns) {
this.setColumns(table.fields, table.fields_sort, this.meaningFieldsMap);
}
if (this.tables.isIview && this.checkRawTableRowIsArray(tableData)) {
this.data = ListDataCls.tableDataToObj(tableData);
this.footData = ListDataCls.tableDataToObj(table.foot_data);
} else {
this.data = tableData;
this.footData = table.foot_data;
}
}
4. 前端分页 展示数据初始化
initFullData() {
if (this.pages.enable) {
this.updateFullShowData(1);
} else {
this.setListShowData();
}
}
updateFullShowData(pageNum = this.pages.current) {
const start = (pageNum - 1) * this.pages.size;
const end = pageNum * this.pages.size;
this.setListShowData(this.data.slice(start, end));
}
setListShowData(data = this.data, footData = this.footData) {
if (footData) {
if (this.tables.isFootOnTop) {
this.showData = footData.concat(data);
} else {
this.showData = data.concat(footData);
}
} else {
this.showData = data;
}
}
5. 分页操作
changePageNum(page) {
this.pages.current = page;
if (this.isChart || this.tables.isFullData) {
this.updateFullShowData();
} else {
this.getListData(undefined, { isSetColumns: false });
}
}
changePageSize(pageSize) {
this.pages.size = pageSize;
if (this.pages.current === 1) this.changePageNum(1);
}
6. 表格排序
tableSortChange(sortdata, tabledata) {
let sortIndex = Reflect.has(sortdata, 'index') ? sortdata.index : sortdata.key;
if (!tabledata || tabledata.length === 0) return;
if (
this.tableSort.isRemote ||
(!this.isChart && !this.tables.isFullData && this.tables.fieldsSort.length > 0)
) {
this.sortTableRemotely(sortdata.order, sortIndex);
} else {
this.sortTableHandle(tabledata, sortdata.order, soetIndex)
}
}
sortTableRemotely(order, sortIndex) {
this.pages.current = 1;
this.tableSort.order = order;
this.tableSort.which = sortIndex;
this.getListData(undefined, { isSetColumns: false });
}
sortTableHandle(tabledata, order, sortIndex) {
let orderType = order == 'asc' ? 1 : order == 'desc' ? -1 : 0,
isnum = 0;
if (!isNaN(tabledata[Math.floor(tabledata.length / 2)][sortIndex])) {
isnum++;
} else {
var reg = /(\d+)(%)/,
reg2 = /^(\d+)(~)(\d+)/,
reg3 = /^(\d+)(%)(~)(\d+)/;
for (var i = 0; i < tabledata.length; i++) {
if (
tabledata[i][sortIndex] === '-' ||
reg.test(tabledata[i][sortIndex]) ||
reg2.test(tabledata[i][sortIndex]) ||
reg3.test(tabledata[i][sortIndex])
) {
isnum++;
break;
}
}
}
tableSortManually(orderType, tabledata, sortIndex, isnum);
if (this.isChart || this.tables.isFullData) {
this.pages.current = 1;
this.initFullData();
} else {
this.setListShowData();
}
}
tableSortManually(type, data, sortIndex, isnum) {
switch (type) {
case -1:
isnum > 0
? data.sort((a, b) => extractNumber(a[sortIndex]) - extractNumber(b[sortIndex]))
: data.sort((a, b) => sortString(a[sortIndex], b[sortIndex]));
break;
case 1:
isnum > 0
? data.sort((a, b) => extractNumber(b[sortIndex]) - extractNumber(a[sortIndex]))
: data.sort((a, b) => sortString(b[sortIndex], a[sortIndex]));
break;
default:
return false;
}
}
7. 表格复选
changeSelections(selections) {
this.selections = selections;
}
8. 清空表格数据
clearTable() {
this.data = [];
this.footData = [];
this.showData = [];
this.overviews.fields = [];
this.overviews.data = [];
this.pages.total = 0;
}
9. 重置表格排序
resetTableSort() {
this.pages.current = 1;
this.tableSort.order = '';
this.tableSort.which = null;
}
10. 应由外面赋值的方法
setColumns() {
console.warn('缺少自定义的 setColumns 方法');
}
setQueryParam(params) {
return params;
}
verify() {
return true;
}
setDownloadInfo(params, setting) {
const { noVerify } = setting;
if (!noVerify && !this.verify(params)) {
params.IS_STOP_DOWNLOAD = true;
return;
}
this.setQueryParam(params);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)