usePage增加许多配置项,另外增加一些回调函数、插槽等等,修改逻辑增强配置灵活性
zk authored at 2023-11-21 17:42:23
2.95 KiB
NewLife.QuickVue
<template>
	<Page>
		<template #permission>
			<el-checkbox-group v-model="permission" class="w-full">
				<el-table :data="menus" style="width: 100%; margin-bottom: 20px" row-key="id" size="small" border default-expand-all>
					<el-table-column prop="name" label="标识" width="150" />
					<el-table-column prop="displayName" label="菜单名" width="150" />
					<el-table-column label="全部授权" width="70" align="center">
						<template #default="scope">
							<el-checkbox
								@change="(val: boolean) => changeCheckboxAll(scope.row, val)"
								:label="`${scope.row.id}#255`"
								:load="loadCheckbox(scope.row)"
								><span></span
							></el-checkbox>
						</template>
					</el-table-column>
					<el-table-column label="权限">
						<template #default="scope">
							<el-checkbox :label="`${scope.row.id}#${index}`" v-for="(item, index) in scope.row.permissions" :key="index">{{ item }}</el-checkbox>
						</template>
					</el-table-column>
				</el-table>
			</el-checkbox-group>
		</template>
	</Page>
</template>

<script setup lang="ts">
import { computed, ref } from 'vue';
import { useMenuApi } from '/@/api/menu';
import { ColumnKind } from '/@/api/page';
import usePage from '/@/hook/usePage';

const { infoForm } = usePage({
	columns: [
		{
			in: ColumnKind.ADD,
			prop: 'sort',
			component: 'select',
			label: '33333',
			props: {
				options: [{ id: 1, name: '1111' }],
			},
		},
		{
			prop: 'permission',
			slot: 'permission',
			in: [ColumnKind.EDIT, ColumnKind.ADD],
		},
	],
});

const loadCheckbox = (row: EmptyObjectType) => {
	if (!row.permissionsArr) {
		row.permissionsArr = Object.keys(row.permissions).map((key) => `${row.id}#${key}`);
	}
};

const permission = computed({
	get() {
		let value = infoForm.value.permission ? infoForm.value.permission.split(',') : [];
		let menuStr = JSON.stringify(menus.value);
		value.forEach((val: string) => {
			let auth = val.split('#');
			if (Number(auth[1]) === 255) {
				let arr = menuStr.match(new RegExp(auth[0] + '#[0-9][0-9]*', 'g'));
				value = Array.from(new Set(value.concat(arr)));
			}
		});
		return value;
	},
	set(val) {
		infoForm.value.permission = val.toString();
	},
});

const menus = ref<EmptyObjectType[]>([]);
useMenuApi()
	.getMenu({ pageSize: 0 })
	.then((res) => {
		menus.value = res.data;
	});

const changeCheckboxAll = (row: EmptyObjectType, val: boolean) => {
	if (val) {
		permission.value = Array.from(new Set(permission.value.concat(row.permissionsArr)));
		if (row.children) {
			row.children.forEach((child: EmptyObjectType) => {
				permission.value = Array.from(new Set(permission.value.concat([child.id + '#255'])));
				changeCheckboxAll(child, true);
			});
		}
	} else {
		permission.value = permission.value.filter((val: string) => val.indexOf(row.id + '#') !== 0);
		if (row.children) {
			permission.value = permission.value.filter((val: string) =>
				row.children.every((item: EmptyObjectType) => item.id !== Number(val.split('#')[0]))
			);
		}
	}
};
</script>