diff --git a/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOutput.cs b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOutput.cs index d52373f5..37e5dd80 100644 --- a/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOutput.cs +++ b/Admin.NET/Admin.NET.Core/Service/Role/Dto/RoleOutput.cs @@ -25,6 +25,11 @@ public class RoleOutput /// 编码 /// public string Code { get; set; } + + /// + /// 是否禁用 + /// + public bool Disabled { get; set; } = true; } /// @@ -36,4 +41,19 @@ public class PageRoleOutput : SysRole /// 租户名称 /// public string TenantName { get; set; } +} + +/// +/// 角色已分配可分配输出参数 +/// +public class GrantRoleOutput +{ + /// + /// 以分配 + /// + public IEnumerable Granted { get; set; } + /// + /// 可分配 + /// + public IEnumerable Available { get; set; } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs index 71e2606e..390c09ab 100644 --- a/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs @@ -79,7 +79,7 @@ public class SysRoleService : IDynamicApiController, ITransient return await _sysRoleRep.AsQueryable() .WhereIF(!_userManager.SuperAdmin, u => u.TenantId == _userManager.TenantId) // 若非超管,则只能操作本租户的角色 .WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, u => u.CreateUserId == _userManager.UserId || roleIdList.Contains(u.Id)) // 若非超管且非系统管理员,则只显示自己创建和已拥有的角色 - .OrderBy(u => new { u.OrderNo, u.Id }).Select().ToListAsync(); + .OrderBy(u => new { u.OrderNo, u.Id }).Select(u => new RoleOutput { Disabled = false }, true).ToListAsync(); } /// diff --git a/Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs b/Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs index e58a207b..6e33c41b 100644 --- a/Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs +++ b/Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs @@ -83,6 +83,19 @@ public class SysUserRoleService : ITransient .Where(u => u.UserId == userId).Select(u => u.RoleId).ToListAsync(); } + /// + /// 根据用户Id获取角色集合 + /// + /// + /// + public async Task> GetUserRoleInfoList(long userId) + { + return await _sysUserRoleRep.AsQueryable().Includes(u => u.SysRole) + .Where(u => u.UserId == userId) + .Select(u => new RoleOutput { Id = u.RoleId, Code = u.SysRole.Code, Name = u.SysRole.Name }) + .ToListAsync(); + } + /// /// 根据角色Id获取用户Id集合 /// diff --git a/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs b/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs index bfde7e92..05aa79b2 100644 --- a/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs +++ b/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs @@ -15,6 +15,7 @@ public class SysUserService : IDynamicApiController, ITransient private readonly UserManager _userManager; private readonly SysOrgService _sysOrgService; private readonly SysUserExtOrgService _sysUserExtOrgService; + private readonly SysRoleService _sysRoleService; private readonly SysUserRoleService _sysUserRoleService; private readonly SysConfigService _sysConfigService; private readonly SysOnlineUserService _sysOnlineUserService; @@ -25,6 +26,7 @@ public class SysUserService : IDynamicApiController, ITransient public SysUserService(UserManager userManager, SysOrgService sysOrgService, SysUserExtOrgService sysUserExtOrgService, + SysRoleService sysRoleService, SysUserRoleService sysUserRoleService, SysConfigService sysConfigService, SysOnlineUserService sysOnlineUserService, @@ -35,6 +37,7 @@ public class SysUserService : IDynamicApiController, ITransient _userManager = userManager; _sysOrgService = sysOrgService; _sysUserExtOrgService = sysUserExtOrgService; + _sysRoleService = sysRoleService; _sysUserRoleService = sysUserRoleService; _sysConfigService = sysConfigService; _sysOnlineUserService = sysOnlineUserService; @@ -136,7 +139,7 @@ public class SysUserService : IDynamicApiController, ITransient // 若账号的角色和组织架构发生变化,则强制下线账号进行权限更新 var user = await _sysUserRep.AsQueryable().ClearFilter().FirstAsync(u => u.Id == input.Id); - var roleIds = await GetOwnRoleList(input.Id); + var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.Id); if (input.OrgId != user.OrgId || !input.RoleIdList.OrderBy(u => u).SequenceEqual(roleIds.OrderBy(u => u))) await _sysOnlineUserService.ForceOffline(input.Id); // 更新域账号 @@ -353,9 +356,17 @@ public class SysUserService : IDynamicApiController, ITransient /// /// [DisplayName("获取用户拥有角色集合")] - public async Task> GetOwnRoleList(long userId) + public async Task GetOwnRoleList(long userId) { - return await _sysUserRoleService.GetUserRoleIdList(userId); + // 获取当前分配用户的角色 + var granted = (await _sysUserRoleService.GetUserRoleInfoList(userId)); + // 获取当前用户的角色 + var available = await _sysRoleService.GetList(); + // 改变分配用户的角色可分配状态 + granted.ForEach(u => u.Disabled = !available.Any(e => e.Id == u.Id)); + // 排除已分配的角色 + available = available.ExceptBy(granted.Select(e => e.Id), e => e.Id).ToList(); + return new GrantRoleOutput { Granted = granted, Available = available }; } /// diff --git a/Web/src/components/transfer/index.vue b/Web/src/components/transfer/index.vue new file mode 100644 index 00000000..f858679e --- /dev/null +++ b/Web/src/components/transfer/index.vue @@ -0,0 +1,264 @@ + + + + + diff --git a/Web/src/views/system/user/component/editUser.vue b/Web/src/views/system/user/component/editUser.vue index b55bfc39..f2ef04a5 100644 --- a/Web/src/views/system/user/component/editUser.vue +++ b/Web/src/views/system/user/component/editUser.vue @@ -31,13 +31,6 @@ - - - - - - - @@ -130,6 +123,9 @@ + + + @@ -253,7 +249,9 @@ import { useUserInfo } from '/@/stores/userInfo'; import { getAPI } from '/@/utils/axios-utils'; import { SysPosApi, SysRoleApi, SysUserApi } from '/@/api-services/api'; -import { RoleOutput, SysOrg, PagePosOutput, UpdateUserInput } from '/@/api-services/models'; +import { SysOrg, PagePosOutput, UpdateUserInput } from '/@/api-services/models'; +import Transfer from '/@/components/transfer/index.vue'; +import { ElMessage } from 'element-plus'; const props = defineProps({ title: String, @@ -269,7 +267,8 @@ const state = reactive({ selectedTabName: '0', // 选中的 tab 页 ruleForm: {} as UpdateUserInput, posData: [] as Array, // 职位数据 - roleData: [] as Array, // 角色数据 + available: [], // 可授权角色 + granted: [], // 已授权角色 }); // 级联选择器配置选项 const cascaderProps = { checkStrictly: true, emitPath: false, value: 'id', label: 'name', expandTrigger: 'hover' }; @@ -279,8 +278,6 @@ onMounted(async () => { state.loading = true; const { data } = await getAPI(SysPosApi).apiSysPosListGet(); state.posData = data.result ?? []; - const { data: res } = await getAPI(SysRoleApi).apiSysRoleListGet(); - state.roleData = res.result ?? []; state.loading = false; }); @@ -291,11 +288,17 @@ const openDialog = async (row: any) => { state.selectedTabName = '0'; // 重置为第一个 tab 页 state.ruleForm = JSON.parse(JSON.stringify(row)); if (row.id != undefined) { - var resRole = await getAPI(SysUserApi).apiSysUserOwnRoleListUserIdGet(row.id); - state.ruleForm.roleIdList = resRole.data.result; + const { data } = await getAPI(SysUserApi).apiSysUserOwnRoleListUserIdGet(row.id); + state.available = data.result?.available; + state.granted = data.result?.granted; var resExtOrg = await getAPI(SysUserApi).apiSysUserOwnExtOrgListUserIdGet(row.id); state.ruleForm.extOrgIdList = resExtOrg.data.result; - } else state.ruleForm.accountType = 777; // 默认普通账号类型 + } else { + state.ruleForm.accountType = 777; // 默认普通账号类型 + const { data } = await getAPI(SysRoleApi).apiSysRoleListGet(); + state.available = data.result ?? []; + state.granted = []; + } state.isShowDialog = true; }; @@ -314,6 +317,11 @@ const cancel = () => { const submit = () => { ruleFormRef.value.validate(async (valid: boolean) => { if (!valid) return; + if (state.granted?.length > 0) state.ruleForm.roleIdList = state.granted.map((e) => e.id); + else { + ElMessage.error(`角色尚未分配`); + return; + } if (state.ruleForm.id != undefined && state.ruleForm.id > 0) { await getAPI(SysUserApi).apiSysUserUpdatePost(state.ruleForm); } else {