VueTable
This commit is contained in:
parent
eb781109e1
commit
38b8332c91
|
@ -0,0 +1,108 @@
|
||||||
|
<!--
|
||||||
|
* @Author: your name
|
||||||
|
* @Date: 2020-10-21 14:22:25
|
||||||
|
* @LastEditTime: 2021-02-04 15:46:01
|
||||||
|
* @LastEditors: Please set LastEditors
|
||||||
|
* @Description: In User Settings Edit
|
||||||
|
* @FilePath: \dbadmin\src\components\HeaderQueryForm.vue
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div class="header-query__component">
|
||||||
|
<el-form
|
||||||
|
:model="form"
|
||||||
|
:rules="rules"
|
||||||
|
label-position="left"
|
||||||
|
:label-width="labelWidth"
|
||||||
|
:size="size"
|
||||||
|
@keydown.enter.native.prevent="request"
|
||||||
|
inline
|
||||||
|
v-bind="$attrs"
|
||||||
|
>
|
||||||
|
<slot></slot>
|
||||||
|
<el-button v-if="btn" type="primary" :size="size" @click="request">
|
||||||
|
{{ queryLabel }}
|
||||||
|
</el-button>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { Component, Prop, Emit } from 'vue-property-decorator'
|
||||||
|
import Vue from 'vue'
|
||||||
|
import { getModule } from 'vuex-module-decorators'
|
||||||
|
import QueryStore, { DEFAULT_TAG as DEFAULT_QUERY_TAG } from '@/store/modules/query'
|
||||||
|
|
||||||
|
import store from '@/store'
|
||||||
|
const queryStore = getModule(QueryStore, store)
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
name: 'HeaderQuery'
|
||||||
|
})
|
||||||
|
export default class HeaderQuery extends Vue {
|
||||||
|
@Prop({ type: String, default: DEFAULT_QUERY_TAG })
|
||||||
|
tag
|
||||||
|
|
||||||
|
@Prop({ type: Object, required: true })
|
||||||
|
form
|
||||||
|
|
||||||
|
@Prop({ type: Object, default: () => ({}) })
|
||||||
|
rules
|
||||||
|
|
||||||
|
@Prop({ type: String, default: 'mini' })
|
||||||
|
size
|
||||||
|
|
||||||
|
@Prop({ type: String, default: '查询' })
|
||||||
|
queryLabel
|
||||||
|
|
||||||
|
@Prop({ type: Boolean, default: true })
|
||||||
|
btn
|
||||||
|
|
||||||
|
@Prop({ type: Boolean, default: true })
|
||||||
|
cache
|
||||||
|
|
||||||
|
@Prop({ type: String, default: undefined })
|
||||||
|
labelWidth
|
||||||
|
|
||||||
|
pageData = null
|
||||||
|
|
||||||
|
get storeData() {
|
||||||
|
return queryStore.data[this.path][this.tag] || {}
|
||||||
|
}
|
||||||
|
|
||||||
|
set storeData(data) {
|
||||||
|
queryStore.setData({ path: this.path, data, tag: this.tag })
|
||||||
|
}
|
||||||
|
|
||||||
|
get path() {
|
||||||
|
return this.$route.path
|
||||||
|
}
|
||||||
|
|
||||||
|
get fetch() {
|
||||||
|
return queryStore.fetchs[this.path][this.tag]
|
||||||
|
}
|
||||||
|
|
||||||
|
created() {
|
||||||
|
queryStore.init({ tag: this.tag, path: this.path, initData: Object.assign({}, this.form) })
|
||||||
|
this.pageData = queryStore.pageData[this.path][this.tag]
|
||||||
|
this.emitUpdateQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 触发外部更新值
|
||||||
|
*/
|
||||||
|
@Emit('update:form')
|
||||||
|
emitUpdateQuery() {
|
||||||
|
return Object.assign({}, this.storeData)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Emit('submit')
|
||||||
|
async request() {
|
||||||
|
this.pageData.page = 1
|
||||||
|
this.storeData = this.form
|
||||||
|
this.fetch()
|
||||||
|
return this.storeData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
|
@ -0,0 +1,556 @@
|
||||||
|
<!--
|
||||||
|
* @Author: your name
|
||||||
|
* @Date: 2020-09-08 16:22:26
|
||||||
|
* @LastEditTime: 2021-02-04 16:52:15
|
||||||
|
* @LastEditors: Please set LastEditors
|
||||||
|
* @Description: In User Settings Edit
|
||||||
|
* @FilePath: \dbadmin\src\components\TableForm\Table.vue
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div class="table__component" ref="root" :style="rootStyle">
|
||||||
|
<el-button-group>
|
||||||
|
<!-- 普通功能按钮插槽 -->
|
||||||
|
<slot
|
||||||
|
name="btns"
|
||||||
|
:selectable="multiselect && selectedRows.length > 0"
|
||||||
|
:disabled="!multiselect || selectedRows.length === 0"
|
||||||
|
:selectrows="selectedRows"
|
||||||
|
:multiStepAction="multiStepReq"
|
||||||
|
></slot>
|
||||||
|
|
||||||
|
<!-- 数据导出按钮插槽 -->
|
||||||
|
<slot v-if="allowExport" name="export-btn" :disabled="selectedRows.length === 0" :action="exportData" :loading="exporting"></slot>
|
||||||
|
</el-button-group>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
:data="list"
|
||||||
|
@selection-change="onSelectionChange"
|
||||||
|
@current-change="$emit('current-change', $event)"
|
||||||
|
ref="table"
|
||||||
|
:height="tableHeight"
|
||||||
|
v-loading="loading"
|
||||||
|
:span-method="SpanMethod"
|
||||||
|
:default-expand-all="expandAll"
|
||||||
|
:class="tableClass"
|
||||||
|
v-bind="tableOptions"
|
||||||
|
>
|
||||||
|
<el-table-column v-if="enableDrag" v-bind="dragColumnOptions">
|
||||||
|
<i slot-scope="{ row }" class="el-icon-s-fold handle" style="font-size: 16px; cursor: move"></i>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column type="selection" v-if="multiselect || allowExport" />
|
||||||
|
<slot></slot>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<!-- 分页 -->
|
||||||
|
<div v-if="visiblePage" class="page">
|
||||||
|
<el-pagination
|
||||||
|
:total="total"
|
||||||
|
:page-size="size"
|
||||||
|
background
|
||||||
|
layout="sizes, prev, pager, next"
|
||||||
|
:current-page.sync="currentPage"
|
||||||
|
:page-sizes="[...(isDev ? [1, 2, 5] : []), 10, 20, 50, 100, 200]"
|
||||||
|
@size-change="onSizeChange"
|
||||||
|
></el-pagination>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { get, del as RequestDelete } from '@/utils/request'
|
||||||
|
import Vue from 'vue'
|
||||||
|
import { Component, Prop, Watch, Ref, ProvideReactive, Provide } from 'vue-property-decorator'
|
||||||
|
import { toTime, toDateTime, toDate } from '@/utils/util'
|
||||||
|
import { downloadXlsx } from '@/utils/excel'
|
||||||
|
import { debounce } from 'underscore'
|
||||||
|
import { getModule } from 'vuex-module-decorators'
|
||||||
|
import QueryStore, { DEFAULT_TAG as DEFAULT_QUERY_TAG } from '@/store/modules/query'
|
||||||
|
import Sortable from 'sortablejs'
|
||||||
|
|
||||||
|
// Table组件只读取不写vuex里面的查询参数,但会修改分页参数(入currentPage,pageSize)
|
||||||
|
import store from '@/store'
|
||||||
|
const queryStore = getModule(QueryStore, store)
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
name: 'Table'
|
||||||
|
})
|
||||||
|
export default class Table extends Vue {
|
||||||
|
@Prop({ type: Boolean, default: false })
|
||||||
|
enableDrag
|
||||||
|
|
||||||
|
@Prop({ type: Object, default: () => ({}) })
|
||||||
|
dragColumnOptions
|
||||||
|
|
||||||
|
@Prop({ type: Object, default: () => ({}) })
|
||||||
|
tableOptions
|
||||||
|
|
||||||
|
@Prop({ type: Boolean, default: false })
|
||||||
|
expandAll
|
||||||
|
|
||||||
|
@Prop({ type: String })
|
||||||
|
tableClass
|
||||||
|
|
||||||
|
@Prop({ type: Boolean, default: false })
|
||||||
|
multiselect
|
||||||
|
|
||||||
|
@Prop({ type: Boolean, default: true })
|
||||||
|
visiblePage
|
||||||
|
|
||||||
|
@Prop({ type: Function })
|
||||||
|
responseHandler
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否允许导出数据
|
||||||
|
*/
|
||||||
|
@Prop({ type: Boolean, default: false })
|
||||||
|
allowExport
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出数据时需要特殊处理的字段
|
||||||
|
* {
|
||||||
|
* [字段名]:处理方式
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
@Prop({ type: Object, default: () => ({}) })
|
||||||
|
exportSpecialField
|
||||||
|
|
||||||
|
@Prop({ type: String, required: true })
|
||||||
|
api
|
||||||
|
|
||||||
|
@Prop({ type: Function })
|
||||||
|
SpanMethod
|
||||||
|
|
||||||
|
@Prop({ type: [String, Number] })
|
||||||
|
height
|
||||||
|
|
||||||
|
@Prop({ type: String, default: DEFAULT_QUERY_TAG })
|
||||||
|
tag
|
||||||
|
|
||||||
|
@Ref('table')
|
||||||
|
tableRef
|
||||||
|
|
||||||
|
@Ref('root')
|
||||||
|
rootRef
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前页码
|
||||||
|
*/
|
||||||
|
// currentPage = 1
|
||||||
|
|
||||||
|
get currentPage() {
|
||||||
|
if (!this.pageData) return 1
|
||||||
|
if (!this.pageData.page) this.pageData.page = 1
|
||||||
|
return this.pageData.page
|
||||||
|
}
|
||||||
|
|
||||||
|
set currentPage(page) {
|
||||||
|
if (!this.pageData) return
|
||||||
|
this.pageData.page = page
|
||||||
|
return page
|
||||||
|
}
|
||||||
|
|
||||||
|
// size = 20
|
||||||
|
|
||||||
|
get size() {
|
||||||
|
if (!this.pageData) return 20
|
||||||
|
if (!this.pageData.size) this.pageData.size = 20
|
||||||
|
return this.pageData.size
|
||||||
|
}
|
||||||
|
|
||||||
|
set size(size) {
|
||||||
|
if (!this.pageData) return
|
||||||
|
this.pageData.size = size
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表数据
|
||||||
|
*/
|
||||||
|
@ProvideReactive('table_data')
|
||||||
|
list = []
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表数据是否加载中
|
||||||
|
*/
|
||||||
|
loading = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表数据总长度
|
||||||
|
*/
|
||||||
|
total = 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选中的行
|
||||||
|
*/
|
||||||
|
selectedRows = []
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据导出处理中
|
||||||
|
*/
|
||||||
|
exporting = false
|
||||||
|
|
||||||
|
rootHeight = null
|
||||||
|
|
||||||
|
tableHeightData = 50
|
||||||
|
|
||||||
|
get tableHeight() {
|
||||||
|
if (this.propHeightOk) {
|
||||||
|
return this.height
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.tableHeightData
|
||||||
|
}
|
||||||
|
|
||||||
|
get propHeightOk() {
|
||||||
|
return ['string', 'number'].includes(typeof this.height)
|
||||||
|
}
|
||||||
|
|
||||||
|
get rootStyle() {
|
||||||
|
const style = {}
|
||||||
|
if (this.rootHeight) {
|
||||||
|
style.height = `${this.rootHeight}px`
|
||||||
|
}
|
||||||
|
|
||||||
|
return style
|
||||||
|
}
|
||||||
|
|
||||||
|
pageData = {}
|
||||||
|
|
||||||
|
get path() {
|
||||||
|
return this.$route.path
|
||||||
|
}
|
||||||
|
|
||||||
|
async created() {
|
||||||
|
queryStore.init({ path: this.path, tag: this.tag })
|
||||||
|
queryStore.registerFetch({ path: this.path, func: this.fetch, tag: this.tag })
|
||||||
|
|
||||||
|
this.$set(this, 'pageData', queryStore.pageData[this.$route.path][this.tag])
|
||||||
|
await this.fetch()
|
||||||
|
this.resizeHeight()
|
||||||
|
}
|
||||||
|
|
||||||
|
async mounted() {
|
||||||
|
this.initSortable()
|
||||||
|
window.addEventListener('resize', this.resizeHeight)
|
||||||
|
await this.$nextTick()
|
||||||
|
}
|
||||||
|
|
||||||
|
initSortable() {
|
||||||
|
if (!this.enableDrag) return
|
||||||
|
const tbody = this.tableRef.$el.querySelector('.el-table__body-wrapper table tbody')
|
||||||
|
if (!tbody) return
|
||||||
|
|
||||||
|
const onEnd = async event => {
|
||||||
|
const list = this.list.splice(0)
|
||||||
|
await this.$nextTick()
|
||||||
|
const { oldIndex, newIndex } = event
|
||||||
|
const oldObj = list[oldIndex]
|
||||||
|
const newObj = list[newIndex]
|
||||||
|
oldObj.sort = newIndex
|
||||||
|
newObj.sort = oldIndex
|
||||||
|
list[oldIndex] = newObj
|
||||||
|
list[newIndex] = oldObj
|
||||||
|
this.list.push(...list)
|
||||||
|
this.$emit('sort', this.list)
|
||||||
|
this.$emit('sort-change', { newObj, oldObj })
|
||||||
|
}
|
||||||
|
|
||||||
|
new Sortable(tbody, {
|
||||||
|
group: `TableComponent:${this._uid}`,
|
||||||
|
handle: '.el-icon-s-fold.handle',
|
||||||
|
draggable: 'tr.el-table__row',
|
||||||
|
onEnd
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
@Watch('api')
|
||||||
|
onWatchApiChange(api) {
|
||||||
|
this.currentPage = 1
|
||||||
|
this.fetch()
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
window.removeEventListener('resize', this.resizeHeight)
|
||||||
|
queryStore.unregisterFetch(this.path, this.tag)
|
||||||
|
}
|
||||||
|
|
||||||
|
async setHeight() {
|
||||||
|
if (this.propHeightOk) return
|
||||||
|
if (!this.tableRef) await this.$nextTick()
|
||||||
|
if (!this.tableRef || !this.tableRef.$el) return
|
||||||
|
this.rootHeight = document.body.clientHeight - this.tableRef.$el.offsetTop - 60
|
||||||
|
this.tableHeightData = this.rootHeight - 85
|
||||||
|
}
|
||||||
|
|
||||||
|
resizeHeight = debounce(this.setHeight.bind(this), 300)
|
||||||
|
|
||||||
|
@Watch('currentPage')
|
||||||
|
/**
|
||||||
|
* 页码有变化时获取数据
|
||||||
|
*/
|
||||||
|
onWatchCurrentPageChange(page) {
|
||||||
|
this.fetch()
|
||||||
|
}
|
||||||
|
|
||||||
|
onSizeChange(size) {
|
||||||
|
this.size = size
|
||||||
|
this.currentPage = 1
|
||||||
|
this.fetch()
|
||||||
|
}
|
||||||
|
|
||||||
|
onSelectionChange(rows) {
|
||||||
|
this.$emit('selection-change', rows)
|
||||||
|
this.$set(this, 'selectedRows', rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出数据
|
||||||
|
* @param {string} name 工作薄名
|
||||||
|
* @param {string} filename 文件名
|
||||||
|
* @param {Array} 英文字段-中文转换表
|
||||||
|
*/
|
||||||
|
exportData(name, filename, fields) {
|
||||||
|
if (this.exporting) return
|
||||||
|
this.exporting = true
|
||||||
|
const data = this.selectedRows.map(item => {
|
||||||
|
const result = {}
|
||||||
|
|
||||||
|
fields.forEach(([en, cn]) => {
|
||||||
|
result[cn] = item[en]
|
||||||
|
|
||||||
|
// 特殊处理的字段
|
||||||
|
if (en in this.exportSpecialField) {
|
||||||
|
const type = this.exportSpecialField[en]
|
||||||
|
switch (type) {
|
||||||
|
case 'time':
|
||||||
|
result[cn] = toTime(result[cn])
|
||||||
|
return
|
||||||
|
case 'date-time':
|
||||||
|
result[cn] = toDateTime(result[cn])
|
||||||
|
return
|
||||||
|
case 'date':
|
||||||
|
result[cn] = toDate(result[cn])
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else if (typeof result[cn] === 'boolean') {
|
||||||
|
result[cn] = result[cn] ? '是' : '否'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
downloadXlsx(
|
||||||
|
{
|
||||||
|
[name]: data
|
||||||
|
},
|
||||||
|
filename
|
||||||
|
)
|
||||||
|
this.exporting = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取列表数据
|
||||||
|
*/
|
||||||
|
@Provide('fetch')
|
||||||
|
async fetch(query) {
|
||||||
|
if (this.loading) return
|
||||||
|
this.loading = true
|
||||||
|
let data, params
|
||||||
|
|
||||||
|
if (query) {
|
||||||
|
this.currentPage = 1
|
||||||
|
params = query
|
||||||
|
} else {
|
||||||
|
params = queryStore.data[this.path][this.tag]
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.entries(params).forEach(([key, value]) => {
|
||||||
|
if ([undefined, NaN, null, ''].includes(value) || key === '__ob__') {
|
||||||
|
delete params[key]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const page_params = {}
|
||||||
|
|
||||||
|
if (this.visiblePage) {
|
||||||
|
page_params.limit = this.size
|
||||||
|
page_params.page = this.currentPage
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
data = await get(this.api, {
|
||||||
|
params: {
|
||||||
|
...params,
|
||||||
|
...page_params
|
||||||
|
}
|
||||||
|
})
|
||||||
|
this.$emit('response', data)
|
||||||
|
} catch (err) {
|
||||||
|
this.loading = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.total = data.count
|
||||||
|
this.currentPage = data.page || data.currentPage
|
||||||
|
const list = data.results.map(detail => {
|
||||||
|
if (detail.created_time) {
|
||||||
|
detail.created_time = toDateTime(detail.created_time)
|
||||||
|
}
|
||||||
|
if (detail.date_joined) {
|
||||||
|
detail.date_joined = toDateTime(detail.date_joined)
|
||||||
|
}
|
||||||
|
if (detail.release_time) {
|
||||||
|
detail.release_time = toDateTime(detail.release_time)
|
||||||
|
}
|
||||||
|
if (this.responseHandler) return this.responseHandler(detail)
|
||||||
|
return detail
|
||||||
|
})
|
||||||
|
this.$emit('fetch-success', list)
|
||||||
|
this.list.splice(0)
|
||||||
|
this.$set(this, 'list', list)
|
||||||
|
await this.$nextTick()
|
||||||
|
this.$emit('get-table-ref', this.$refs.table)
|
||||||
|
this.loading = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下一页
|
||||||
|
*/
|
||||||
|
nextPage() {
|
||||||
|
this.currentPage++
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上一页
|
||||||
|
*/
|
||||||
|
prevPage() {
|
||||||
|
this.currentPage--
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置当前页码
|
||||||
|
*/
|
||||||
|
resetPage() {
|
||||||
|
this.currentPage = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 切换某行某列的布尔值
|
||||||
|
* @param {number} rowIndex 行
|
||||||
|
* @param {string} name 字段
|
||||||
|
* @param {boolean} status 修改的布尔值
|
||||||
|
*/
|
||||||
|
toggleColumnBoolean(rowIndex, name, status) {
|
||||||
|
const detail = this.list[rowIndex]
|
||||||
|
if (!detail) throw new Error(`列${rowIndex}不存在`)
|
||||||
|
if (typeof detail[name] !== 'boolean') throw new Error(`列${rowIndex}-键${name}不是布尔值`)
|
||||||
|
const oldValue = detail[name]
|
||||||
|
detail[name] = status
|
||||||
|
this.$emit('column-bool-change', {
|
||||||
|
row: rowIndex,
|
||||||
|
name,
|
||||||
|
value: status,
|
||||||
|
oldValue
|
||||||
|
})
|
||||||
|
return status
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置某行某列的值
|
||||||
|
* @param {number} rowIndex 行
|
||||||
|
* @param {string} name 字段
|
||||||
|
* @param {any} value 修改的值
|
||||||
|
*/
|
||||||
|
setColumnValue(rowIndex, name, value) {
|
||||||
|
const detail = this.list[rowIndex]
|
||||||
|
if (!detail) throw new Error(`列${rowIndex}不存在`)
|
||||||
|
const oldValue = detail[name]
|
||||||
|
detail[name] = value
|
||||||
|
this.$emit('column-value-change', {
|
||||||
|
row: rowIndex,
|
||||||
|
name,
|
||||||
|
value,
|
||||||
|
oldValue
|
||||||
|
})
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化日期对象
|
||||||
|
* @param {string|Date} date 日期对象/字符串
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
formatDate(date, time = true) {
|
||||||
|
return time ? toDateTime(date) : toDate(date)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 格式化日期对象
|
||||||
|
* @param {string|Date} date 日期对象/字符串
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
formatTime(date) {
|
||||||
|
return toTime(date)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调用删除接口
|
||||||
|
* @param {string} api 接口地址
|
||||||
|
* @param {string} message 提示消息
|
||||||
|
* @returns {Promise<boolean>} 是否删除成功
|
||||||
|
*/
|
||||||
|
async del(api, message = '是否确认删除') {
|
||||||
|
await this.$confirm(message)
|
||||||
|
try {
|
||||||
|
await RequestDelete(api)
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`
|
||||||
|
Table组件调用删除接口失败
|
||||||
|
接口地址 ${api}
|
||||||
|
原因:
|
||||||
|
${err.message || err}
|
||||||
|
`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
this.fetch()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
async multiStepReq(ids, req, options = {}) {
|
||||||
|
const baseOptions = {
|
||||||
|
confirmMessage: '是否确认此操作?',
|
||||||
|
successMessage: '批量操作成功'
|
||||||
|
}
|
||||||
|
options = Object.assign({}, baseOptions, options)
|
||||||
|
await this.$confirm(options.confirmMessage)
|
||||||
|
for (const id of ids) {
|
||||||
|
await req(id, this.selectedRows)
|
||||||
|
}
|
||||||
|
this.$message.success(options.successMessage)
|
||||||
|
this.fetch()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.page {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.mo3 {
|
||||||
|
overflow: hidden;
|
||||||
|
-webkit-line-clamp: 3;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
display: -webkit-box;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tooltip__popper {
|
||||||
|
max-width: 500px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* @Author: your name
|
||||||
|
* @Date: 2020-09-07 10:17:01
|
||||||
|
* @LastEditTime: 2021-02-18 14:51:58
|
||||||
|
* @LastEditors: Please set LastEditors
|
||||||
|
* @Description: In User Settings Edit,
|
||||||
|
* @FilePath: \dbadmin\src\store\index.js
|
||||||
|
*/
|
||||||
|
import Vue from 'vue'
|
||||||
|
import Vuex from 'vuex'
|
||||||
|
import query from './modules/query'
|
||||||
|
|
||||||
|
Vue.use(Vuex)
|
||||||
|
|
||||||
|
const store = new Vuex.Store({
|
||||||
|
modules: {
|
||||||
|
app,
|
||||||
|
api,
|
||||||
|
user,
|
||||||
|
tagsView,
|
||||||
|
permission,
|
||||||
|
query
|
||||||
|
},
|
||||||
|
getters
|
||||||
|
})
|
||||||
|
|
||||||
|
export default store
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* @Author: your name
|
||||||
|
* @Date: 2020-10-28 14:40:52
|
||||||
|
* @LastEditTime: 2020-12-29 14:33:05
|
||||||
|
* @LastEditors: Please set LastEditors
|
||||||
|
* @Description: In User Settings Edit
|
||||||
|
* @FilePath: \dbadmin\src\store\modules\query.js
|
||||||
|
*/
|
||||||
|
import { Module, VuexModule, Mutation } from 'vuex-module-decorators'
|
||||||
|
|
||||||
|
export const DEFAULT_TAG = 'default'
|
||||||
|
|
||||||
|
function nullObj() {
|
||||||
|
return Object.create(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Module({ name: 'query', namespaced: true })
|
||||||
|
class Query extends VuexModule {
|
||||||
|
data = nullObj()
|
||||||
|
|
||||||
|
pageData = nullObj()
|
||||||
|
|
||||||
|
fetchs = nullObj()
|
||||||
|
|
||||||
|
@Mutation
|
||||||
|
init(data) {
|
||||||
|
let path = ''
|
||||||
|
let initData = nullObj()
|
||||||
|
let tag = DEFAULT_TAG
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
path = data
|
||||||
|
} else if (typeof data === 'object') {
|
||||||
|
if (data.path) path = data.path
|
||||||
|
if (data.initData) initData = data.initData
|
||||||
|
if (data.tag) tag = data.tag
|
||||||
|
}
|
||||||
|
if (!path) throw new Error('path不能为空')
|
||||||
|
initPath.call(this, path)
|
||||||
|
if (!this.data[path][tag]) {
|
||||||
|
this.data[path][tag] = initData
|
||||||
|
}
|
||||||
|
if (!this.pageData[path][tag]) {
|
||||||
|
this.pageData[path][tag] = {
|
||||||
|
page: 1,
|
||||||
|
size: 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mutation
|
||||||
|
setData({ path, data, tag = DEFAULT_TAG }) {
|
||||||
|
initPath.call(this, path)
|
||||||
|
this.data[path][tag] = data
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mutation
|
||||||
|
registerFetch({ path, func, tag = DEFAULT_TAG }) {
|
||||||
|
initPath.call(this, path)
|
||||||
|
this.fetchs[path][tag] = func
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mutation
|
||||||
|
unregisterFetch(path, tag = DEFAULT_TAG) {
|
||||||
|
initPath.call(this, path)
|
||||||
|
delete this.fetchs[path][tag]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function initPath(path) {
|
||||||
|
if (this instanceof Window) {
|
||||||
|
throw new Error('initPath this对象没有绑定')
|
||||||
|
}
|
||||||
|
if (!this.data[path]) this.data[path] = nullObj()
|
||||||
|
if (!this.pageData[path]) this.pageData[path] = nullObj()
|
||||||
|
if (!this.fetchs[path]) this.fetchs[path] = nullObj()
|
||||||
|
}
|
||||||
|
|
||||||
|
// function initTag(path, tag) {
|
||||||
|
// if (this instanceof Window) {
|
||||||
|
// throw new Error('initPath this对象没有绑定')
|
||||||
|
// }
|
||||||
|
// initTag.call(path)
|
||||||
|
// if (!this.data[path][tag]) this.data[path][tag] = nullObj()
|
||||||
|
// if (!this.pageData[path][tag]) this.pageData[path][tag] = nullObj()
|
||||||
|
// if (!this.fetchs[path][tag]) this.fetchs[path][tag] = nullObj()
|
||||||
|
// }
|
||||||
|
|
||||||
|
export default Query
|
Loading…
Reference in New Issue