MT:新增树形菜单页面

This commit is contained in:
MT 2021-11-05 13:44:21 +08:00
parent 1d957c76d5
commit 4b8a88b31e
3 changed files with 240 additions and 5 deletions

View File

@ -43,3 +43,9 @@
- (新增)数据源管理 - (新增)数据源管理
- (新增)数据库管理 - (新增)数据库管理
- (新增) - (新增)
## 开发日志
### 2021-11-04
> 升级magic-editor到1.6.3版本

View File

@ -59,13 +59,11 @@ export default {
{ {
field: 'name', field: 'name',
title: '菜单名称', title: '菜单名称',
width: '400',
align: 'left' align: 'left'
}, },
{ {
field: 'url', field: 'url',
title: '路径', title: '路径',
width: '250',
align: 'left' align: 'left'
}, },
{ {
@ -94,26 +92,27 @@ export default {
{ {
title: '操作', title: '操作',
type: 'btns', type: 'btns',
width: 262,
fixed: 'right', fixed: 'right',
align: 'left', align: 'left',
btns: [ btns: [
{ {
title: '添加下级菜单', title: '添加下级菜单',
type: 'primary', type: 'text',
click: (row) => { click: (row) => {
this.addSubMenu(row.id) this.addSubMenu(row.id)
} }
}, },
{ {
title: '编辑', title: '编辑',
type: 'primary', type: 'text',
click: (row) => { click: (row) => {
this.handleUpdate(row) this.handleUpdate(row)
} }
}, },
{ {
title: '删除', title: '删除',
type: 'danger', type: 'text',
click: (row) => { click: (row) => {
this.$common.handleDelete({ this.$common.handleDelete({
url: 'menu/delete', url: 'menu/delete',

View File

@ -0,0 +1,230 @@
<template>
<div class="app-container">
<el-button class="filter-item" style="margin-bottom:10px;" type="primary" icon="el-icon-edit" @click="addSubMenu('0')">
添加菜单
</el-button>
<el-tree :data="menuTreeList"
:props="defaultProps"
node-key="id"
:default-expanded-keys="menuTreeExpandedList"
draggable>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>{{ node.label }}</span>
<span>
<el-button
type="text"
size="mini"
style="width: 270px;text-align: left;color: #5a5e66;"
@click="() => append(data)">
{{ data.url }}
</el-button>
<el-button
type="text"
size="mini"
style="width: 100px;text-align: left;color: #5a5e66;"
@click="() => append(data)">
{{ data.permission }}
</el-button>
<el-button
type="text"
size="mini"
style="width: 100px;text-align: left;color: #5a5e66;"
@click="() => append(data)">
{{ data.sort }}
</el-button>
<el-button
type="text"
size="mini"
style="width: 100px;text-align: left;color: #5a5e66;"
@click="() => append(data)">
{{ data.isShow }}
</el-button>
<el-button
type="text"
size="mini"
@click="() => append(data)">
添加下级菜单
</el-button>
<el-button
type="text"
size="mini"
@click="() => remove(node, data)">
编辑
</el-button>
<el-button
type="text"
size="mini"
@click="() => remove(node, data)">
删除
</el-button>
</span>
</span>
</el-tree>
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" :close-on-click-modal="false">
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="100px" style="width: 400px; margin-left:50px;">
<el-form-item label="菜单名称" prop="name">
<el-input v-model="temp.name" />
</el-form-item>
<el-form-item label="菜单链接" prop="url">
<el-input v-model="temp.url" />
</el-form-item>
<el-form-item label="权限标识" prop="permission">
<el-input v-model="temp.permission" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="temp.sort" />
</el-form-item>
<el-form-item label="描述">
<el-input v-model="temp.descRibe" :autosize="{ minRows: 4, maxRows: 6}" type="textarea" />
</el-form-item>
<el-form-item label="是否显示">
<el-checkbox v-model="temp.isShow">显示</el-checkbox>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">
关闭
</el-button>
<el-button type="primary" @click="save()">
确认
</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
menuTreeExpandedList:[],
menuTreeList:[],
defaultProps: {
children: 'children',
label: 'name'
},
dialogFormVisible: false,
dialogStatus: '',
textMap: {
update: '修改',
create: '添加'
},
temp: this.getTemp(),
listConfigDialogVisible: false,
formConfigDialogVisible: false,
rules: {
name: [{ required: true, message: '请输入菜单名称', trigger: 'change' }]
}
}
},
created(){
this.getMenuTreeList();
},
methods: {
getMenuTreeList(){
this.$get('menu/tree', { pid: this.temp.pid }).then(res => {
this.menuTreeList = res.data.list
this.menuTreeExpandedList = this.getMenuId(this.menuTreeList);
console.log(this.menuTreeList)
console.log(this.menuTreeExpandedList)
})
},
getMenuId(menuArr){
let idArr = [];
if (menuArr != null && menuArr.length > 0){
for (let i = 0; i < menuArr.length; i++) {
idArr.push(menuArr[i].id);
idArr.push(...this.getMenuId(menuArr[i].children));
}
}
return idArr;
},
getTemp() {
return {
id: '',
name: '',
url: '',
permission: '',
sort: 0,
descRibe: '',
isShow: true,
pid: ''
}
},
resetTemp() {
this.temp = this.getTemp()
},
getSort() {
this.$get('menu/sort', { pid: this.temp.pid }).then(res => {
this.temp.sort = res.data
})
},
addSubMenu(id) {
this.resetTemp()
this.temp.pid = id
this.temp.id = this.$common.uuid()
this.getSort()
this.dialogStatus = 'create'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
},
save() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.temp.isShow = this.temp.isShow === true ? 1 : 0
this.$post('menu/save', this.temp).then(() => {
this.reloadTable()
this.dialogFormVisible = false
this.$notify({
title: '成功',
message: (this.dialogStatus === 'create' ? '创建' : '修改') + '成功',
type: 'success',
duration: 2000
})
})
}
})
},
reloadTable() {
this.$refs.table.reloadList()
},
handleUpdate(row) {
for (var t in this.temp) {
if (t === 'isShow') {
if (row[t] === 1) {
this.temp[t] = true
} else {
this.temp[t] = false
}
} else {
this.temp[t] = row[t]
}
}
this.dialogStatus = 'update'
this.dialogFormVisible = true
this.$nextTick(() => {
this.$refs['dataForm'].clearValidate()
})
}
}
}
</script>
<style>
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
</style>