RMS-VUE/src/mixins/JeecgListMixin.js

489 lines
17 KiB
JavaScript
Raw Normal View History

2023-11-14 10:27:58 +08:00
/**
* 新增修改完成调用 modalFormOk方法 编辑弹框组件ref定义为modalForm
* 高级查询按钮调用 superQuery方法 高级查询组件ref定义为superQueryModal
* data中url定义 list为查询列表 delete为删除单条记录 deleteBatch为批量删除
*/
import { filterObj } from '@/utils/util';
2024-01-22 10:44:00 +08:00
import { deleteAction, getAction, downFile, getFileAccessHttpUrl } from '@/api/manage'
2023-11-14 10:27:58 +08:00
import Vue from 'vue'
import { ACCESS_TOKEN, TENANT_ID } from "@/store/mutation-types"
import store from '@/store'
export const JeecgListMixin = {
2024-01-22 10:44:00 +08:00
data() {
2023-11-14 10:27:58 +08:00
return {
/* 查询条件-请不要在queryParam中声明非字符串值的属性 */
queryParam: {},
/* 数据源 */
2024-01-22 10:44:00 +08:00
dataSource: [],
2023-11-14 10:27:58 +08:00
/* 分页参数 */
2024-01-22 10:44:00 +08:00
ipagination: {
2023-11-14 10:27:58 +08:00
current: 1,
pageSize: 10,
pageSizeOptions: ['10', '20', '30'],
showTotal: (total, range) => {
return range[0] + "-" + range[1] + " 共" + total + "条"
},
showQuickJumper: true,
showSizeChanger: true,
total: 0
},
/* 排序参数 */
2024-01-22 10:44:00 +08:00
isorter: {
2023-11-14 10:27:58 +08:00
column: 'createTime',
order: 'desc',
},
/* 筛选参数 */
filters: {},
/* table加载状态 */
2024-01-22 10:44:00 +08:00
loading: false,
2023-11-14 10:27:58 +08:00
/* table选中keys*/
selectedRowKeys: [],
/* table选中records*/
selectionRows: [],
/* 查询折叠 */
2024-01-22 10:44:00 +08:00
toggleSearchStatus: false,
2023-11-14 10:27:58 +08:00
/* 高级查询条件生效状态 */
2024-01-22 10:44:00 +08:00
superQueryFlag: false,
2023-11-14 10:27:58 +08:00
/* 高级查询条件 */
superQueryParams: '',
/** 高级查询拼接方式 */
superQueryMatchType: 'and',
}
},
created() {
2024-01-22 10:44:00 +08:00
if (!this.disableMixinCreated) {
console.log(' -- mixin created -- ')
this.loadData();
//初始化字典配置 在自己页面定义
this.initDictConfig();
}
2023-11-14 10:27:58 +08:00
},
computed: {
//token header
2024-01-22 10:44:00 +08:00
tokenHeader() {
let head = { 'X-Access-Token': Vue.ls.get(ACCESS_TOKEN) }
2023-11-14 10:27:58 +08:00
let tenantid = Vue.ls.get(TENANT_ID)
2024-01-22 10:44:00 +08:00
if (tenantid) {
2023-11-14 10:27:58 +08:00
head['tenant-id'] = tenantid
}
return head;
}
},
2024-01-22 10:44:00 +08:00
methods: {
2023-11-14 10:27:58 +08:00
loadData(arg) {
2024-01-22 10:44:00 +08:00
if (!this.url.list) {
2023-11-14 10:27:58 +08:00
this.$message.error("请设置url.list属性!")
return
}
//加载数据 若传入参数1则加载第一页的内容
if (arg === 1) {
this.ipagination.current = 1;
}
var params = this.getQueryParams();//查询条件
this.loading = true;
2024-01-22 10:44:00 +08:00
console.log("loadData params", params)
2023-11-14 10:27:58 +08:00
getAction(this.url.list, params).then((res) => {
if (res.success) {
//update-begin---author:zhangyafei Date:20201118 for适配不分页的数据列表------------
2024-01-22 10:44:00 +08:00
this.dataSource = res.result.records || res.result;
if (res.result.total) {
2023-11-14 10:27:58 +08:00
this.ipagination.total = res.result.total;
2024-01-22 10:44:00 +08:00
} else {
2023-11-14 10:27:58 +08:00
this.ipagination.total = 0;
}
//update-end---author:zhangyafei Date:20201118 for适配不分页的数据列表------------
2024-01-22 10:44:00 +08:00
} else {
2023-11-14 10:27:58 +08:00
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
2024-01-22 10:44:00 +08:00
initDictConfig() {
2023-11-14 10:27:58 +08:00
console.log("--这是一个假的方法!")
},
handleSuperQuery(params, matchType) {
//高级查询方法
2024-01-22 10:44:00 +08:00
if (!params) {
this.superQueryParams = ''
2023-11-14 10:27:58 +08:00
this.superQueryFlag = false
2024-01-22 10:44:00 +08:00
} else {
2023-11-14 10:27:58 +08:00
this.superQueryFlag = true
2024-01-22 10:44:00 +08:00
this.superQueryParams = JSON.stringify(params)
2023-11-14 10:27:58 +08:00
this.superQueryMatchType = matchType
}
this.loadData(1)
},
getQueryParams() {
//获取查询条件
let sqp = {}
2024-01-22 10:44:00 +08:00
if (this.superQueryParams) {
sqp['superQueryParams'] = encodeURI(this.superQueryParams)
2023-11-14 10:27:58 +08:00
sqp['superQueryMatchType'] = this.superQueryMatchType
}
2024-01-22 10:44:00 +08:00
var param = Object.assign(sqp, this.queryParam, this.isorter, this.filters);
2023-11-14 10:27:58 +08:00
param.field = this.getQueryField();
param.pageNo = this.ipagination.current;
param.pageSize = this.ipagination.pageSize;
return filterObj(param);
},
getQueryField() {
//TODO 字段权限控制
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);
// 点击查询清空列表选中行
// https://gitee.com/jeecg/jeecg-boot/issues/I4KTU1
this.selectedRowKeys = []
this.selectionRows = []
},
superQuery() {
this.$refs.superQueryModal.show();
},
searchReset() {
this.queryParam = {}
this.loadData(1);
},
batchDel: function () {
2024-01-22 10:44:00 +08:00
if (!this.url.deleteBatch) {
2023-11-14 10:27:58 +08:00
this.$message.error("请设置url.deleteBatch属性!")
return
}
if (this.selectedRowKeys.length <= 0) {
this.$message.warning('请选择一条记录!');
return;
} else {
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;
2024-01-22 10:44:00 +08:00
deleteAction(that.url.deleteBatch, { ids: ids }).then((res) => {
2023-11-14 10:27:58 +08:00
if (res.success) {
//重新计算分页问题
that.reCalculatePage(that.selectedRowKeys.length)
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
} else {
that.$message.warning(res.message);
}
}).finally(() => {
that.loading = false;
});
}
});
}
},
handleDelete: function (id) {
2024-01-22 10:44:00 +08:00
if (!this.url.delete) {
2023-11-14 10:27:58 +08:00
this.$message.error("请设置url.delete属性!")
return
}
var that = this;
2024-01-22 10:44:00 +08:00
deleteAction(that.url.delete, { id: id }).then((res) => {
2023-11-14 10:27:58 +08:00
if (res.success) {
//重新计算分页问题
that.reCalculatePage(1)
that.$message.success(res.message);
that.loadData();
} else {
that.$message.warning(res.message);
}
});
},
2024-01-22 10:44:00 +08:00
reCalculatePage(count) {
2023-11-14 10:27:58 +08:00
//总数量-count
2024-01-22 10:44:00 +08:00
let total = this.ipagination.total - count;
2023-11-14 10:27:58 +08:00
//获取删除后的分页数
2024-01-22 10:44:00 +08:00
let currentIndex = Math.ceil(total / this.ipagination.pageSize);
2023-11-14 10:27:58 +08:00
//删除后的分页数<所在当前页
2024-01-22 10:44:00 +08:00
if (currentIndex < this.ipagination.current) {
this.ipagination.current = currentIndex;
2023-11-14 10:27:58 +08:00
}
2024-01-22 10:44:00 +08:00
console.log('currentIndex', currentIndex)
2023-11-14 10:27:58 +08:00
},
handleEdit: function (record) {
this.$refs.modalForm.edit(record);
this.$refs.modalForm.title = "编辑";
this.$refs.modalForm.disableSubmit = false;
},
handleAdd: function () {
this.$refs.modalForm.add();
this.$refs.modalForm.title = "新增";
this.$refs.modalForm.disableSubmit = false;
},
handleTableChange(pagination, filters, sorter) {
//分页、排序、筛选变化时触发
//TODO 筛选
console.log(pagination)
if (Object.keys(sorter).length > 0) {
this.isorter.column = sorter.field;
this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
}
this.ipagination = pagination;
this.loadData();
},
2024-01-22 10:44:00 +08:00
handleToggleSearch() {
2023-11-14 10:27:58 +08:00
this.toggleSearchStatus = !this.toggleSearchStatus;
},
// 给popup查询使用(查询区域不支持回填多个字段,限制只返回一个字段)
2024-01-22 10:44:00 +08:00
getPopupField(fields) {
2023-11-14 10:27:58 +08:00
return fields.split(',')[0]
},
modalFormOk() {
// 新增/修改 成功时,重载列表
this.loadData();
//清空列表选中
this.onClearSelected()
},
2024-01-22 10:44:00 +08:00
handleDetail: function (record) {
2023-11-14 10:27:58 +08:00
this.$refs.modalForm.edit(record);
2024-01-22 10:44:00 +08:00
this.$refs.modalForm.title = "详情";
2023-11-14 10:27:58 +08:00
this.$refs.modalForm.disableSubmit = true;
},
/* 导出 */
2024-01-22 10:44:00 +08:00
handleExportXls2() {
2023-11-14 10:27:58 +08:00
let paramsStr = encodeURI(JSON.stringify(this.getQueryParams()));
let url = `${window._CONFIG['domianURL']}/${this.url.exportXlsUrl}?paramsStr=${paramsStr}`;
window.location.href = url;
},
2024-01-22 10:44:00 +08:00
handleExportXls(fileName) {
if (!fileName || typeof fileName != "string") {
2023-11-14 10:27:58 +08:00
fileName = "导出文件"
}
let param = this.getQueryParams();
2024-01-22 10:44:00 +08:00
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
2023-11-14 10:27:58 +08:00
param['selections'] = this.selectedRowKeys.join(",")
}
2024-01-22 10:44:00 +08:00
console.log("导出参数", param)
downFile(this.url.exportXlsUrl, param).then((data) => {
2023-11-14 10:27:58 +08:00
if (!data) {
this.$message.warning("文件下载失败")
return
}
if (typeof window.navigator.msSaveBlob !== 'undefined') {
2024-01-22 10:44:00 +08:00
window.navigator.msSaveBlob(new Blob([data], { type: 'application/vnd.ms-excel' }), fileName + '.xls')
} else {
let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' }))
2023-11-14 10:27:58 +08:00
let link = document.createElement('a')
link.style.display = 'none'
link.href = url
2024-01-22 10:44:00 +08:00
link.setAttribute('download', fileName + '.xls')
2023-11-14 10:27:58 +08:00
document.body.appendChild(link)
link.click()
document.body.removeChild(link); //下载完成移除元素
window.URL.revokeObjectURL(url); //释放掉blob对象
}
})
},
// 重写导出方法
ExportData(fileName, TimestampData) {
2024-01-22 10:44:00 +08:00
console.log("传入的时间戳" + TimestampData)
if (!fileName || typeof fileName != "string") {
fileName = "导出文件"
}
let param = this.getQueryParams();
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
param['selections'] = this.selectedRowKeys.join(",")
}
param['timestamp'] = TimestampData
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], { type: 'application/vnd.ms-excel' }), fileName + '.xls')
} else {
let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' }))
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); //释放掉blob对象
}
})
},
2023-11-14 10:27:58 +08:00
/* 导入 */
2024-01-22 10:44:00 +08:00
handleImportExcel(info) {
// 设置加载状态为true表示正在上传
2023-11-14 10:27:58 +08:00
this.loading = true;
2024-01-22 10:44:00 +08:00
// 如果文件状态不是'uploading',在控制台输出文件信息
2023-11-14 10:27:58 +08:00
if (info.file.status !== 'uploading') {
console.log(info.file, info.fileList);
}
2024-01-22 10:44:00 +08:00
// 处理文件上传完成的情况
2023-11-14 10:27:58 +08:00
if (info.file.status === 'done') {
2024-01-22 10:44:00 +08:00
// 设置加载状态为false表示上传完成
2023-11-14 10:27:58 +08:00
this.loading = false;
2024-01-22 10:44:00 +08:00
// 检查上传是否成功
2023-11-14 10:27:58 +08:00
if (info.file.response.success) {
2024-01-22 10:44:00 +08:00
// 如果上传成功
2023-11-14 10:27:58 +08:00
if (info.file.response.code === 201) {
2024-01-22 10:44:00 +08:00
// 处理成功响应的情况
let { message, result: { msg, fileUrl, fileName } } = info.file.response;
let href = window._CONFIG['domianURL'] + fileUrl;
// 弹出一个警告提示框,提醒用户下载文件
2023-11-14 10:27:58 +08:00
this.$warning({
title: message,
2024-01-22 10:44:00 +08:00
content: (
<div>
<span>{msg}</span><br />
2023-11-14 10:27:58 +08:00
<span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
</div>
)
2024-01-22 10:44:00 +08:00
});
2023-11-14 10:27:58 +08:00
} else {
2024-01-22 10:44:00 +08:00
console.log("后端返回的数据:", info.file.response);
// 处理上传成功但是响应状态码不为201的情况
this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`);
2023-11-14 10:27:58 +08:00
}
2024-01-22 10:44:00 +08:00
// 重新加载数据
this.loadData();
2023-11-14 10:27:58 +08:00
} else {
2024-01-22 10:44:00 +08:00
// 处理上传失败的情况
2023-11-14 10:27:58 +08:00
this.$message.error(`${info.file.name} ${info.file.response.message}.`);
}
} else if (info.file.status === 'error') {
2024-01-22 10:44:00 +08:00
// 处理上传错误的情况
2023-11-14 10:27:58 +08:00
this.loading = false;
2024-01-22 10:44:00 +08:00
// 处理服务器返回的500错误
2023-11-14 10:27:58 +08:00
if (info.file.response.status === 500) {
2024-01-22 10:44:00 +08:00
let data = info.file.response;
const token = Vue.ls.get(ACCESS_TOKEN);
// 如果Token失效提示用户登录已过期提供重新登录选项
2023-11-14 10:27:58 +08:00
if (token && data.message.includes("Token失效")) {
this.$error({
title: '登录已过期',
content: '很抱歉,登录已过期,请重新登录',
okText: '重新登录',
mask: false,
onOk: () => {
store.dispatch('Logout').then(() => {
2024-01-22 10:44:00 +08:00
Vue.ls.remove(ACCESS_TOKEN);
2023-11-14 10:27:58 +08:00
window.location.reload();
2024-01-22 10:44:00 +08:00
});
2023-11-14 10:27:58 +08:00
}
2024-01-22 10:44:00 +08:00
});
2023-11-14 10:27:58 +08:00
}
} else {
2024-01-22 10:44:00 +08:00
// 处理其他上传错误情况
2023-11-14 10:27:58 +08:00
this.$message.error(`文件上传失败: ${info.file.msg} `);
}
}
},
2024-01-22 10:44:00 +08:00
//重写导入方法
ImportData(info) {
// 设置加载状态为true表示正在上传
this.loading = true;
// 如果文件状态不是'uploading',在控制台输出文件信息
if (info.file.status !== 'uploading') {
console.log(info.file, info.fileList);
}
// 处理文件上传完成的情况
if (info.file.status === 'done') {
// 设置加载状态为false表示上传完成
this.loading = false;
// 检查上传是否成功
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><br />
<span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
</div>
)
});
} else {
// 处理上传成功但是响应状态码不为201的情况
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.loading = false;
// 处理服务器返回的500错误
if (info.file.response.status === 500) {
let data = info.file.response;
const token = Vue.ls.get(ACCESS_TOKEN);
// 如果Token失效提示用户登录已过期提供重新登录选项
if (token && data.message.includes("Token失效")) {
this.$error({
title: '登录已过期',
content: '很抱歉,登录已过期,请重新登录',
okText: '重新登录',
mask: false,
onOk: () => {
store.dispatch('Logout').then(() => {
Vue.ls.remove(ACCESS_TOKEN);
window.location.reload();
});
}
});
}
} else {
// 处理其他上传错误情况
this.$message.error(`文件上传失败: ${info.file.msg} `);
}
}
},
2023-11-14 10:27:58 +08:00
/* 图片预览 */
2024-01-22 10:44:00 +08:00
getImgView(text) {
if (text && text.indexOf(",") > 0) {
text = text.substring(0, text.indexOf(","))
2023-11-14 10:27:58 +08:00
}
return getFileAccessHttpUrl(text)
},
/* 文件下载 */
// update--autor:lvdandan-----date:20200630------for修改下载文件方法名uploadFile改为downloadFile------
2024-01-22 10:44:00 +08:00
downloadFile(text) {
if (!text) {
2023-11-14 10:27:58 +08:00
this.$message.warning("未知的文件")
return;
}
2024-01-22 10:44:00 +08:00
if (text.indexOf(",") > 0) {
text = text.substring(0, text.indexOf(","))
2023-11-14 10:27:58 +08:00
}
let url = getFileAccessHttpUrl(text)
window.open(url);
},
}
}