(function () { var simpleEntityName = 'apiLog'; var entityName = 'ApiLog'; var primaryKeyField = 'id'; var fieldMeta = dedupeFieldMeta([ { field: 'id', columnName: 'id', label: 'ID', tableProp: 'id', exportField: 'id', kind: 'text', valueType: 'number', required: true, primaryKey: true, sortable: true, textarea: false, minWidth: 90, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'uuid', columnName: 'uuid', label: '日志编号', tableProp: 'uuid', exportField: 'uuid', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'namespace', columnName: 'namespace', label: '名称空间', tableProp: 'namespace', exportField: 'namespace', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'url', columnName: 'url', label: '接口地址', tableProp: 'url', exportField: 'url', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'appkey', columnName: 'appkey', label: '平台密钥', tableProp: 'appkey', exportField: 'appkey', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'timestamp', columnName: 'timestamp', label: '时间戳', tableProp: 'timestamp', exportField: 'timestamp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'clientIp', columnName: 'client_ip', label: '客户端IP', tableProp: 'clientIp', exportField: 'clientIp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'request', columnName: 'request', label: '请求内容', tableProp: 'request', exportField: 'request', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'response', columnName: 'response', label: '响应内容', tableProp: 'response', exportField: 'response', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'err', columnName: 'err', label: '异常内容', tableProp: 'err', exportField: 'err', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'result', columnName: 'result', label: '结果', tableProp: 'result', exportField: 'result', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'status', columnName: 'status', label: '状态', tableProp: 'status', exportField: 'status', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'createTime', columnName: 'create_time', label: '添加时间', tableProp: 'createTime$', exportField: 'createTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'updateTime', columnName: 'update_time', label: '修改时间', tableProp: 'updateTime$', exportField: 'updateTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'memo', columnName: 'memo', label: '备注', tableProp: 'memo', exportField: 'memo', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'id', columnName: 'id', label: 'ID', tableProp: 'id', exportField: 'id', kind: 'text', valueType: 'number', required: true, primaryKey: true, sortable: true, textarea: false, minWidth: 90, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'uuid', columnName: 'uuid', label: '日志编号', tableProp: 'uuid', exportField: 'uuid', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'namespace', columnName: 'namespace', label: '名称空间', tableProp: 'namespace', exportField: 'namespace', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'url', columnName: 'url', label: '接口地址', tableProp: 'url', exportField: 'url', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'appkey', columnName: 'appkey', label: '平台密钥', tableProp: 'appkey', exportField: 'appkey', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'timestamp', columnName: 'timestamp', label: '时间戳', tableProp: 'timestamp', exportField: 'timestamp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'clientIp', columnName: 'client_ip', label: '客户端IP', tableProp: 'clientIp', exportField: 'clientIp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'request', columnName: 'request', label: '请求内容', tableProp: 'request', exportField: 'request', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'response', columnName: 'response', label: '响应内容', tableProp: 'response', exportField: 'response', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'err', columnName: 'err', label: '异常内容', tableProp: 'err', exportField: 'err', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'result', columnName: 'result', label: '结果', tableProp: 'result', exportField: 'result', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'status', columnName: 'status', label: '状态', tableProp: 'status', exportField: 'status', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'createTime', columnName: 'create_time', label: '添加时间', tableProp: 'createTime$', exportField: 'createTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'updateTime', columnName: 'update_time', label: '修改时间', tableProp: 'updateTime$', exportField: 'updateTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'memo', columnName: 'memo', label: '备注', tableProp: 'memo', exportField: 'memo', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'id', columnName: 'id', label: 'ID', tableProp: 'id', exportField: 'id', kind: 'text', valueType: 'number', required: true, primaryKey: true, sortable: true, textarea: false, minWidth: 90, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'uuid', columnName: 'uuid', label: '日志编号', tableProp: 'uuid', exportField: 'uuid', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'namespace', columnName: 'namespace', label: '名称空间', tableProp: 'namespace', exportField: 'namespace', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'url', columnName: 'url', label: '接口地址', tableProp: 'url', exportField: 'url', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'appkey', columnName: 'appkey', label: '平台密钥', tableProp: 'appkey', exportField: 'appkey', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'timestamp', columnName: 'timestamp', label: '时间戳', tableProp: 'timestamp', exportField: 'timestamp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'clientIp', columnName: 'client_ip', label: '客户端IP', tableProp: 'clientIp', exportField: 'clientIp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'request', columnName: 'request', label: '请求内容', tableProp: 'request', exportField: 'request', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'response', columnName: 'response', label: '响应内容', tableProp: 'response', exportField: 'response', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'err', columnName: 'err', label: '异常内容', tableProp: 'err', exportField: 'err', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'result', columnName: 'result', label: '结果', tableProp: 'result', exportField: 'result', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'status', columnName: 'status', label: '状态', tableProp: 'status', exportField: 'status', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'createTime', columnName: 'create_time', label: '添加时间', tableProp: 'createTime$', exportField: 'createTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'updateTime', columnName: 'update_time', label: '修改时间', tableProp: 'updateTime$', exportField: 'updateTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'memo', columnName: 'memo', label: '备注', tableProp: 'memo', exportField: 'memo', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'id', columnName: 'id', label: 'ID', tableProp: 'id', exportField: 'id', kind: 'text', valueType: 'number', required: true, primaryKey: true, sortable: true, textarea: false, minWidth: 90, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'uuid', columnName: 'uuid', label: '日志编号', tableProp: 'uuid', exportField: 'uuid', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'namespace', columnName: 'namespace', label: '名称空间', tableProp: 'namespace', exportField: 'namespace', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'url', columnName: 'url', label: '接口地址', tableProp: 'url', exportField: 'url', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'appkey', columnName: 'appkey', label: '平台密钥', tableProp: 'appkey', exportField: 'appkey', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'timestamp', columnName: 'timestamp', label: '时间戳', tableProp: 'timestamp', exportField: 'timestamp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'clientIp', columnName: 'client_ip', label: '客户端IP', tableProp: 'clientIp', exportField: 'clientIp', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'request', columnName: 'request', label: '请求内容', tableProp: 'request', exportField: 'request', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'response', columnName: 'response', label: '响应内容', tableProp: 'response', exportField: 'response', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'err', columnName: 'err', label: '异常内容', tableProp: 'err', exportField: 'err', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'result', columnName: 'result', label: '结果', tableProp: 'result', exportField: 'result', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'status', columnName: 'status', label: '状态', tableProp: 'status', exportField: 'status', kind: 'text', valueType: 'number', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 110, enumOptions: [], foreignQuery: '', checkboxActiveRaw: '1', checkboxInactiveRaw: '0' }, { field: 'createTime', columnName: 'create_time', label: '添加时间', tableProp: 'createTime$', exportField: 'createTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'updateTime', columnName: 'update_time', label: '修改时间', tableProp: 'updateTime$', exportField: 'updateTime$', kind: 'date', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: false, minWidth: 168, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' }, { field: 'memo', columnName: 'memo', label: '备注', tableProp: 'memo', exportField: 'memo', kind: 'text', valueType: 'string', required: false, primaryKey: false, sortable: false, textarea: true, minWidth: 180, enumOptions: [], foreignQuery: '', checkboxActiveRaw: 'Y', checkboxInactiveRaw: 'N' } ]); function formatFieldLabel(field) { var raw = field && field.label ? String(field.label).trim() : ''; if (raw) { return raw; } raw = field && field.columnName ? field.columnName : (field && field.field ? field.field : ''); if (!raw) { return ''; } raw = String(raw) .replace(/\$/g, '') .replace(/([a-z0-9])([A-Z])/g, '$1_$2') .replace(/_/g, ' ') .replace(/\s+/g, ' ') .trim(); return raw.replace(/\b[a-z]/g, function (letter) { return letter.toUpperCase(); }); } function dedupeFieldMeta(list) { var result = []; var seen = {}; (list || []).forEach(function (field) { if (!field || !field.field || seen[field.field]) { return; } field.label = formatFieldLabel(field); seen[field.field] = true; result.push(field); }); return result; } function isEmptyValue(value) { return value === null || value === undefined || value === ''; } function stringValue(value) { return isEmptyValue(value) ? '' : String(value); } function valueOrDash(value) { return isEmptyValue(value) ? '--' : value; } function normalizeOptionValue(field, rawValue) { if (rawValue === null || rawValue === undefined) { return null; } if (rawValue === '') { return ''; } if (field && field.valueType === 'number') { var numberVal = Number(rawValue); return isNaN(numberVal) ? rawValue : numberVal; } return String(rawValue); } function isSearchableField(field) { return !!field && field.kind !== 'image' && !field.textarea; } function isSortableField(field) { if (!field) { return false; } if (field.primaryKey) { return true; } return field.kind !== 'image' && !field.textarea && field.kind !== 'foreign'; } function defaultFieldValue(field) { if (field.primaryKey) { return null; } if (field.kind === 'checkbox') { return normalizeOptionValue(field, field.checkboxInactiveRaw); } return ''; } function defaultSearchFieldValue(field) { if (field.kind === 'date') { return []; } if (field.kind === 'enum' || field.kind === 'checkbox') { return null; } return ''; } function createSearchDefaults() { var result = { condition: '' }; fieldMeta.forEach(function (field) { if (!isSearchableField(field)) { return; } result[field.field] = defaultSearchFieldValue(field); }); return result; } function createSearchDisplayDefaults() { var result = {}; fieldMeta.forEach(function (field) { if (field.kind === 'foreign' && isSearchableField(field)) { result[field.field] = ''; } }); return result; } function createDefaultVisibleColumnKeys() { return fieldMeta.map(function (field) { return field.field; }); } function createFormDefaults() { var result = {}; fieldMeta.forEach(function (field) { result[field.field] = defaultFieldValue(field); }); return result; } function createDisplayDefaults() { var result = {}; fieldMeta.forEach(function (field) { if (field.kind === 'foreign') { result[field.field] = ''; } }); return result; } function createFormRules() { var rules = {}; fieldMeta.forEach(function (field) { if (field.primaryKey || !field.required) { return; } rules[field.field] = [{ required: true, message: (field.kind === 'date' || field.kind === 'enum' ? '请选择' : '请输入') + field.label, trigger: (field.kind === 'date' || field.kind === 'enum') ? 'change' : 'blur' }]; }); return rules; } function getTableValue(row, field) { var prop = field.tableProp || field.field; if (row && !isEmptyValue(row[prop])) { return row[prop]; } return row ? row[field.field] : ''; } function isCheckboxChecked(row, field) { var value = row ? row[field.field] : null; var activeValue = normalizeOptionValue(field, field.checkboxActiveRaw); return String(value) === String(activeValue); } function exportCell(value) { return stringValue(value).replace(/\t/g, ' ').replace(/\r?\n/g, ' '); } function escapeHtml(value) { return exportCell(value) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function buildPayload(form) { var payload = {}; fieldMeta.forEach(function (field) { var value = form[field.field]; if (field.primaryKey) { if (!isEmptyValue(value)) { payload[field.field] = value; } return; } if (field.kind === 'foreign' && isEmptyValue(value)) { value = null; } if (field.kind === 'enum' && value === '') { value = null; } if (field.kind === 'checkbox' && isEmptyValue(value)) { value = normalizeOptionValue(field, field.checkboxInactiveRaw); } if (field.valueType === 'number' && !isEmptyValue(value)) { value = Number(value); } if (field.valueType === 'number' && value === '') { value = null; } payload[field.field] = value; }); return payload; } function fillFormFromRow(row, form, display) { fieldMeta.forEach(function (field) { if (field.primaryKey) { form[field.field] = row[field.field]; return; } if (field.kind === 'date') { form[field.field] = row[field.tableProp] || row[field.field] || ''; return; } if (field.kind === 'foreign') { form[field.field] = isEmptyValue(row[field.field]) ? '' : normalizeOptionValue(field, row[field.field]); if (display) { display[field.field] = row[field.tableProp] || (isEmptyValue(row[field.field]) ? '' : String(row[field.field])); } return; } if (field.kind === 'enum') { form[field.field] = isEmptyValue(row[field.field]) ? '' : normalizeOptionValue(field, row[field.field]); return; } if (field.kind === 'checkbox') { form[field.field] = isEmptyValue(row[field.field]) ? normalizeOptionValue(field, field.checkboxInactiveRaw) : normalizeOptionValue(field, row[field.field]); return; } form[field.field] = isEmptyValue(row[field.field]) ? '' : (field.valueType === 'number' ? String(row[field.field]) : row[field.field]); }); } function resolveSearchParam(field) { if (field.kind === 'date' && field.columnName) { return field.columnName; } return field.field; } function createDownloadFile(filename, titles, rows) { var html = [ '', '', titles.map(function (title) { return ''; }).join(''), '', (rows || []).map(function (row) { return '' + (row || []).map(function (value) { return ''; }).join('') + ''; }).join(''), '
' + escapeHtml(title) + '
' + escapeHtml(value) + '
' ].join(''); var blob = new Blob(['\ufeff' + html], { type: 'application/vnd.ms-excel;charset=utf-8;' }); var anchor = document.createElement('a'); anchor.href = URL.createObjectURL(blob); anchor.download = filename; document.body.appendChild(anchor); anchor.click(); setTimeout(function () { URL.revokeObjectURL(anchor.href); document.body.removeChild(anchor); }, 0); } function buildTimestamp() { var now = new Date(); var pad = function (num) { return num < 10 ? '0' + num : String(num); }; return now.getFullYear() + pad(now.getMonth() + 1) + pad(now.getDate()) + '_' + pad(now.getHours()) + pad(now.getMinutes()) + pad(now.getSeconds()); } function authHeaders() { return { token: localStorage.getItem('token') }; } function handleForbidden(res) { if (res && res.code === 403) { top.location.href = baseUrl + '/'; return true; } return false; } var sharedMethods = { authHeaders: authHeaders, handleForbidden: handleForbidden, valueOrDash: valueOrDash, stringValue: stringValue, getTableValue: getTableValue, isCheckboxChecked: isCheckboxChecked, normalizeOptionValue: normalizeOptionValue, isSortableField: isSortableField, getSuggestionFetcher: function (field) { var self = this; return function (queryString, callback) { self.fetchForeignSuggestions(field, queryString, callback); }; }, fetchForeignSuggestions: function (field, queryString, callback) { if (!field.foreignQuery || !queryString) { callback([]); return; } var self = this; $.ajax({ url: baseUrl + '/' + field.foreignQuery + 'Query/auth', method: 'GET', headers: self.authHeaders(), data: { condition: queryString }, success: function (res) { if (self.handleForbidden(res)) { return; } if (!res || res.code !== 200 || !Array.isArray(res.data)) { callback([]); return; } callback(res.data.map(function (item) { return { id: item.id, value: item.value }; })); }, error: function () { callback([]); } }); }, handleForeignSelect: function (field, item) { this.$set(this.displayTarget, field.field, item && item.value ? item.value : ''); this.$set(this.formTarget, field.field, item && item.id !== undefined ? normalizeOptionValue(field, item.id) : ''); }, handleForeignInput: function (field) { if (!this.displayTarget || !this.formTarget) { return; } if (this.displayTarget[field.field]) { return; } this.$set(this.formTarget, field.field, ''); } }; if (document.getElementById('app')) { new Vue({ el: '#app', data: function () { return { fieldMeta: fieldMeta, primaryKeyField: primaryKeyField, loading: false, exporting: false, tableData: [], selection: [], advancedFiltersVisible: false, allColumns: fieldMeta.slice(), visibleColumnKeys: createDefaultVisibleColumnKeys(), searchForm: createSearchDefaults(), searchDisplay: createSearchDisplayDefaults(), page: { curr: 1, limit: 15, total: 0 }, sortState: { prop: '', order: '' }, dialog: { visible: false, mode: 'create', submitting: false }, layoutTimer: null, tableResizeHandler: null, dialogForm: createFormDefaults(), dialogDisplay: createDisplayDefaults(), dialogRules: createFormRules() }; }, computed: { searchableFields: function () { return this.fieldMeta.filter(function (field) { return isSearchableField(field); }); }, quickSearchableFields: function () { var result = []; this.searchableFields.forEach(function (field) { if (result.length >= 3 || field.kind === 'date') { return; } result.push(field); }); return result; }, advancedSearchableFields: function () { var quickKeys = this.quickSearchableFields.map(function (field) { return field.field; }); return this.searchableFields.filter(function (field) { return quickKeys.indexOf(field.field) === -1; }); }, hasAdvancedFilters: function () { return this.advancedSearchableFields.length > 0; }, visibleColumns: function () { var keys = this.visibleColumnKeys; return this.allColumns.filter(function (field) { return keys.indexOf(field.field) !== -1; }); }, editableFields: function () { return this.fieldMeta.filter(function (field) { return !field.primaryKey; }); }, exportColumns: function () { return this.visibleColumns.map(function (field) { return { field: field.exportField || field.tableProp || field.field, label: field.label }; }); }, tableHeight: function () { return this.advancedFiltersVisible && this.hasAdvancedFilters ? 'calc(100vh - 390px)' : 'calc(100vh - 300px)'; }, formTarget: function () { return this.dialogForm; }, displayTarget: function () { return this.dialogDisplay; } }, created: function () { this.loadTable(); }, mounted: function () { var self = this; self.requestTableLayout(80); self.tableResizeHandler = function () { self.requestTableLayout(80); }; window.addEventListener('resize', self.tableResizeHandler); }, beforeDestroy: function () { if (this.layoutTimer) { clearTimeout(this.layoutTimer); this.layoutTimer = null; } if (this.tableResizeHandler) { window.removeEventListener('resize', this.tableResizeHandler); this.tableResizeHandler = null; } }, methods: $.extend({}, sharedMethods, { requestTableLayout: function (delay) { var self = this; if (self.layoutTimer) { clearTimeout(self.layoutTimer); } self.$nextTick(function () { self.layoutTimer = setTimeout(function () { var table = self.$refs.dataTable; if (table && typeof table.doLayout === 'function') { table.doLayout(); } }, delay || 40); }); }, isColumnVisible: function (fieldName) { return this.visibleColumnKeys.indexOf(fieldName) !== -1; }, toggleColumn: function (fieldName, visible) { if (visible) { if (this.visibleColumnKeys.indexOf(fieldName) === -1) { this.visibleColumnKeys.push(fieldName); } this.requestTableLayout(80); return; } if (this.visibleColumnKeys.length === 1) { this.$message.warning('至少保留一列'); return; } this.visibleColumnKeys = this.visibleColumnKeys.filter(function (item) { return item !== fieldName; }); this.requestTableLayout(80); }, selectAllColumns: function () { this.visibleColumnKeys = createDefaultVisibleColumnKeys(); this.requestTableLayout(80); }, resetColumns: function () { this.visibleColumnKeys = createDefaultVisibleColumnKeys(); this.requestTableLayout(80); }, toggleAdvancedFilters: function () { this.advancedFiltersVisible = !this.advancedFiltersVisible; this.requestTableLayout(260); }, handleSearchForeignSelect: function (field, item) { this.$set(this.searchDisplay, field.field, item && item.value ? item.value : ''); this.$set(this.searchForm, field.field, item && item.id !== undefined ? normalizeOptionValue(field, item.id) : ''); }, handleSearchForeignInput: function (field) { if (this.searchDisplay[field.field]) { return; } this.$set(this.searchForm, field.field, ''); }, buildQueryParams: function () { var self = this; var params = { curr: self.page.curr, limit: self.page.limit }; if (self.searchForm.condition) { params.condition = self.searchForm.condition; } self.searchableFields.forEach(function (field) { var value = self.searchForm[field.field]; if (field.kind === 'date') { if (value && value.length === 2) { params[resolveSearchParam(field)] = value[0] + ' - ' + value[1]; } return; } if (!isEmptyValue(value)) { params[resolveSearchParam(field)] = value; } }); if (self.sortState.prop && self.sortState.order) { params.orderByField = self.sortState.prop; params.orderByType = self.sortState.order === 'ascending' ? 'asc' : 'desc'; } return params; }, loadTable: function () { var self = this; self.loading = true; $.ajax({ url: baseUrl + '/' + simpleEntityName + '/list/auth', method: 'GET', headers: self.authHeaders(), data: self.buildQueryParams(), success: function (res) { self.loading = false; if (self.handleForbidden(res)) { return; } if (!res || res.code !== 200) { self.$message.error((res && res.msg) ? res.msg : '加载失败'); return; } var payload = res.data || {}; self.tableData = Array.isArray(payload.records) ? payload.records : []; self.page.total = payload.total || 0; self.requestTableLayout(80); }, error: function () { self.loading = false; self.requestTableLayout(80); self.$message.error('加载失败'); } }); }, handleSearch: function () { this.page.curr = 1; this.loadTable(); }, handleReset: function () { this.searchForm = createSearchDefaults(); this.searchDisplay = createSearchDisplayDefaults(); this.advancedFiltersVisible = false; this.page.curr = 1; this.sortState = { prop: '', order: '' }; this.loadTable(); }, handleSelectionChange: function (rows) { this.selection = rows || []; }, handleSortChange: function (payload) { this.sortState = { prop: payload && payload.prop ? payload.prop : '', order: payload && payload.order ? payload.order : '' }; this.page.curr = 1; this.loadTable(); }, handleCurrentChange: function (curr) { this.page.curr = curr; this.loadTable(); }, handleSizeChange: function (limit) { this.page.limit = limit; this.page.curr = 1; this.loadTable(); }, resetDialogState: function () { this.dialogForm = createFormDefaults(); this.dialogDisplay = createDisplayDefaults(); if (this.$refs.dialogForm) { this.$refs.dialogForm.clearValidate(); } }, openCreateDialog: function () { this.dialog.mode = 'create'; this.dialog.visible = true; this.$nextTick(this.resetDialogState); }, openEditDialog: function (row) { var self = this; self.dialog.mode = 'edit'; self.dialog.visible = true; self.$nextTick(function () { self.resetDialogState(); fillFormFromRow(row, self.dialogForm, self.dialogDisplay); if (self.$refs.dialogForm) { self.$refs.dialogForm.clearValidate(); } }); }, submitDialog: function () { var self = this; if (!self.$refs.dialogForm) { return; } self.$refs.dialogForm.validate(function (valid) { if (!valid) { return false; } self.dialog.submitting = true; $.ajax({ url: baseUrl + '/' + simpleEntityName + '/' + (self.dialog.mode === 'create' ? 'add' : 'update') + '/auth', method: 'POST', headers: self.authHeaders(), data: buildPayload(self.dialogForm), success: function (res) { self.dialog.submitting = false; if (self.handleForbidden(res)) { return; } if (!res || res.code !== 200) { self.$message.error((res && res.msg) ? res.msg : '保存失败'); return; } self.$message.success(res.msg || '保存成功'); self.dialog.visible = false; self.loadTable(); }, error: function () { self.dialog.submitting = false; self.$message.error('保存失败'); } }); return true; }); }, removeSelection: function () { var self = this; var ids = self.selection.map(function (row) { return row[self.primaryKeyField]; }); self.removeRows(ids); }, removeRows: function (ids) { var self = this; if (!ids || ids.length === 0) { self.$message.warning('请选择要删除的数据'); return; } self.$confirm('确定删除选中的记录吗?', '提示', { type: 'warning' }).then(function () { $.ajax({ url: baseUrl + '/' + simpleEntityName + '/delete/auth', method: 'POST', headers: self.authHeaders(), traditional: true, data: { 'ids[]': ids }, success: function (res) { if (self.handleForbidden(res)) { return; } if (!res || res.code !== 200) { self.$message.error((res && res.msg) ? res.msg : '删除失败'); return; } self.$message.success(res.msg || '删除成功'); self.selection = []; if (self.tableData.length === ids.length && self.page.curr > 1) { self.page.curr = self.page.curr - 1; } self.loadTable(); }, error: function () { self.$message.error('删除失败'); } }); }).catch(function () {}); }, exportRows: function () { var self = this; self.exporting = true; var requestBody = { fields: self.exportColumns.map(function (item) { return item.field; }) }; requestBody[simpleEntityName] = self.buildQueryParams(); $.ajax({ url: baseUrl + '/' + simpleEntityName + '/export/auth', method: 'POST', headers: $.extend({ 'Content-Type': 'application/json;charset=UTF-8' }, self.authHeaders()), data: JSON.stringify(requestBody), success: function (res) { self.exporting = false; if (self.handleForbidden(res)) { return; } if (!res || res.code !== 200) { self.$message.error((res && res.msg) ? res.msg : '导出失败'); return; } createDownloadFile( simpleEntityName + '_' + buildTimestamp() + '.xls', self.exportColumns.map(function (item) { return item.label; }), Array.isArray(res.data) ? res.data : [] ); self.$message.success('导出成功'); }, error: function () { self.exporting = false; self.$message.error('导出失败'); } }); } }) }); } })();