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.
171 lines
4.8 KiB
171 lines
4.8 KiB
<template>
|
|
<a-layout class="full-height">
|
|
<a-layout-header style="height: 48px; background: white; line-height: 48px; text-align: center">
|
|
<h3>{{ t('system.views.role.title.setFunction') }}</h3>
|
|
</a-layout-header>
|
|
<Divider style="margin: 0" />
|
|
<a-layout-content style="overflow: auto; background: white">
|
|
<Spin :spinning="dataLoading">
|
|
<BasicTree
|
|
ref="treeRef"
|
|
:treeData="functionTreeData"
|
|
v-model:checkedKeys="checkedKeysModel"
|
|
checkable
|
|
/>
|
|
</Spin>
|
|
</a-layout-content>
|
|
<Divider style="margin: 0" />
|
|
<a-layout-footer style="height: 50px; padding: 10px 0; background: white; text-align: center">
|
|
<div style="padding: 0 5px">
|
|
<a-button
|
|
v-permission="permissions.setFunction"
|
|
:loading="saveLoading"
|
|
block
|
|
type="primary"
|
|
@click="handleSave"
|
|
>
|
|
{{ $t('common.button.save') }}
|
|
</a-button>
|
|
</div>
|
|
</a-layout-footer>
|
|
</a-layout>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { useI18n } from '@/hooks/web/useI18n';
|
|
import { Divider, Spin } from 'ant-design-vue';
|
|
import { onMounted, ref, unref, watch } from 'vue';
|
|
import { ApiServiceEnum, defHttp } from '@/utils/http/axios';
|
|
import TreeUtils from '@/utils/TreeUtils';
|
|
import { SystemPermissions } from '@/modules/smart-system/constants/SystemConstants';
|
|
import { errorMessage, successMessage } from '@/utils/message/SystemNotice';
|
|
import { propTypes } from '@/utils/propTypes';
|
|
import { BasicTree } from '@/components/Tree';
|
|
|
|
const props = defineProps({
|
|
roleId: propTypes.number,
|
|
});
|
|
|
|
const treeRef = ref();
|
|
const { t } = useI18n();
|
|
|
|
// 树形控件数据
|
|
const functionTreeData = ref<Array<any>>([]);
|
|
const dataLoading = ref(false);
|
|
const saveLoading = ref(false);
|
|
const checkedKeysModel = ref([]);
|
|
const permissions = SystemPermissions.role;
|
|
|
|
onMounted(() => loadFunctionTreeData());
|
|
watch(
|
|
() => props.roleId,
|
|
() => loadRoleFunctions(),
|
|
);
|
|
|
|
/**
|
|
* 加载功能树函数
|
|
*/
|
|
const loadFunctionTreeData = async () => {
|
|
dataLoading.value = true;
|
|
try {
|
|
const result = await defHttp.post({
|
|
service: ApiServiceEnum.SMART_SYSTEM,
|
|
url: 'sys/function/list',
|
|
data: {
|
|
sortName: 'seq',
|
|
},
|
|
});
|
|
functionTreeData.value =
|
|
TreeUtils.convertList2Tree(
|
|
result.map(({ functionId, functionName, parentId }: any) => {
|
|
return {
|
|
key: functionId,
|
|
title: functionName,
|
|
parentId: parentId,
|
|
};
|
|
}),
|
|
(item) => item.key,
|
|
(item) => item.parentId,
|
|
0,
|
|
) || [];
|
|
} finally {
|
|
dataLoading.value = false;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 加载角色对应的功能ID
|
|
*/
|
|
const loadRoleFunctions = async () => {
|
|
if (props.roleId !== null) {
|
|
dataLoading.value = true;
|
|
try {
|
|
checkedKeysModel.value = await defHttp.post({
|
|
service: ApiServiceEnum.SMART_SYSTEM,
|
|
url: 'sys/role/listFunctionId',
|
|
params: {
|
|
id: props.roleId,
|
|
},
|
|
});
|
|
} finally {
|
|
dataLoading.value = false;
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 执行保存操作
|
|
*/
|
|
const handleSave = async () => {
|
|
const tree = unref(treeRef);
|
|
if (props.roleId === null) {
|
|
errorMessage('请先选定角色');
|
|
return false;
|
|
}
|
|
// const treeDataList = getTreeDataList();
|
|
// const treeDataMap = new Map<number, any>();
|
|
// treeDataList.forEach((item) => {
|
|
// treeDataMap.set(item.key, item);
|
|
// });
|
|
// const checkedKeys = tree.getCheckedKeys().filter((item) => {
|
|
// if (!treeDataMap.has(item)) {
|
|
// return false;
|
|
// }
|
|
// const treeData = treeDataMap.get(item);
|
|
// return treeData.hasChild !== true;
|
|
// });
|
|
saveLoading.value = true;
|
|
try {
|
|
await defHttp.post({
|
|
service: ApiServiceEnum.SMART_SYSTEM,
|
|
url: 'sys/role/saveRoleMenu',
|
|
data: {
|
|
roleId: props.roleId,
|
|
functionIdList: tree.getAntInstance().checkedKeys,
|
|
halfFunctionIdList: tree.getAntInstance().halfCheckedKeys,
|
|
},
|
|
});
|
|
successMessage('保存成功');
|
|
} finally {
|
|
saveLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// const getTreeDataList = () => {
|
|
// const treeData = unref(treeRef).getTreeData();
|
|
// const treeDataList: any[] = [];
|
|
// doGetTreeDataList(treeDataList, treeData);
|
|
// return treeDataList;
|
|
// };
|
|
//
|
|
// const doGetTreeDataList = (treeDataList: any[], treeData: any[]) => {
|
|
// treeData.forEach((item) => {
|
|
// treeDataList.push(item);
|
|
// if (item.children && item.children.length > 0) {
|
|
// doGetTreeDataList(treeDataList, item.children);
|
|
// }
|
|
// });
|
|
// };
|
|
</script>
|
|
|
|
<style scoped lang="less"></style>
|
|
|