角色管理接口对接

This commit is contained in:
雷校云
2025-12-09 21:43:31 +08:00
parent b576a787aa
commit 29d7fb412c
5 changed files with 116 additions and 90 deletions

View File

@@ -30,9 +30,9 @@ export const UserAddDepartment = (name: string) => {
};
// 删除部门
export const UserDeleteDepartment = (name: string) => {
export const UserDeleteDepartment = (id: string) => {
const formData = new FormData();
formData.append("name", name);
formData.append("id", id);
return request({
url: `${AUTH_BASE_URL}/user/delete_department`,
method: "post",
@@ -43,10 +43,11 @@ export const UserDeleteDepartment = (name: string) => {
});
};
// 公司部门人员名单
export const UserPersonlist = (name: string) => {
// 部门分页
export const UserPersonlist = (data: any) => {
const formData = new FormData();
formData.append("name", name);
formData.append("per_page", data.pageSize);
formData.append("page", data.pageNum);
return request({
url: `${AUTH_BASE_URL}/user/personlist`,
method: "post",

View File

@@ -1,3 +1,4 @@
import { isFile, isString } from "@/utils/auxiliaryFunction";
import request from "@/utils/request";
const AUTH_BASE_URL = "/api2";
@@ -64,10 +65,11 @@ export const UserEditorialStaff = (data: any) => {
formData.append("Dateofjoining", data.Dateofjoining);
formData.append("Confirmationtime", data.Confirmationtime);
formData.append("Practicingcertificatetime", data.Practicingcertificatetime);
formData.append("AcademicResume", data.AcademicResume);
formData.append("academic", JSON.stringify(data.academic));
formData.append("contract", data.contract);
formData.append("ApplicationForm", data.ApplicationForm);
console.log(data.AcademicResume, data.contract, data.ApplicationForm);
if (isFile(data.AcademicResume)) formData.append("AcademicResume", data.AcademicResume);
if (isFile(data.contract)) formData.append("contract", data.contract);
if (isFile(data.ApplicationForm)) formData.append("ApplicationForm", data.ApplicationForm);
return request({
url: `${AUTH_BASE_URL}/user/editorial-staff`,
method: "post",

View File

@@ -127,8 +127,7 @@ export function convertFilePathsToObject(filePaths: string | string[]): Array<{
// 分割文件名和UUID
const lastUnderscoreIndex = filePart.lastIndexOf("_");
const name =
lastUnderscoreIndex > 0 ? filePart.substring(0, lastUnderscoreIndex) : filePart;
const name = lastUnderscoreIndex > 0 ? filePart.substring(0, lastUnderscoreIndex) : filePart;
const uuid = lastUnderscoreIndex > 0 ? filePart.substring(lastUnderscoreIndex + 1) : "";
return {
@@ -139,3 +138,10 @@ export function convertFilePathsToObject(filePaths: string | string[]): Array<{
};
});
}
export function isString(value: any): boolean {
return typeof value === "string";
}
export function isFile(obj: any): obj is File {
return obj instanceof File;
}

View File

@@ -42,18 +42,8 @@
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="角色名称" prop="name" min-width="100" />
<el-table-column label="角色编码" prop="code" width="150" />
<el-table-column label="状态" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.status === 1" type="success">正常</el-tag>
<el-tag v-else type="info">禁用</el-tag>
</template>
</el-table-column>
<el-table-column label="排序" align="center" width="80" prop="sort" />
<el-table-column label="部门名称" prop="department" />
<el-table-column label="在职情况" prop="state" />
<el-table-column fixed="right" label="操作" width="220">
<template #default="scope">
<el-button
@@ -70,7 +60,7 @@
size="small"
link
icon="delete"
@click="handleDelete(scope.row.id)"
@click="onUserDeleteDepartment(scope.row.id)"
>
删除
</el-button>
@@ -95,19 +85,8 @@
@close="handleCloseDialog"
>
<el-form ref="roleFormRef" :model="formData" :rules="rules" label-width="100px">
<el-form-item label="角色名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item label="角色编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入角色编码" disabled />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input-number
v-model="formData.sort"
controls-position="right"
:min="0"
style="width: 100px"
/>
<el-form-item label="部门名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入部门名称" />
</el-form-item>
</el-form>
@@ -186,8 +165,12 @@
import { useAppStore } from "@/store/modules/app-store";
import { DeviceEnum } from "@/enums/settings/device-enum";
import RoleAPI, { RolePageVO, RoleForm, RolePageQuery } from "@/api/system/role-api";
import MenuAPI from "@/api/system/menu-api";
import RoleAPI, { RolePageVO } from "@/api/system/role-api";
import {
UserAddDepartment,
UserDeleteDepartment,
UserPersonlist,
} from "@/api/calibration/department";
defineOptions({
name: "Role",
@@ -204,7 +187,7 @@ const loading = ref(false);
const ids = ref<number[]>([]);
const total = ref(0);
const queryParams = reactive<RolePageQuery>({
const queryParams = reactive<any>({
pageNum: 1,
pageSize: 10,
});
@@ -223,16 +206,12 @@ const dialog = reactive({
const drawerSize = computed(() => (appStore.device === DeviceEnum.DESKTOP ? "600px" : "90%"));
// 角色表单
const formData = reactive<RoleForm>({
sort: 1,
status: 1,
const formData = reactive<any>({
name: "",
});
const rules = reactive({
name: [{ required: true, message: "请输入角色名称", trigger: "blur" }],
code: [{ required: true, message: "请输入角色编码", trigger: "blur" }],
dataScope: [{ required: true, message: "请选择数据权限", trigger: "blur" }],
status: [{ required: true, message: "请选择状态", trigger: "blur" }],
name: [{ required: true, message: "请输入部门名称", trigger: "blur" }],
});
// 选中的角色
@@ -251,10 +230,10 @@ const parentChildLinked = ref(true);
// 获取数据
function fetchData() {
loading.value = true;
RoleAPI.getPage(queryParams)
.then((data) => {
roleList.value = data.list;
total.value = data.total;
UserPersonlist(queryParams)
.then((res: any) => {
roleList.value = res.data;
total.value = res.total;
})
.finally(() => {
loading.value = false;
@@ -307,7 +286,7 @@ function handleSubmit() {
})
.finally(() => (loading.value = false));
} else {
RoleAPI.create(formData)
UserAddDepartment(formData.name)
.then(() => {
ElMessage.success("新增成功");
handleCloseDialog();
@@ -331,6 +310,26 @@ function handleCloseDialog() {
formData.status = 1;
}
const onUserDeleteDepartment = (id: string) => {
ElMessageBox.confirm("确认删除已选中的数据项?", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(
() => {
loading.value = true;
UserDeleteDepartment(id)
.then(() => {
ElMessage.success("删除成功");
handleResetQuery();
})
.finally(() => (loading.value = false));
},
() => {
ElMessage.info("已取消删除");
}
);
};
// 删除角色
function handleDelete(roleId?: number) {
const roleIds = [roleId || ids.value].join(",");
@@ -360,29 +359,29 @@ function handleDelete(roleId?: number) {
}
// 打开分配菜单权限弹窗
async function handleOpenAssignPermDialog(row: RolePageVO) {
const roleId = row.id;
if (roleId) {
assignPermDialogVisible.value = true;
loading.value = true;
checkedRole.value.id = roleId;
checkedRole.value.name = row.name;
// 获取所有的菜单
menuPermOptions.value = await MenuAPI.getOptions();
// 回显角色已拥有的菜单
RoleAPI.getRoleMenuIds(roleId)
.then((data) => {
const checkedMenuIds = data;
checkedMenuIds.forEach((menuId) => permTreeRef.value!.setChecked(menuId, true, false));
})
.finally(() => {
loading.value = false;
});
}
}
// async function handleOpenAssignPermDialog(row: RolePageVO) {
// const roleId = row.id;
// if (roleId) {
// assignPermDialogVisible.value = true;
// loading.value = true;
//
// checkedRole.value.id = roleId;
// checkedRole.value.name = row.name;
//
// // 获取所有的菜单
// menuPermOptions.value = await MenuAPI.getOptions();
//
// // 回显角色已拥有的菜单
// RoleAPI.getRoleMenuIds(roleId)
// .then((data) => {
// const checkedMenuIds = data;
// checkedMenuIds.forEach((menuId) => permTreeRef.value!.setChecked(menuId, true, false));
// })
// .finally(() => {
// loading.value = false;
// });
// }
// }
// 分配菜单权限提交
function handleAssignPermSubmit() {

View File

@@ -396,7 +396,7 @@ import {
UserEditorialStaff,
UserPersonnelList,
} from "@/api/calibration/personnelManagement";
import { formatJsonString, convertFilePathsToObject } from "@/utils/auxiliaryFunction";
import { convertFilePathsToObject } from "@/utils/auxiliaryFunction";
// ==================== 组件配置 ====================
defineOptions({
@@ -670,13 +670,13 @@ async function handleOpenDialog(data?: any): Promise<void> {
if (data?.id) {
dialog.title = "修改用户";
try {
data.academic = parseJsonToArray(data.academic);
const data1 = deepCloneByJSON(data);
data1.academic = parseJsonToArray(data1.academic);
data.AcademicResume = convertFilePathsToObject(JSON.parse(data.AcademicResume))[0];
data.contract = convertFilePathsToObject(JSON.parse(data.contract))[0];
data.ApplicationForm = convertFilePathsToObject(JSON.parse(data.ApplicationForm))[0];
console.log(data);
Object.assign(formData, data);
data1.AcademicResume = convertFilePathsToObject(JSON.parse(data1.AcademicResume))[0];
data1.contract = convertFilePathsToObject(JSON.parse(data1.contract))[0];
data1.ApplicationForm = convertFilePathsToObject(JSON.parse(data1.ApplicationForm))[0];
Object.assign(formData, data1);
} catch (error) {
ElMessage.error("加载用户数据失败");
console.error("加载用户数据失败:", error);
@@ -687,16 +687,34 @@ async function handleOpenDialog(data?: any): Promise<void> {
}
}
// 将 JSON 字符串转换为数组对象
function parseJsonToArray(jsonString: string): any[] {
function deepCloneByJSON(obj: any) {
try {
const result = JSON.parse(jsonString);
return Array.isArray(result) ? result : [];
return JSON.parse(JSON.stringify(obj));
} catch (error) {
console.error("JSON解析失败:", error);
return [];
console.error("深拷贝失败:", error);
return obj;
}
}
// 将 JSON 字符串转换为数组对象
function parseJsonToArray(jsonString: any) {
// 检查是否已经是对象
if (typeof jsonString === "object" && jsonString !== null) {
return Array.isArray(jsonString) ? jsonString : [jsonString];
}
// 检查是否为字符串
if (typeof jsonString === "string") {
try {
const parsed = JSON.parse(jsonString);
return Array.isArray(parsed) ? parsed : [parsed];
} catch (e) {
console.error("JSON解析失败:", e);
return [];
}
}
return [];
}
/**
* 关闭用户表单弹窗
@@ -850,9 +868,9 @@ function removeFile(field: string): void {
/**
* 打开导入弹窗
*/
function handleOpenImportDialog(): void {
importDialogVisible.value = true;
}
// function handleOpenImportDialog(): void {
// importDialogVisible.value = true;
// }
/**
* 导出用户列表