接口修正、成就修正、学习记录修正

This commit is contained in:
2025-11-03 17:12:40 +08:00
parent 35aee59178
commit b95fff224b
28 changed files with 730 additions and 302 deletions

View File

@@ -25,8 +25,22 @@
<el-table-column prop="phone" label="手机号" min-width="120" />
<el-table-column prop="realName" label="真实姓名" min-width="100" />
<el-table-column prop="nickname" label="昵称" min-width="100" />
<el-table-column prop="deptName" label="部门" min-width="120" />
<el-table-column prop="roleName" label="角色" min-width="120" />
<el-table-column label="部门-角色" min-width="200">
<template #default="{ row }">
<div class="tag-container">
<el-tag
v-for="(combo, index) in row.deptRoleCombos"
:key="index"
type="primary"
size="small"
style="margin: 2px"
>
{{ combo }}
</el-tag>
<span v-if="!row.deptRoleCombos || row.deptRoleCombos.length === 0" style="color: #909399;">未分配</span>
</div>
</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="80">
<template #default="{ row }">
<el-tag :type="row.status === 0 ? 'success' : 'danger'">
@@ -340,13 +354,51 @@ onMounted(() => {
loadUsers();
});
// 合并同一用户的多个部门角色(部门-角色是绑定关系)
function mergeUserDeptRoles(users: UserVO[]): UserVO[] {
const userMap = new Map<string, UserVO>();
users.forEach(user => {
const userId = user.id || user.userID;
if (!userId) return;
// 生成部门-角色组合字符串
const deptRoleCombo = (user.deptName && user.roleName)
? `${user.deptName}-${user.roleName}`
: '';
if (!userMap.has(userId)) {
// 首次遇到该用户,初始化
userMap.set(userId, {
...user,
deptRoleCombos: deptRoleCombo ? [deptRoleCombo] : []
});
} else {
// 已存在该用户,合并部门-角色组合
const existingUser = userMap.get(userId)!;
// 添加部门-角色组合(去重)
if (deptRoleCombo && !existingUser.deptRoleCombos?.includes(deptRoleCombo)) {
existingUser.deptRoleCombos = [...(existingUser.deptRoleCombos || []), deptRoleCombo];
}
}
});
return Array.from(userMap.values());
}
async function loadUsers() {
try {
loading.value = true;
const result = await userApi.getUserPage(pageParam.value);
if (result.success) {
userList.value = result.dataList || [];
total.value = result.pageParam?.totalElements || 0;
const rawUsers = result.dataList || [];
// 合并同一用户的多个部门角色
userList.value = mergeUserDeptRoles(rawUsers);
// 注意由于合并了数据total应该是去重后的用户数量
// 但是后端返回的total是原始记录数这里需要调整
// 如果后端无法修改我们需要重新计算total
total.value = userList.value.length;
}
} catch (error) {
console.error('加载用户列表失败:', error);
@@ -413,8 +465,14 @@ async function handleDeptRoleConfirm(items: any[]) {
return;
}
// 【限制】检查是否只选择了一个部门-角色
if (items.length === 0) {
ElMessage.warning('请至少选择一个部门角色');
ElMessage.warning('请选择一个部门角色');
return;
}
if (items.length > 1) {
ElMessage.error('一个用户只能绑定一个部门-角色,请选择且仅选择一个');
return;
}
@@ -437,7 +495,8 @@ async function handleDeptRoleConfirm(items: any[]) {
const result = await userApi.bindUserDeptRole(userDeptRoleVO);
if (result.success) {
ElMessage.success(`成功绑定 ${items.length}部门角色`);
ElMessage.success('成功绑定部门角色');
showDeptRoleSelector.value = false;
loadUsers();
} else {
ElMessage.error(result.message || '绑定失败');
@@ -549,4 +608,11 @@ function handleSizeChange(size: number) {
justify-content: flex-end;
margin-top: 24px;
}
.tag-container {
display: flex;
flex-wrap: wrap;
gap: 4px;
align-items: center;
}
</style>