vue3.2/Vite/Ts81: 分配角色的静态搭建以及业务处理
·
Yin灏
目录结构
└─src
├─api
│ └─acl
│ └─user
│ ├─index.ts
│ └─type.ts
└─views
└─acl
└─user
└─index.vue
分配角色按钮点击事件
src/views/acl/user/index.vue
<template>
<!-- ... -->
<el-card>
<!-- ... -->
<el-table border :data="userArr">
<!-- ... -->
<el-table-column label="操作" width="300px" align="center">
<template #="{row}">
<el-button
type="primary"
size="small"
icon="User"
@click="setRole(row)"
>分配角色</el-button
>
<!-- ... -->
</template>
</el-table-column>
</el-table>
<!-- ... -->
</el-card>
<!-- ... -->
<!-- 分配角色抽屉结构 -->
<el-drawer v-model="drawer1">
<template #header>
<h4>分配角色(职位)</h4>
</template>
<template #default>
<el-form>
<el-form-item label="用户姓名">
<el-input v-model="userParams.username" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="角色列表">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
@change="handleCheckAllChange "
>全选</el-checkbox
>
<el-checkbox-group v-model="userRole" @change="handleChecked">
<el-checkbox
v-for="(role, index) in allRole"
:key="index"
:label="role"
>{{ role.roleName }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
</el-form>
</template>
<template #footer>
<el-button type="primary" @click="drawer1 = false">取消</el-button>
<el-button type="primary" @click="confirmClick()">确定</el-button>
</template>
</el-drawer>
</template>
<script setup lang="ts">
import { ref, reactive } from "vue";
import type {
User,
AllRoleResponseData,
AllRole,
SetRoleData,
} from "@/api/acl/user/type";
import { reqAllRole, reqSetUserRole } from "@/api/acl/user";
//...
let userParams = reactive<User>({
username: "",
name: "",
password: "",
});
//...
let drawer1 = ref<boolean>(false);
let allRole = ref<AllRole>([]);
let userRole = ref<AllRole>([]);
let setRole = async (row: User) => {
drawer1.value = true;
Object.assign(userParams, row);
const result: AllRoleResponseData = await reqAllRole(
userParams.id as number
);
if (result.code === 200) {
// 存储全部职位
allRole.value = result.data.allRolesList;
// 存储当前用户已有职位
userRole.value = result.data.assignRoles;
drawer1.value = true;
}
};
let checkAll = ref<boolean>(false);
let isIndeterminate = ref<boolean>(false);
let handleCheckAllChange = (val: boolean) => {
userRole.value = val ? allRole.value : [];
isIndeterminate.value = false;
};
let handleChecked = (value: string[]) => {
let checkedCount = value.length;
checkAll.value = checkedCount === allRole.value.length;
isIndeterminate.value =
checkedCount > 0 && checkedCount < allRole.value.length;
};
let confirmClick = async () => {
let data: SetRoleData = {
userId: userParams.id as number,
roleIdList: userRole.value.map((item) => {
return item.id as number;
}),
};
const result: any = await reqSetUserRole(data);
if (result.code === 200) {
ElMessage({
type: "success",
message: "分配成功",
});
drawer1.value = false;
getHasUser(pageNo.value); // 留在当前页
} else {
ElMessage({
type: "error",
message: "分配失败",
});
}
};
</script>
分配角色接口处理
src/api/acl/user/index.ts
//...
import type { AllRoleResponseData, SetRoleData } from "./type";
enum API {
//...
ALLROLEURL = "/admin/acl/user/toAssign",
SETROLE_URL = "/admin/acl/user/doAssignDole",
}
export const reqAllRole = (userId: number) =>
request.get<any, AllRoleResponseData>(API.ALLROLEURL + userId);
export const reqSetUserRole = (data: SetRoleData) =>
request.post<any, any>(API.SETROLE_URL, data);
处理接口 TS 类型
src/api/acl/user/type.ts
export interface RoleData {
id?: number;
createTime?: string;
updateTime?: string;
roleName: string;
remark: null;
}
export type AllRole = RoleData[];
export interface AllRoleResponseData extends ResponseData {
data: {
assignRoles: AllRole;
allRolesList: AllRole;
};
}
export interface SetRoleData {
roleIdList: number[];
userId: number;
}