This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
cyber-narrator-cn-ui/src/mixins/data-list.js

455 lines
14 KiB
JavaScript
Raw Normal View History

2021-06-11 10:00:22 +08:00
import { tableSort } from '@/utils/tools'
import { defaultPageSize, fromRoute, position, storageKey, dbTableColumnCustomizeConfigPre } from '@/utils/constants'
2021-06-11 10:00:22 +08:00
import { get, del } from '@/utils/http'
import { ref } from 'vue'
import pagination from '@/components/common/Pagination'
2022-04-13 16:40:55 +08:00
import axios from 'axios'
import { api } from '@/utils/api'
import Loading from '@/components/common/Loading'
import indexedDBUtils from '@/indexedDB'
2021-06-11 10:00:22 +08:00
export default {
components: {
pagination,
Loading
},
2021-06-11 10:00:22 +08:00
data () {
return {
fromRoute: fromRoute,
// 侧滑
rightBox: {
show: false
},
pageObj: { // 分页对象
pageNo: 1,
pageSize: defaultPageSize,
total: null// total为0时elment分页组件pagination,修改当前页无效。修改为null即可解决此问题
2021-06-11 10:00:22 +08:00
},
/* 工具参数 */
tools: {
// loading: true, // 是否显示table加载动画
2021-06-11 10:00:22 +08:00
customTableTitle: [] // 自定义列工具的数据
},
mainTableHeight: position.tableHeight.normal, // 主列表table高度
batchDeleteObjs: [],
object: {},
searchLabel: ref({}),
isFirstQuery: true,
2021-06-11 10:00:22 +08:00
tableData: [],
scrollbarWrap: null,
delFlag: false,
disableEdit: true, // 编辑按钮是否不可用,当选择多条记录的时候,编辑按钮不可用
2023-04-26 23:46:23 +08:00
disableDelete: true,
operationWidth: '165', // 操作列宽
loading: true,
isNoData: false
2021-06-11 10:00:22 +08:00
}
},
methods: {
sortableShow: tableSort.sortableShow,
propTitle: tableSort.propTitle,
asce: tableSort.asce,
desc: tableSort.desc,
strToDate: tableSort.strToDate,
2022-06-06 17:37:01 +08:00
tableOperation ([command, row]) {
2021-06-11 10:00:22 +08:00
switch (command) {
case 'edit': {
this.edit(row)
break
}
case 'delete': {
this.del(row)
break
}
case 'copy': {
this.copy(row)
break
}
case 'download': {
2022-06-06 17:37:01 +08:00
this.download(row)
break
}
case 'preview': {
this.preview(row)
break
}
2021-06-11 10:00:22 +08:00
default:
break
}
},
toggleLoading (loading) {
this.loading = loading
},
2021-06-11 10:00:22 +08:00
selectionChange (objs) {
2023-04-26 23:46:23 +08:00
this.batchDeleteObjs = []
objs.forEach(obj => {
const delObj = this.batchDeleteObjs.find(item => item.id === obj.id)
if (delObj === undefined) {
this.batchDeleteObjs.push(obj)
}
})
if (this.batchDeleteObjs.length == 1) {
2023-03-10 20:50:54 +08:00
this.disableEdit = false
} else {
this.disableEdit = true
2023-03-10 20:50:54 +08:00
}
2023-04-26 23:46:23 +08:00
if (this.batchDeleteObjs.length >= 1) {
this.disableDelete = false
} else {
this.disableDelete = true
}
2021-06-11 10:00:22 +08:00
},
2023-04-26 23:46:23 +08:00
getTableData (params, isAll, isClearType) {
if (isAll) {
this.searchLabel = null
} else if (isClearType) {
this.searchLabel.type = ''// 换新接口需要修改的属性名称
2023-04-26 23:46:23 +08:00
}
2021-06-11 10:00:22 +08:00
if (params) {
this.searchLabel = { ...this.searchLabel, ...params }
}
2022-04-22 11:18:14 +08:00
this.searchLabel = { ...this.searchLabel, ...this.pageObj }
this.isNoData = false
this.toggleLoading(true)
2021-09-02 17:12:27 +08:00
delete this.searchLabel.total
let listUrl = this.url
if (this.listUrl) {
listUrl = this.listUrl
}
get(listUrl, this.searchLabel).then(response => {
2021-06-11 10:00:22 +08:00
if (response.code === 200) {
2022-06-08 18:32:52 +08:00
this.tableData = response.data.list
2021-06-11 10:00:22 +08:00
this.pageObj.total = response.data.total
if (!this.tableData || this.tableData.length === 0) {
this.isNoData = true
} else {
this.isNoData = false
}
2023-03-14 19:39:40 +08:00
} else {
console.error(response)
this.isNoData = true
2023-03-14 19:39:40 +08:00
if (response.message) {
this.$message.error(response.message)
} else {
this.$message.error(this.$t('tip.somethingWentWrong'))
2023-03-14 19:39:40 +08:00
}
2021-06-11 10:00:22 +08:00
}
}).catch(() => {
this.isNoData = true
}).finally(() => {
this.toggleLoading(false)
2021-06-11 10:00:22 +08:00
})
},
del (row) {
this.$confirm(this.$t('tip.confirmDelete'), {
confirmButtonText: this.$t('tip.yes'),
cancelButtonText: this.$t('tip.no'),
type: 'warning'
}).then(() => {
del(this.url + '?ids=' + row.id).then(response => {
if (response.code === 200) {
this.delFlag = true
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') })
this.getTableData()
} else {
this.$message.error(response.msg)
}
})
}).catch(e => {})
2021-06-11 10:00:22 +08:00
},
2023-04-26 23:46:23 +08:00
delSelectionChange () {
},
2023-03-10 20:50:54 +08:00
delBatch () {
const ids = []
if (this.batchDeleteObjs && this.batchDeleteObjs.length > 0) {
this.batchDeleteObjs.forEach(item => {
2023-03-10 20:50:54 +08:00
ids.push(item.id)
})
}
if (ids.length === 0) {
this.$alert(this.$t('tip.pleaseSelect'), {
2023-03-10 20:50:54 +08:00
confirmButtonText: this.$t('tip.yes'),
type: 'warning'
}).catch(() => {})
} else {
2023-03-10 20:50:54 +08:00
this.$confirm(this.$t('tip.confirmDelete'), {
confirmButtonText: this.$t('tip.yes'),
cancelButtonText: this.$t('tip.no'),
type: 'warning'
}).then(() => {
this.toggleLoading(true)
2023-03-10 20:50:54 +08:00
axios.delete(this.url + '?ids=' + ids).then(response => {
if (response.data.code === 200) {
this.delFlag = true
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.deleteSuccess') })
this.getTableData()
} else {
this.$message.error(response.data.message)
}
}).finally(() => {
this.toggleLoading(false)
2023-03-10 20:50:54 +08:00
})
}).catch(() => {})
2023-04-26 23:46:23 +08:00
.finally(() => {
if (this.isSelectedStatus != undefined) {
this.isSelectedStatus = false
this.disableDelete = true
this.batchDeleteObjs = []
}
})
2023-03-10 20:50:54 +08:00
}
},
2021-06-11 10:00:22 +08:00
newObject () {
return JSON.parse(JSON.stringify(this.blankObject))
},
pageNo (val) {
this.pageObj.pageNo = val
if (this.isFirstQuery) {
this.isFirstQuery = false
setTimeout(() => {
this.getTableData()
}, 300)
} else {
this.getTableData()
}
2021-06-11 10:00:22 +08:00
},
pageSize (val) {
this.pageObj.pageSize = val
this.pageObj.pageNo = 1
localStorage.setItem(storageKey.pageSize + '-' + localStorage.getItem(storageKey.username) + '-' + this.tableId, val)
2021-06-11 10:00:22 +08:00
this.getTableData()
},
add () {
this.object = this.newObject()
this.rightBox.show = true
},
closeRightBox (refresh) {
this.rightBox.show = false
if (refresh) {
this.delFlag = true
this.getTableData()
}
},
edit (u) {
get(`${this.url}/${u.id}`).then(response => {
if (response.code === 200) {
this.object = response.data
2021-06-11 10:00:22 +08:00
this.rightBox.show = true
}
})
},
editSelectRecord () {
if (this.batchDeleteObjs.length === 0) {
this.$alert(this.$t('tip.pleaseSelectForEdit'), {
2023-03-10 20:50:54 +08:00
confirmButtonText: this.$t('tip.yes'),
type: 'warning'
}).catch(() => {})
} else {
2023-03-10 20:50:54 +08:00
get(`${this.url}/${this.batchDeleteObjs[0].id}`).then(response => {
if (response.code === 200) {
this.object = response.data
this.rightBox.show = true
}
})
}
},
2021-06-11 10:00:22 +08:00
copy (u) {
this.object = { ...u, name: 'Copy from ' + u.name, id: '' }
this.rightBox.show = true
},
2022-06-06 17:37:01 +08:00
download (u) {
if (this.$refs.dataTable.loadingTableId === u.id) { // 列表单个下载
return
}
if (localStorage.getItem(storageKey.s3Enable) == 1) {
if (u.state !== 1 || u.upload !== 1) {
return
}
} else {
if (u.state !== 1) {
return
}
}
2022-04-13 18:31:13 +08:00
let fileName = ''
let url = ''
let params = {}
2022-06-06 17:37:01 +08:00
fileName = u.name + '.pdf' // 文件名称
url = api.reportDownloadPdf // 单个 pdf 下载
params = {
id: u.id
2022-04-13 16:40:55 +08:00
}
2022-06-06 17:37:01 +08:00
this.$refs.dataTable.loadingTableId = u.id // 列表单个下载
if (!u) { // 列表单个下载
2022-04-24 18:16:41 +08:00
this.$refs.dataTable.loadingTableId = u.id
return
}
// 判断是否成功登陆成功
2022-06-06 17:37:01 +08:00
if (!localStorage.getItem(storageKey.token)) {
2022-04-24 18:16:41 +08:00
return window.location.replace('/')
}
get(api.reportTemp).then(res => {
if (res.code === 200) {
axios.get(url, { responseType: 'blob', params: params }).then(res => {
if (window.navigator.msSaveOrOpenBlob) {
// 兼容ie11
const blobObject = new Blob([res.data])
window.navigator.msSaveOrOpenBlob(blobObject, fileName)
} else {
const url = URL.createObjectURL(new Blob([res.data]))
const a = document.createElement('a')
document.body.appendChild(a) // 此处增加了将创建的添加到body当中
a.href = url
a.download = fileName
a.target = '_blank'
a.click()
a.remove() // 将a标签移除
}
2022-06-06 17:37:01 +08:00
this.$refs.dataTable.loadingTableId = !u.id
}, error => {
const $self = this
const reader = new FileReader()
reader.onload = function (event) {
const responseText = reader.result
const exception = JSON.parse(responseText)
if (exception.message) {
$self.$message.error(exception.message)
} else {
console.error(error)
}
}
reader.readAsText(error.response.data)
2022-06-06 17:37:01 +08:00
this.$refs.dataTable.loadingTableId = !u.id
}).catch(() => {
2022-06-06 17:37:01 +08:00
this.$refs.dataTable.loadingTableId = !u.id
})
}
})
},
preview (u) {
if (this.$refs.dataTable.loadingPreviewId === u.id) { // 列表单个下载
return
}
if (localStorage.getItem(storageKey.s3Enable) == 1) {
if (u.state !== 1 || u.upload !== 1) {
return
}
} else {
if (u.state !== 1) {
return
}
}
2022-04-13 16:40:55 +08:00
const params = {
id: u.id
}
this.$refs.dataTable.loadingPreviewId = u.id
axios.get(api.reportView, { params: params }).then(res => {
2022-04-24 18:16:41 +08:00
if (!localStorage.getItem(storageKey.token)) {
this.$refs.dataTable.loadingPreviewId = !u.id
return
}
2022-04-13 16:40:55 +08:00
const prevWindow = window.open('', '')
prevWindow.document.write(res.data)
prevWindow.focus()
this.$refs.dataTable.loadingPreviewId = !u.id
}).catch(() => {
this.$refs.dataTable.loadingPreviewId = !u.id
})
},
2021-06-11 10:00:22 +08:00
esc () {
this.rightBox.show = false
},
dragend () {
this.$nextTick(() => {
if (this.$refs.dataTable && this.$refs.dataTable.$refs.dataTable) {
2023-04-26 23:46:23 +08:00
this.$refs.dataTable.$refs.dataTable.doLayout()
}
2021-06-11 10:00:22 +08:00
})
},
tableDataSort (orderBy) {
2022-01-26 19:14:40 +08:00
this.searchLabel.orderBy = orderBy
2021-06-11 10:00:22 +08:00
this.getTableData()
},
search (params) {
this.pageObj.pageNo = 1
delete this.searchLabel.category
delete this.searchLabel.source
this.getTableData(params)
2022-04-13 16:40:55 +08:00
},
getTimeString () {
const split = '-'
const date = new Date()
const year = date.getFullYear()
const month = this.formatNum(date.getMonth() + 1)
const day = this.formatNum(date.getDate())
const hours = this.formatNum(date.getHours())
const minutes = this.formatNum(date.getMinutes())
const seconds = this.formatNum(date.getSeconds())
return year + split + month + split + day + ' ' + hours + split + minutes + split + seconds
},
formatNum (num) {
return num > 9 ? num : '0' + num
2021-06-11 10:00:22 +08:00
}
},
watch: {
tableData: {
deep: true,
handler (n) {
if (n.length === 0 && this.pageObj.pageNo > 1) {
this.pageNo(this.pageObj.pageNo - 1)
}
// TODO 不是删除时回到顶部
}
},
'tools.customTableTitle': {
deep: true,
handler (n) {
this.dragend()
}
}
},
async mounted () {
const pageSize = localStorage.getItem(storageKey.pageSize + '-' + localStorage.getItem(storageKey.username) + '-' + this.tableId)
2021-06-11 10:00:22 +08:00
if (pageSize && pageSize !== 'undefined') {
this.pageObj.pageSize = pageSize
}
const userId = localStorage.getItem(storageKey.userId)
const tableName = dbTableColumnCustomizeConfigPre + '-' + this.tableId
let localStorageTableTitle = []
if (indexedDBUtils.selectTable(tableName)) {
localStorageTableTitle = await indexedDBUtils.selectTable(tableName).get({ id: userId })
}
localStorageTableTitle = localStorageTableTitle && localStorageTableTitle.config
? localStorageTableTitle.config
: (this.$refs.dataTable && this.$refs.dataTable.tableTitle ? this.$refs.dataTable.tableTitle : [])
// this.tools.customTableTitle = this.$refs.dataTable.tableTitle.map((item, index) => { // 修复切换中英文的问题
// if (localStorageTableTitle[index]) {
// item.show = localStorageTableTitle[index].show
// }
// return item
// })
// 不够优美,后续修改
// 为了避免缓存里的label在切换中英文时不一致因为在拖拽后键值不一致了故根据prop匹配来修改label
for (let i = 0; i < localStorageTableTitle.length; i++) {
for (let j = 0; j < this.tools.customTableTitle.length; j++) {
if (localStorageTableTitle[i].prop === this.tools.customTableTitle.prop) {
localStorageTableTitle[i].label = this.tools.customTableTitle.label
break
}
2021-10-24 20:23:24 +08:00
}
}
this.tools.customTableTitle = localStorageTableTitle
2021-06-11 10:00:22 +08:00
if (localStorageTableTitle && (localStorageTableTitle.length > this.$refs.dataTable.tableTitle.length)) {
const arr = localStorageTableTitle.splice(this.$refs.dataTable.tableTitle.length, localStorageTableTitle.length)
this.tools.customTableTitle = this.tools.customTableTitle.concat(arr)
}
// this.getTableData()
},
unmounted () {
this.isNoData = false
2021-06-11 10:00:22 +08:00
}
}