345 lines
12 KiB
C#
345 lines
12 KiB
C#
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, "提示");
|
||
}
|
||
}
|
||
}
|
||
}
|