A modern vue admin. It is based on Vue3, vite and TypeScript. It's fast!
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

<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>