代码优化

This commit is contained in:
Elune
2019-12-14 12:27:14 +08:00
parent 9f4689dc32
commit b60dcbf078
13 changed files with 295 additions and 228 deletions

View File

@@ -24,7 +24,7 @@
</el-button>
<el-button
slot="reference"
v-permission="permission.delete"
v-permission="permission.del"
class="filter-item"
type="danger"
icon="el-icon-delete"

View File

@@ -1,3 +1,4 @@
<!--分页-->
<template>
<el-pagination
:page-size.sync="page.size"

View File

@@ -0,0 +1,22 @@
<!--搜索与重置-->
<template>
<span>
<el-button class="filter-item" size="mini" type="success" icon="el-icon-search" @click="crud.toQuery">搜索</el-button>
<el-button class="filter-item" size="mini" type="warning" icon="el-icon-refresh-left" @click="crud.resetQuery()">重置</el-button>
</span>
</template>
<script>
export default {
props: {
crud: {
type: Object,
required: true
},
itemClass: {
type: String,
required: false,
default: ''
}
}
}
</script>

View File

@@ -0,0 +1,48 @@
<template>
<div>
<el-button v-permission="permission.edit" size="mini" type="primary" icon="el-icon-edit" @click="crud.toEdit(data)" />
<el-popover v-model="pop" v-permission="permission.del" placement="top" width="180" trigger="manual">
<p>确定删除本条数据吗</p>
<div style="text-align: right; margin: 0">
<el-button size="mini" type="text" @click="doCancel">取消</el-button>
<el-button :loading="crud.dataStatus[data.id].delete === 2" type="primary" size="mini" @click="crud.doDelete(data)">确定</el-button>
</div>
<el-button slot="reference" type="danger" icon="el-icon-delete" size="mini" @click="toDelete" />
</el-popover>
</div>
</template>
<script>
import CRUD, { crud } from '@crud/crud'
export default {
mixins: [crud()],
props: {
data: {
type: Object,
required: true
},
permission: {
type: Object,
required: true
}
},
data() {
return {
pop: false
}
},
methods: {
doCancel() {
this.pop = false
this.crud.cancelDelete(this.data)
},
toDelete() {
this.pop = true
},
[CRUD.HOOK.afterDelete](crud, data) {
if (data === this.data) {
this.pop = false
}
}
}
}
</script>

View File

@@ -121,6 +121,8 @@ function CRUD(options) {
}
crud.resetForm()
crud.status.add = CRUD.STATUS.PREPARED
callVmHook(crud, CRUD.HOOK.afterToAdd, crud.form)
callVmHook(crud, CRUD.HOOK.afterToCU, crud.form)
},
/**
* 启动编辑
@@ -133,6 +135,8 @@ function CRUD(options) {
crud.resetForm(JSON.parse(JSON.stringify(data)))
crud.status.edit = CRUD.STATUS.PREPARED
crud.getDataStatus(data.id).edit = CRUD.STATUS.PREPARED
callVmHook(crud, CRUD.HOOK.afterToEdit, crud.form)
callVmHook(crud, CRUD.HOOK.afterToCU, crud.form)
},
/**
* 启动删除
@@ -334,12 +338,18 @@ function CRUD(options) {
*/
resetDataStatus() {
const dataStatus = {}
crud.data.forEach(e => {
dataStatus[e.id] = {
delete: 0,
edit: 0
}
})
function resetStatus(datas) {
datas.forEach(e => {
dataStatus[e.id] = {
delete: 0,
edit: 0
}
if (e.children) {
resetStatus(e.children)
}
})
}
resetStatus(crud.data)
crud.dataStatus = dataStatus
},
/**
@@ -350,7 +360,7 @@ function CRUD(options) {
return crud.dataStatus[id]
},
findVM(type) {
return crud.vms.find(vm => vm.type === type).vm
return crud.vms.find(vm => vm && vm.type === type).vm
},
notify(title, type = CRUD.NOTIFICATION_TYPE.INFO) {
crud.vms[0].vm.$notify({
@@ -396,7 +406,7 @@ function CRUD(options) {
* @param {*} vm 组件实例
*/
unregisterVM(vm) {
this.vms.splice(this.vms.findIndex(e => e.vm === vm), 1)
this.vms.splice(this.vms.findIndex(e => e && e.vm === vm), 1)
}
})
// 冻结处理需要扩展数据的话使用crud.updateProp(name, value)以crud.props.name形式访问这个是响应式的可以做数据绑定
@@ -414,10 +424,11 @@ function callVmHook(crud, hook) {
for (let i = 2; i < arguments.length; ++i) {
nargs.push(arguments[i])
}
crud.vms.forEach(({
vm
}) => {
if (vm && vm[hook]) {
// 有些组件扮演了多个角色,调用钩子时,需要去重
const vmSet = new Set()
crud.vms.forEach(vm => vm && vmSet.add(vm.vm))
vmSet.forEach(vm => {
if (vm[hook]) {
ret = vm[hook].apply(vm, nargs) !== false && ret
}
})
@@ -602,10 +613,16 @@ CRUD.HOOK = {
afterDeleteCancel: 'afterCrudDeleteCancel',
/** 新建 - 之前 */
beforeToAdd: 'beforeCrudToAdd',
/** 新建 - 之后 */
afterToAdd: 'afterCrudToAdd',
/** 编辑 - 之前 */
beforeToEdit: 'beforeCrudToEdit',
/** 编辑 - 之后 */
afterToEdit: 'afterCrudToEdit',
/** 开始 "新建/编辑" - 之前 */
beforeToCU: 'beforeCrudToCU',
/** 开始 "新建/编辑" - 之后 */
afterToCU: 'afterCrudToCU',
/** "新建/编辑" 验证 - 之前 */
beforeValidateCU: 'beforeCrudValidateCU',
/** "新建/编辑" 验证 - 之后 */

View File

@@ -0,0 +1,133 @@
<!--增删改查-->
<template>
<div class="crud-opts">
<span class="crud-opts-left">
<el-button
v-permission="parent.permission.add"
class="filter-item"
size="mini"
type="primary"
icon="el-icon-plus"
@click="crud.toAdd"
>
新增
</el-button>
<el-button
v-permission="parent.permission.edit"
class="filter-item"
size="mini"
type="success"
icon="el-icon-edit"
:disabled="crud.selections.length !== 1"
@click="crud.toEdit(crud.selections[0])"
>
修改
</el-button>
<el-button
slot="reference"
v-permission="parent.permission.del"
class="filter-item"
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="parent.selections.length === 0"
@click="toDelete(crud.selections)"
>
删除
</el-button>
<el-button
:loading="parent.downloadLoading"
class="filter-item"
size="mini"
type="warning"
icon="el-icon-download"
@click="parent.doExport"
>导出</el-button>
</span>
<el-button-group class="crud-opts-right">
<el-button
size="mini"
plain
type="info"
icon="el-icon-search"
@click="toggleSearch()"
/>
<el-button
size="mini"
icon="el-icon-refresh"
@click="crud.refresh()"
/>
<el-popover
placement="bottom-end"
width="150"
trigger="click"
>
<el-button
slot="reference"
size="mini"
icon="el-icon-s-grid"
>
<i
class="fa fa-caret-down"
aria-hidden="true"
/>
</el-button>
<el-checkbox
v-for="item in parent.tableColumns"
:key="item.label"
v-model="item.visible"
>
{{ item.label }}
</el-checkbox>
</el-popover>
</el-button-group>
</div>
</template>
<script>
export default {
props: {
parent: {
type: Object,
required: true
}
},
data() {
return {
}
},
created() {
this.parent.updateProp('searchToggle', true)
},
methods: {
toDelete(datas) {
this.$confirm(`确认删除选中的${datas.length}条数据?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if (datas.length === 1) {
this.crud.doDelete(datas[0])
} else {
this.crud.doDeletes(datas)
}
}).catch(() => {
})
},
toggleSearch() {
this.crud.props.searchToggle = !this.crud.props.searchToggle
}
}
}
</script>
<style>
.crud-opts {
padding: 6px 0;
display: -webkit-flex;
display: flex;
align-items: center;
}
.crud-opts .crud-opts-right {
margin-left: auto;
}
</style>

View File

@@ -4,7 +4,6 @@ export default {
inserted(el, binding, vnode) {
const { value } = binding
const roles = store.getters && store.getters.roles
if (value && value instanceof Array && value.length > 0) {
const permissionRoles = value
@@ -16,7 +15,7 @@ export default {
el.parentNode && el.parentNode.removeChild(el)
}
} else {
throw new Error(`need roles! Like v-permission="['admin','editor']"`)
throw new Error(`使用方式: v-permission="['admin','editor']"`)
}
}
}

View File

@@ -1,37 +0,0 @@
<template>
<span>
<el-button
class="filter-item"
size="mini"
type="success"
icon="el-icon-search"
@click="crud.toQuery"
>
搜索
</el-button>
<el-button
class="filter-item"
size="mini"
type="warning"
icon="el-icon-refresh-left"
@click="crud.resetQuery()"
>
重置
</el-button>
</span>
</template>
<script>
export default {
props: {
crud: {
type: Object,
required: true
},
itemClass: {
type: String,
required: false,
default: ''
}
}
}
</script>

View File

@@ -1,82 +0,0 @@
<template>
<div>
<el-button
v-permission="permission.edit"
size="mini"
type="primary"
icon="el-icon-edit"
@click="crud.toEdit(data)"
/>
<el-popover
v-model="pop"
v-permission="permission.delete"
placement="top"
width="180"
trigger="manual"
>
<p>确定删除本条数据吗</p>
<div
v-loading="crud.dataStatus[data.id].delete === 2"
style="text-align: right; margin: 0"
>
<el-button
size="mini"
type="text"
@click="doCancel"
>
取消
</el-button>
<el-button
type="primary"
size="mini"
@click="crud.doDelete(data)"
>
确定
</el-button>
</div>
<el-button
slot="reference"
type="danger"
icon="el-icon-delete"
size="mini"
@click="toDelete"
/>
</el-popover>
</div>
</template>
<script>
import CRUD, { crud } from '@crud/crud'
export default {
mixins: [crud()],
props: {
data: {
type: Object,
required: true
},
permission: {
type: Object,
required: true
}
},
data() {
return {
pop: false
}
},
methods: {
doCancel() {
this.pop = false
this.crud.cancelDelete(this.data)
},
toDelete() {
this.pop = true
},
[CRUD.HOOK.afterDelete](crud, data) {
if (data === this.data) {
this.pop = false
}
}
}
}
</script>