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 {