多租户商城-平台端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

533 lines
17 KiB

<!-- -->
<template>
<div class="userStyleMenus">
<!-- 搜索 -->
<FixedNav class="formSearch" :height="200">
<div class="searchInput">
<span>菜单名</span>
<el-input v-model="formInline.permissionName" maxlength="20" placeholder="请输入菜单名" />
</div>
<el-button type="primary" plain @click="search">查询</el-button>
<el-button type="info" plain @click="clear">重置</el-button>
<el-button type="success" plain @click="add(1)">新增父级目录</el-button>
<el-button type="success" plain @click="add(2)">新增子级菜单</el-button>
<el-button type="success" plain @click="add(3)">新增子级按钮</el-button>
<el-button type="success" plain @click="syncMenu()">同步菜单</el-button>
</FixedNav>
<!-- 表 格 default-expand-all -->
<div class="tableBox">
<el-table
ref="menuList"
:data="tableData"
style="width: 100%; margin-bottom: 20px"
row-key="permissionId"
border
:header-cell-style="{ background: '#EEF3FF', color: '#333333' }"
:tree-props="{ children: 'childs', hasChildren: 'hasChildren' }"
@select="select"
@select-all="selectAll"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="permissionName" label="菜单名称" />
<el-table-column label="图标">
<template slot-scope="scope">
<div>
<i :class="scope.row.icon" />
</div>
</template>
</el-table-column>
<el-table-column prop="permission" label="菜单标识" />
<el-table-column prop="createTime" label="创建时间" />
<el-table-column label="操作" show-overflow-tooltip>
<template slot-scope="scope">
<div class="btnList">
<el-button type="text" @click="edit(scope.row)">编辑</el-button>
<el-button type="text" @click="del(scope.row)">删除</el-button>
</div>
</template>
</el-table-column>
</el-table>
<div class="fenye">
<el-pagination
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="10"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
<!-- *************对话框开始************* -->
<el-dialog
:title="userState ? '新增菜单' : '修改菜单'"
:visible.sync="addFormDialog"
width="30%"
center
:close-on-click-modal="false"
>
<!-- 新增角色 -->
<div>
<el-form ref="ruleForm" :model="addForm" label-width="80px" :rules="userRules">
<el-form-item label="父节点ID">
<el-input v-model="addForm.permissionPid" maxlength="20" :disabled="true" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item label="菜单名称" prop="permissionName">
<el-input v-model="addForm.permissionName" maxlength="20" placeholder="请输入菜单名称" />
</el-form-item>
<el-form-item label="菜单路径" prop="permission">
<el-input v-model="addForm.permission" maxlength="40" placeholder="请输入菜单路径" />
</el-form-item>
<el-form-item label="图标地址" prop="icon">
<el-input
v-model="addForm.icon"
:prefix-icon="addForm.icon"
placeholder="请输入图片地址"
@focus="getFocus"
/>
</el-form-item>
<el-form-item label="菜单描述">
<el-input v-model="addForm.describe" maxlength="60" placeholder="请输入菜单描述" />
</el-form-item>
<el-form-item label="排序值" prop="sort">
<el-input v-model="addForm.sort" maxlength="9" placeholder="请输入排序值" oninput="value=value.replace(/[^\d]/g,'')" />
</el-form-item>
<el-form-item label="权限类型" prop="resourceType">
<el-select v-model="addForm.resourceType" placeholder="请选择活动区域">
<el-option label="菜单" value="menu" />
<el-option label="按钮" value="button" />
<el-option label="目录" value="catalog" />
</el-select>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="addFormDialog = false">取 消</el-button>
<el-button type="primary" @click="addForm_enter('ruleForm')">确 定</el-button>
</span>
</el-dialog>
<!-- *************同步菜单对话框开始************* -->
<el-dialog
:title="'同步菜单'"
:visible.sync="syncMenuDialog"
width="30%"
center
:close-on-click-modal="false"
>
<!-- 新增角色 -->
<div>
<el-form ref="syncMenuForm" :model="syncMenuForm" label-width="80px" :rules="syncMenuRules">
<el-form-item label="同步范围" prop="syncAll">
<el-radio-group v-model="syncMenuForm.syncAll">
<el-radio :label="true">同步所有</el-radio>
<el-radio :label="false">同步指定商家</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="删除菜单">
<el-checkbox v-model="syncMenuForm.delMenu" />
</el-form-item>
<el-form-item v-if="syncMenuForm.syncAll==false" label="商家账号">
<el-input v-model="syncMenuForm.syncBusinessUsername" maxlength="20" placeholder="请输入商家账号" />
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="syncMenuDialog = false">取 消</el-button>
<el-button type="primary" :loading="loading" @click="submitSyncMenu('syncMenuForm')"> </el-button>
</span>
</el-dialog>
<Icons :dialog-visible="iconVisible" @choose="chooseIcon" @close="iconVisible = false" />
</div>
</template>
<script>
import {
businessTabsGetAll,
businessTabsAdd,
businessTabsGetById,
businessTabsUpdate,
businessTabsDelete,
businessGetMaxSort,
businessSyncMenu
} from '@/api/setup'
import Icons from './Icons'
import { Message } from 'element-ui'
import FixedNav from '@/components/FixedNav/index.vue'
export default {
// import引入的组件需要注入到对象中才能使用
components: {
Icons,
FixedNav
},
data () {
// 这里存放数据
return {
formInline: {
permissionName: '', // 搜索字段
page: '1', // 当前页
pageSize: '10' // 每页记录数
},
total: 1,
tableData: [],
currentPage: 1,
userState: 1,
addForm: {
permissionPid: '', // 父节点id
permissionName: '', // 权限名称
permissionUri: '', // URI
permission: '', // 组件
icon: '', // 图标地址
describe: '', // 描述
resourceType: 'menu', // 权限类型 menu-菜单 button-按钮 catalog-目录
sort: '' // 排序值
},
syncMenuForm: {
syncAll: false,
syncBusinessUsername: '',
delMenu: false
},
addFormDialog: false,
syncMenuDialog: false,
userRules: {
permissionName: [
{ required: true, message: '请输入权限名称', trigger: 'blur' }
],
permission: [
{ required: true, message: '请输入菜单路径', trigger: 'blur' }
],
resourceType: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
],
sort: [{ required: true, message: '请输入菜单路径', trigger: 'blur' }],
icon: [{ required: true, message: '请输入图标地址', trigger: 'blur' }]
},
syncMenuRules: {},
iconVisible: false,
multipleSelection: [],
loading: false
}
},
mounted () {
this.getAll(this.formInline)
},
// 方法集合
methods: {
handleSelectionChange (val) {
// console.dir(this.$refs.menuList.selection)
// const sel = this.extract(val)
this.multipleSelection = val
// console.dir(this.$refs.menuList)
},
setChildren (children, type) {
// 编辑多个子层级
children.map(j => {
this.toggleSelection(j, type)
if (j.childs) {
this.setChildren(j.childs, type)
}
})
},
// 选中父节点时,子节点一起选中取消
select (selection, row) {
if (selection.some(el => { return row.permissionId === el.permissionId })) {
if (row.childs) {
// row.childList.map(j => {
// this.toggleSelection(j, true)
// })
// 解决子组件没有被勾选到
this.setChildren(row.childs, true)
}
} else {
if (row.childs) {
// row.childList.map(j => {
// this.toggleSelection(j, false)
// })
this.setChildren(row.childs, false)
}
}
},
toggleSelection (row, select) {
if (row) {
this.$nextTick(() => {
this.$refs.menuList && this.$refs.menuList.toggleRowSelection(row, select)
})
}
},
// 选择全部
selectAll (selection) {
// tabledata第一层只要有在selection里面就是全选
const isSelect = selection.some(el => {
const tableDataIds = this.tableData.map(j => j.permissionId)
return tableDataIds.includes(el.permissionId)
})
// tableDate第一层只要有不在selection里面就是全不选
const isCancel = !this.tableData.every(el => {
const selectIds = selection.map(j => j.permissionId)
return selectIds.includes(el.permissionId)
})
console.log(isSelect, 'isSelect')
if (isSelect) {
selection.map(el => {
if (el.childs) {
// el.childList.map(j => {
// this.toggleSelection(j, true)
// })
// 解决子组件没有被勾选到
this.setChildren(el.childs, true)
}
})
}
if (isCancel) {
this.tableData.map(el => {
if (el.childs) {
// el.childList.map(j => {
// this.toggleSelection(j, false)
// })
// 解决子组件没有被勾选到
this.setChildren(el.childs, false)
}
})
}
this.$emit('handleSelect', this.tableData)
},
handleSizeChange (val) {
this.formInline.pageSize = val
this.getAll(this.formInline)
},
handleCurrentChange (val) {
this.formInline.page = val
this.getAll(this.formInline)
},
// 查询
search () {
this.total = 1
this.formInline.page = 1
this.getAll(this.formInline)
},
// 清除
clear () {
this.formInline = {
permissionName: '', // 搜索字段
page: '1', // 当前页
pageSize: '10' // 每页记录数
}
this.getAll(this.formInline)
},
// 新增角色
add (index) {
this.userState = 1
businessGetMaxSort().then(res => {
if (index === 1) {
if (this.multipleSelection.length >= 1) {
this.$message({
message: '请勿选择节点进行操作'
})
return
}
this.addForm = {
permissionPid: '', // 父节点id
permissionName: '', // 权限名称
permissionUri: '', // URI
permission: '', // 组件
icon: '', // 图标地址
describe: '', // 描述
resourceType: 'catalog', // 权限类型 menu-菜单 button-按钮 catalog-目录
sort: parseInt(res.data) // 排序值
}
this.addFormDialog = true
} else if (index === 2) {
if (this.multipleSelection.length === 0) {
this.$message({
message: '请选择父节点'
})
return
}
if (this.multipleSelection[0].permissionPid !== 0) {
this.$message({
message: '请选择父节点进行操作'
})
return
}
this.addForm = {
permissionPid: this.multipleSelection[0].permissionId, // 父节点id
permissionName: '', // 权限名称
permissionUri: '', // URI
permission: '', // 组件
icon: '', // 图标地址
describe: '', // 描述
resourceType: 'menu', // 权限类型 menu-菜单 button-按钮 catalog-目录
sort: parseInt(res.data) // 排序值
}
this.addFormDialog = true
} else if (index === 3) {
if (this.multipleSelection.length === 0) {
this.$message({
message: '请选择子节点'
})
return
}
if (
this.multipleSelection[0].permissionPid === 0 &&
this.multipleSelection[0].childs.length !== 0
) {
this.$message({
message: '请勿选择父节点进行操作'
})
return
}
this.addForm = {
permissionPid: this.multipleSelection[0].permissionId, // 父节点id
permissionName: '', // 权限名称
permissionUri: '', // URI
permission: '', // 组件
icon: 'el-icon-minus', // 图标地址
describe: '', // 描述
resourceType: 'button', // 权限类型 menu-菜单 button-按钮 catalog-目录
sort: parseInt(res.data) // 排序值
}
this.addFormDialog = true
}
})
},
syncMenu () {
if (this.multipleSelection.length === 0) {
this.$message({
message: '请选择要同步的节点'
})
return
}
this.syncMenuForm.syncAll = true
this.syncMenuForm.syncBusinessUsername = ''
this.syncMenuForm.delMenu = false
this.syncMenuDialog = true
},
submitSyncMenu (syncMenuForm) {
const that = this
this.$refs[syncMenuForm].validate(valid => {
if (valid) {
if (that.syncMenuForm.syncAll === false && that.syncMenuForm.syncBusinessUsername === '') {
this.$message({
message: '请输入要同步的商家账号'
})
return
}
this.loading = true
businessSyncMenu(Object.assign({}, this.syncMenuForm, { syncMenu: this.multipleSelection })).then(res => {
if (res.code === '') {
this.$message({
message: '同步成功',
type: 'success'
})
}
this.loading = false
this.syncMenuDialog = false
}).catch(error => {
if (error && error.message.includes('timeout')) {
Message({
message: '后台正在异步处理,请关注商家端菜单变化',
type: 'error',
duration: 2 * 1000
})
}
this.loading = false
this.syncMenuDialog = false
})
}
})
},
// 确认新增角色
addForm_enter (ruleForm) {
this.$refs[ruleForm].validate(valid => {
if (valid) {
if (this.userState) {
businessTabsAdd(this.addForm).then(res => {
if (res.code === '') {
this.$message({
message: '新增成功',
type: 'success'
})
}
this.getAll(this.formInline)
this.addFormDialog = false
})
} else {
businessTabsUpdate(this.addForm).then(res => {
if (res.code === '') {
this.$message({
message: '修改成功',
type: 'success'
})
}
this.getAll(this.formInline)
this.addFormDialog = false
})
}
} else {
console.log('error submit!!')
return false
}
})
},
// 编辑角色
edit (row) {
this.userState = 0
this.addFormDialog = true
businessTabsGetById({ permissionId: row.permissionId }).then(res => {
this.addForm = res.data
// this.addForm.roleIds = [1];
})
},
// 删除角色
async del (row) {
const res = await businessTabsDelete({ permissionId: row.permissionId })
if (res.code === '') {
this.$message({
message: '删除成功',
type: 'success'
})
}
this.getAll(this.formInline)
},
// 组件传回值
chooseIcon (icon) {
this.addForm.icon = icon
this.iconVisible = false
},
getFocus () {
this.iconVisible = true
},
// 初始化查询所有数据
async getAll (formInline) {
const res = await businessTabsGetAll(formInline)
this.tableData = res.data.list
this.total = res.data.total
}
}
}
</script>
<style lang='scss' scoped>
//@import url(); 引入公共css类
@import url("../../../styles/elDialog.scss");
.userStyleMenus {
.formSearch{
padding: 20px 30px;
display: flex;
.searchInput{
margin-right: 20px;
display: flex;
align-items: center;
span{
min-width: 80px;
}
}
}
.tableBox{
margin: 0 20px 20px;
}
}
</style>