【更新】完善前端给角色授权移动端菜单功能

pull/84/head
小诺 2023-02-01 01:34:22 +08:00
parent a2ac82a1e8
commit fed5dc8bbf
3 changed files with 264 additions and 0 deletions

View File

@ -46,6 +46,14 @@ export default {
roleGrantResource(data) { roleGrantResource(data) {
return request('grantResource', data) return request('grantResource', data)
}, },
// 获取角色拥有移动端菜单
roleOwnMobileMenu(data) {
return request('ownMobileMenu', data, 'get')
},
// 给角色授权移动端菜单
roleGrantMobileMenu(data) {
return request('grantMobileMenu', data)
},
// 获取角色拥有权限 // 获取角色拥有权限
roleOwnPermission(data) { roleOwnPermission(data) {
return request('ownPermission', data, 'get') return request('ownPermission', data, 'get')
@ -70,6 +78,10 @@ export default {
roleResourceTreeSelector(data) { roleResourceTreeSelector(data) {
return request('resourceTreeSelector', data, 'get') return request('resourceTreeSelector', data, 'get')
}, },
// 获取移动端菜单授权树
roleMobileMenuTreeSelector(data) {
return request('mobileMenuTreeSelector', data, 'get')
},
// 获取权限授权树 // 获取权限授权树
rolePermissionTreeSelector(data) { rolePermissionTreeSelector(data) {
return request('permissionTreeSelector', data, 'get') return request('permissionTreeSelector', data, 'get')

View File

@ -0,0 +1,246 @@
<template>
<a-drawer
title="授权移动端资源"
:width="drawerWidth"
:visible="visible"
:destroy-on-close="true"
:show-pagination="false"
:body-style="{ paddingBottom: '80px' }"
:footer-style="{ textAlign: 'right' }"
@close="onClose"
>
<a-spin :spinning="spinningLoading">
<a-radio-group v-model:value="moduleId" button-style="solid" style="padding-bottom: 10px">
<a-radio-button
:key="module.id"
v-for="module in echoDatalist"
:value="module.id"
@click="moduleClock(module.id)"
>
<component :is="module.icon" />
{{ module.title }}</a-radio-button
>
</a-radio-group>
<a-table size="middle" :columns="columns" :data-source="loadDatas" :pagination="false" bordered>
<template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'parentName'">
<a-checkbox :checked="record.parentCheck" @update:checked="(val) => changeParent(record, val)">
{{ record.parentName }}
</a-checkbox>
</template>
<template v-if="column.dataIndex === 'title'">
<a-checkbox :checked="record.nameCheck" @update:checked="(val) => changeSub(record, val)">{{
record.title
}}</a-checkbox>
</template>
</template>
</a-table>
</a-spin>
<template #footer>
<a-button style="margin-right: 8px" @click="onClose"></a-button>
<a-button type="primary" :loading="submitLoading" @click="onSubmit"></a-button>
</template>
</a-drawer>
</template>
<script setup name="grantMobileResourceForm">
import tool from '@/utils/tool'
import roleApi from '@/api/sys/roleApi'
const spinningLoading = ref(false)
let firstShowMap = $ref({})
const emit = defineEmits({ successful: null })
const submitLoading = ref(false)
//
const drawerWidth = 600
// 90%
//(window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) * 0.9
const columns = [
{
key: 'parentName',
title: '一级目录',
dataIndex: 'parentName',
customCell: (row, index) => {
const parentName = row.parentName
const indexArr = firstShowMap[parentName]
if (index === indexArr[0]) {
return { rowSpan: indexArr.length }
}
return { rowSpan: 0 }
},
width: 150
},
{
key: 'title',
title: '菜单',
dataIndex: 'title',
width: 200
}
]
const echoDatalist = ref([])
const moduleId = ref('')
const loadDatas = ref([])
//
const loadData = async () => {
// firstShowMap = {} //
//
if (echoDatalist.value.length > 0) {
let data = echoDatalist.value.find((f) => f.id === moduleId.value).menu
loadDatas.value = data
} else {
//
spinningLoading.value = true
const res = await roleApi.roleMobileMenuTreeSelector()
const param = {
id: resultDataModel.id
}
//
const resEcho = await roleApi.roleOwnMobileMenu(param)
spinningLoading.value = false
echoDatalist.value = echoModuleData(res, resEcho)
moduleId.value = res[0].id
loadDatas.value = echoDatalist.value[0].menu
}
}
let visible = $ref(false)
//
let resultDataModel = {
id: '',
grantInfoList: []
}
//
const onOpen = (record) => {
resultDataModel.id = record.id
visible = true
firstShowMap = {}
loadData()
}
//
const echoModuleData = (data, resEcho) => {
//
data.forEach((module) => {
if (module.menu) {
//
module.menu.forEach((item) => {
const menueCheck = ref(0)
if (resEcho.grantInfoList.length > 0) {
resEcho.grantInfoList.forEach((grant) => {
if (item.id === grant.menuId) {
menueCheck.value++
}
})
}
// 2
if (menueCheck.value > 0) {
item.parentCheck = true
item.nameCheck = true
}
})
//
module.menu = module.menu.sort((a, b) => {
return a.parentId - b.parentId
})
//
module.menu.forEach((item, index) => {
//
if (firstShowMap[item.parentName]) {
firstShowMap[item.parentName].push(index)
} else {
firstShowMap[item.parentName] = [index]
}
})
}
})
return data
}
//
const moduleClock = (value) => {
moduleId.value = value
loadData()
}
//
const handleOnlySelf = (record, key, val) => {
record[key].forEach((item) => {
// 'button'
item.check = val
})
}
//
const changeSub = (record, val) => {
//
record.nameCheck = val
}
//
const changeParent = (record, val) => {
record.parentCheck = val
// id
const moduleMenu = echoDatalist.value.find((f) => record.module === f.id)
const parentName = record.parentName
//
const indexArr = firstShowMap[parentName]
indexArr.forEach((indexItem) => {
//
const row = moduleMenu.menu[indexItem]
//
changeSub(row, val)
})
}
//
const onClose = () => {
//
echoDatalist.value = []
moduleId.value = ''
loadDatas.value = []
firstShowMap = {}
visible = false
}
//
const convertData = () => {
resultDataModel.grantInfoList = []
echoDatalist.value.forEach((table) => {
if (table.menu) {
table.menu.forEach((item) => {
const grantInfo = {
menuId: ''
}
if (item.nameCheck) {
grantInfo.menuId = item.id
resultDataModel.grantInfoList.push(grantInfo)
}
})
}
})
return resultDataModel
}
//
const onSubmit = () => {
const param = convertData()
submitLoading.value = true
roleApi
.roleGrantMobileMenu(param)
.then(() => {
onClose()
emit('successful')
})
.finally(() => {
submitLoading.value = false
})
}
//
defineExpose({
onOpen
})
</script>
<style scoped>
/* 重写复选框的样式 */
.ant-checkbox-wrapper {
margin-left: 0px !important;
padding-top: 2px !important;
padding-bottom: 2px !important;
}
</style>

View File

@ -77,6 +77,9 @@
<a-menu-item> <a-menu-item>
<a @click="GrantResourceForm.onOpen(record)"></a> <a @click="GrantResourceForm.onOpen(record)"></a>
</a-menu-item> </a-menu-item>
<a-menu-item>
<a @click="GrantMobileResourceForm.onOpen(record)"></a>
</a-menu-item>
<a-menu-item> <a-menu-item>
<a @click="GrantPermissionForm.onOpen(record)"></a> <a @click="GrantPermissionForm.onOpen(record)"></a>
</a-menu-item> </a-menu-item>
@ -93,6 +96,7 @@
</a-col> </a-col>
</a-row> </a-row>
<grantResourceForm ref="GrantResourceForm" @successful="table.refresh(true)" /> <grantResourceForm ref="GrantResourceForm" @successful="table.refresh(true)" />
<grantMobileResourceForm ref="GrantMobileResourceForm" @successful="table.refresh(true)" />
<grantPermissionForm ref="GrantPermissionForm" @successful="table.refresh(true)" /> <grantPermissionForm ref="GrantPermissionForm" @successful="table.refresh(true)" />
<Form ref="form" @successful="table.refresh(true)" /> <Form ref="form" @successful="table.refresh(true)" />
<user-selector-plus <user-selector-plus
@ -108,6 +112,7 @@
import roleApi from '@/api/sys/roleApi' import roleApi from '@/api/sys/roleApi'
import orgApi from '@/api/sys/orgApi' import orgApi from '@/api/sys/orgApi'
import grantResourceForm from './grantResourceForm.vue' import grantResourceForm from './grantResourceForm.vue'
import grantMobileResourceForm from './grantMobileResourceForm.vue'
import grantPermissionForm from './grantPermissionForm.vue' import grantPermissionForm from './grantPermissionForm.vue'
import userSelectorPlus from '@/components/Selector/userSelectorPlus.vue' import userSelectorPlus from '@/components/Selector/userSelectorPlus.vue'
import Form from './form.vue' import Form from './form.vue'
@ -153,6 +158,7 @@
const table = ref() const table = ref()
const form = ref() const form = ref()
const GrantResourceForm = ref() const GrantResourceForm = ref()
const GrantMobileResourceForm = ref()
const GrantPermissionForm = ref() const GrantPermissionForm = ref()
const userselectorPlusRef = ref() const userselectorPlusRef = ref()
const searchFormRef = ref() const searchFormRef = ref()