20230201_145_upperpc/InSituLaboratory/ViewModels/Pages/RoleViewModel.cs
2024-03-11 13:12:02 +08:00

345 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using InSituLaboratory.Base;
using InSituLaboratory.Entities;
using InSituLaboratory.IService;
using InSituLaboratory.Models;
using Prism.Commands;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace InSituLaboratory.ViewModels.Pages
{
public class RoleViewModel : ViewModelBase
{
public ObservableCollection<RoleModel> RoleList { get; set; } =
new ObservableCollection<RoleModel>();
public ObservableCollection<MenuItemModel> Menus { get; set; } =
new ObservableCollection<MenuItemModel>();
public ObservableCollection<UserModel> Users { get; set; } =
new ObservableCollection<UserModel>();
/// <summary>
/// 菜单勾选功能
/// </summary>
public DelegateCommand<MenuItemModel> SelectMenuCommand { get; set; }
/// <summary>
/// 分配权限用户
/// </summary>
public DelegateCommand SelectUserCommand { get; set; }
/// <summary>
/// 删除用户
/// </summary>
public DelegateCommand<UserModel> DeleteUserCommand { get; set; }
private RoleModel _currentRole;
public RoleModel CurrentRole
{
get { return _currentRole; }
set
{
SetProperty<RoleModel>(ref _currentRole, value, () =>
{
// 当属性值发生变化的时候
// value.MenuIds
if (value == null) return;
SetMenuStatus(Menus, value.MenuIds);
//// value.UserIds
LoadUsers(value.UserIds);
});
}
}
IRoleService _roleService;
IMenuService _menuService;
IDialogService _dialogService;
IUserService _userService;
public RoleViewModel(
IRegionManager regionManager,
IRoleService roleService,
IMenuService menuService,
IDialogService dialogService,
IUserService userService)
: base(regionManager)
{
this.PageTitle = "角色权限组";
_roleService = roleService;
_menuService = menuService;
_dialogService = dialogService;
_userService = userService;
SelectMenuCommand = new DelegateCommand<MenuItemModel>(DoSelectMenu);
SelectUserCommand = new DelegateCommand(DoSelcetUser);
DeleteUserCommand = new DelegateCommand<UserModel>(DoDeleteUser);
Refresh();
}
/// <summary>
/// 刷新
/// </summary>
public override void Refresh()
{
RoleList.Clear();
Menus.Clear();
var rs = _roleService.GetRoles(SearchKey);
foreach (var role in rs)
{
RoleList.Add(new RoleModel
{
RoleId = role.RoleId,
RoleName = role.RoleName,
RoleDesc = role.RoleDesc,
MenuIds = role.Menus.Select(m => m.MenuId).ToList(),
UserIds = role.Users.Select(u => u.UserId).ToList()
});
}
//加载供选择的所有菜单
var ms = _menuService.GetMenuList().ToList();
MenuHelper.FillMenus(Menus, null, ms);
CurrentRole = RoleList.Count > 0 ?
(_rid == 0 ? RoleList[0] : RoleList.FirstOrDefault(r => r.RoleId == _rid)) :
null;
}
/// <summary>
/// 编辑或者新增
/// </summary>
/// <param name="model"></param>
public override void DoModify(object model)
{
DialogParameters ps = new DialogParameters();
ps.Add("model", model);
_dialogService.ShowDialog("ModifyRoleView", ps, result =>
{
// 判断子窗口的返回状态如果OK刷新当前页面否则不管
if (result.Result == ButtonResult.OK)
{
this.Refresh();
}
});
}
/// <summary>
/// 删除
/// </summary>
/// <param name="model"></param>
public override void DoDelete(object model)
{
try
{
if (MessageBox.Show("是否确定删除此项?", "提示", MessageBoxButton.YesNo) ==
MessageBoxResult.Yes)
{
// 物理删除
_roleService.Delete<SysRole>((model as RoleModel).RoleId);
MessageBox.Show("删除完成!", "提示");
RoleList.Remove(model as RoleModel);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
/// <summary>
/// 根据用户角色初始化菜单选项
/// </summary>
/// <param name="menus"></param>
/// <param name="mids"></param>
private void SetMenuStatus(ObservableCollection<MenuItemModel> menus, List<int> mids)
{
foreach (var item in menus)
{
item.IsSelected = mids.Contains(item.MenuId);
if (item.Children != null && item.Children.Count > 0)
{
SetMenuStatus(item.Children, mids);
}
}
}
/// <summary>
/// 设置菜单勾选功能
/// </summary>
/// <param name="model"></param>
private void DoSelectMenu(MenuItemModel model)
{
try
{
// model.IsSelected 两种状态 选中 非选中
// 选中需要在RoleMenu表中添加一条记录 角色ID 菜单ID
// 非选中需要从RoleMenu中删除一条记录 角色ID 菜单ID
var role = _roleService.Find<SysRole>(CurrentRole.RoleId);
if (role == null) return;
if (model.IsSelected)
{
role.Menus.Add(new RoleMenu
{
RoleId = CurrentRole.RoleId,
MenuId = model.MenuId,
SysRole = role
});
CurrentRole.MenuIds.Add(model.MenuId);
// 判断所有子节点---多层级菜单
// 父节点被选中的时候,把所有子节点都选中,并且存入数据库
if (model.Children != null && model.Children.Count > 0)
{
foreach (var item in model.Children)
{
item.IsSelected = true;
role.Menus.Add(new RoleMenu
{
RoleId = CurrentRole.RoleId,
MenuId = item.MenuId,
SysRole = role
});
CurrentRole.MenuIds.Add(item.MenuId);
}
}
//如果是子节点选中的时候,判断父节点是否被选中,如果未被选中,则选中它
if (model.Parent != null && !model.Parent.IsSelected)
{
model.Parent.IsSelected = true;
role.Menus.Add(new RoleMenu
{
RoleId = CurrentRole.RoleId,
MenuId = model.Parent.MenuId,
SysRole = role
});
CurrentRole.MenuIds.Add(model.Parent.MenuId);
}
}
else
{
role.Menus.RemoveAll(m => m.MenuId == model.MenuId);
CurrentRole.MenuIds.RemoveAll(mid => mid == model.MenuId);
// 父节点被勾选掉的时候,把所有子节点都去掉,并且存入数据库
if (model.Children != null && model.Children.Count > 0)
{
var mids = model.Children.Select(m =>
{
m.IsSelected = false;
return m.MenuId;
}).ToList();
role.Menus.RemoveAll(m => mids.Contains(m.MenuId));
CurrentRole.MenuIds.RemoveAll(m => mids.Contains(m));
}
// 如果勾选掉子节点,判断父节点所有的子节点,如果所有子节点都未选中,那么将这个父节点的选中状态去掉
if (model.Parent != null &&
!model.Parent.Children.ToList().Exists(m => m.IsSelected))
{
model.Parent.IsSelected = false;
role.Menus.RemoveAll(m => m.MenuId == model.Parent.MenuId);
CurrentRole.MenuIds.RemoveAll(m => m == model.Parent.MenuId);
}
}
_roleService.Update(role);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
/// <summary>
/// 根据用户角色初始化用户选项
/// </summary>
/// <param name="uids"></param>
private void LoadUsers(List<int> uids)
{
Users.Clear();
var us = _userService.Query<SysUser>(u => uids.Contains(u.UserId)).ToList();
foreach (var u in us)
{
Users.Add(new UserModel
{
UserId = u.UserId,
UserName = u.UserName,
RealName = u.RealName,
UserIcon = "pack://siteoforigin:,,,/Avatars/" + u.UserIcon
});
}
}
int _rid = 0;
/// <summary>
/// 选择用户
/// </summary>
private void DoSelcetUser()
{
DialogParameters dps = new DialogParameters();
dps.Add("uids", CurrentRole.UserIds);
dps.Add("rid", CurrentRole.RoleId);
_rid = CurrentRole.RoleId;
_dialogService.ShowDialog("SelectUserView", dps, result =>
{
if (result.Result == ButtonResult.OK)
{
this.Refresh();
_rid = 0;
}
});
}
/// <summary>
/// 权限组删除用户
/// </summary>
/// <param name="model"></param>
private void DoDeleteUser(UserModel model)
{
try
{
if (MessageBox.Show("是否确定从当前角色权限组删除此用户?", "提示", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
// 物理删除
var role = _roleService.Find<SysRole>(CurrentRole.RoleId);
if (role == null) return;
role.Users.RemoveAll(u => u.UserId == model.UserId);
CurrentRole.UserIds.RemoveAll(uid => uid == model.UserId);
_roleService.Update(role);
MessageBox.Show("删除完成!", "提示");
Users.Remove(model);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示");
}
}
}
}