本文主要讲解如何实现系统中角色(权限)管理模块,可以实现添加角色并给角色配置操作菜单权限及修改角色,先来看看最终效果

整个页面由两部分构成,左侧部分是jquery easyui datagrid表格实现的系统内的角色管理列表,右侧是使用jquery easyui tree树形控件实现的一个菜单树。
左侧部分的实现这里不再讲解,具体实现方法可以参考《.Net Mvc中使用Jquery EasyUI控件讲解(一)表格控件datagrid使用介绍》,本文主要讲解右侧部分的实现及左右两边数据的联动。
本文源码及数据库下载地址:asp.net mvc+jquery easyui权限管理模块源码
刚进入本模块时只显示左侧角色列表,当点击选中其中一个角色时,刷新生成右侧权限菜单树,选择需要的菜单权限后点击右侧顶部的保存权限,提交数据库保存配置。
首先给左侧权限列表增加行选中事件,给datagrid控件增加onClickRow: refreshPower属性即可,refreshPower是选中行后需要执行的方法,该方法主要实现根据当前选中行生成右侧菜单树,代码如下:
$('#gridList').datagrid({
title: false,
url: '/System/SysRoleList',
nowrap: false,
iconCls: 'icon-list-bullets',
dataType: "json",
fitColumns: true,
rownumbers: true,
pagination: true,
pageSize: 15,
pageNumber: 1,
pageList: [20, 40, 100],
columns: [[
{ field: 'ck', checkbox: true },
{ field: 'ID', title: 'ID', width: 120, align: 'center', hidden: true, sortable: true },
{ field: 'NAME', title: '角色名称', width: 120, align: 'center', sortable: true },
{ field: 'ROLEDESC', title: '角色描述', width: 120, align: 'center', sortable: true }
]],
striped: true,
sortOrder: "asc",
sortName: "Id",
singleSelect: true,
selectOnCheck: true,
checkOnSelect: true,
onClickRow: refreshPower,
loadMsg: "正在加载数据..."
});
//选择表格一行执行方法
function refreshPower() {
var row = $('#gridList').datagrid('getSelected');
if (row) {
//获取当前已配置的权限列表
var powerList = row.POWERLIST == null ? "" : row.POWERLIST.split(",");
$('#tree').tree({
checkbox: true,
lines: true,
url: '/System/GetTreeJson',
onLoadSuccess: function (node, data) {
//循环所有菜单列表,如果当前已经包含,则置为选择状态
for (var i = 0; i < powerList.length; i++) {
node = $('#tree').tree('find', powerList[i].substring(1, powerList[i].length - 1));
if (node != null) {
var leaf = $('#tree').tree('isLeaf', node.target);
if (leaf) $("#tree").tree('check', node.target);
}
}
}
});
}
else { $.messager.alert('警告', '没有选择任何记录信息!', 'warning'); }
}
上面refreshPower方法内菜单树调用了后台GetTreeJson获取数据源方法,树形查询稍微有点复杂,这里主要使用的是递归查询实现的,代码如下
StringBuilder result = new StringBuilder();
StringBuilder sb = new StringBuilder();
public ActionResult GetTreeJson()
{
var list = db.SYS_MENU.ToList();
GetTreeJson(list, "id", "name", "ROOT");
return Content(result.ToString());
}
/// <summary>
/// 根据List生成Json树结构
/// </summary>
/// <param name="list">数据源</param>
/// <param name="id">ID列</param>
/// <param name="text">Text列</param>
/// <param name="pId">父ID</param>
private void GetTreeJson(List<SYS_MENU> list, string id, string text, string pId)
{
result.Append(sb.ToString());
sb.Clear();
if (list.Count > 0)
{
sb.Append("[");
var rootList = db.SYS_MENU.Where(c => c.PARENTID == pId).ToList();
if (rootList.Count > 0)
{
foreach (SYS_MENU row in rootList)
{
sb.Append("{\"id\":\"" + row.ID + "\",\"text\":\"" + row.NAME + "\",\"state\":\"open\"");
var kidList = db.SYS_MENU.Where(c => c.PARENTID == row.ID).ToList();
if (kidList.Count > 0)
{
sb.Append(",\"children\":");
GetTreeJson(kidList, id, text, row.ID);
result.Append(sb.ToString());
sb.Clear();
}
result.Append(sb.ToString());
sb.Clear();
sb.Append("},");
}
sb = sb.Remove(sb.Length - 1, 1);
}
sb.Append("]");
result.Append(sb.ToString());
sb.Clear();
}
}
具体代码逻辑这里不再进行讲解,运行程序效果如下:

点击保存权限实现方法,前端获取当前选中的树形节点,然后提交到后台进行保存即可。
//保存权限
function saveBtn() {
var row = $('#gridList').datagrid('getSelected');
var nodesChecked = $('#tree').tree('getChecked');
var nodesIndeter = $('#tree').tree('getChecked', 'indeterminate');
var ids = "";
for (var i = 0; i < nodesIndeter.length; i++) {
ids = ids + "'" + nodesIndeter[i].id + "',";
}
for (var i = 0; i < nodesChecked.length; i++) {
if (i == nodesChecked.length - 1)
ids = ids + "'" + nodesChecked[i].id + "'";
else ids = ids + "'" + nodesChecked[i].id + "',";
}
//进行异步传输
$.ajax({
url: "/System/SavaPower",
type: 'Post',
cache: false,
dataType: 'html',
data: { id: row.ID, powerList: ids }, //发送服务器数据
success: function (data) { //成功事件
if (data == "success")
$("#gridList").datagrid('reload');
},
error: function (XMLHttpRequest, textStatus, errorThrown) { //发送失败事件
alert(textStatus); return;
}
});
}
/// <summary>
/// 保存权限
/// </summary>
/// <param name="ID"></param>
/// <returns></returns>
public ActionResult SavaPower(string id, string powerList)
{
try
{
var model = db.SYS_ROLE.Find(id);
model.POWERLIST = powerList;
db.SaveChanges();
return Content("success");
}
catch (Exception e) { return Content(e.Message); }
}
至此权限管理模块首页已经完成,这里权限控制只控制到菜单级别,文章开始的图中是控制到具体页面中的按钮级别,实现方法是将每个页面的需要用到的按钮也放到菜单库中,然后进入页面的Action中查询当前页面的权限按钮进行展示(如:ViewBag.Button = ClassesLib.getMenuButton("0501");),这里不再介绍。
点击页面中的创建按钮弹出创建对话框,输入相关信息,点击保存,角色添加成功,效果如下:

以上实现的点击创建按钮弹出对话框主要使用了ShowMyWindow.js插件实现的,调用代码如下:
showMyWindow("创建角色", '/System/AddSysRole', 500, 350);
增加页面代码如下:
@model NewSystem.Models.SYS_ROLE
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>AddSysRole</title>
<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="../../Scripts/jquery.easyui.min.js" type="text/javascript"></script>
<link href="../../Content/themes/default/easyui.css" rel="stylesheet" />
<link href="../../Content/themes/icon.css" rel="stylesheet" />
<link href="../../Content/Css/Modify.css" rel="stylesheet" />
<style>
.modify-content {
padding: 10px;
}
</style>
</head>
<body>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<div class="modify-content">
@Html.HiddenFor(model => model.POWERLIST)
<div class="editor-box">
<div class="editor-label">
@Html.LabelFor(model => model.NAME)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.NAME)<span class="required">*</span>
@Html.ValidationMessageFor(model => model.NAME)
</div>
</div>
@*<div class="editor-box">
<div class="editor-label">
@Html.LabelFor(model => model.ROLETYPE)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.ROLETYPE, BankActivity.Models.GetDropDownListItem.GetSelectList("ROLETYPE"))<span class="required">*</span>
@Html.ValidationMessageFor(model => model.ROLETYPE)
</div>
</div>*@
<div class="editor-box">
<div class="editor-label">
@Html.LabelFor(model => model.ROLEDESC)
</div>
<div class="editor-field">
@Html.TextAreaFor(model => model.ROLEDESC, new { @rows = 4, @cols = 40 })
@Html.ValidationMessageFor(model => model.ROLEDESC)
</div>
</div>
<div class="editor-box">
<div class="editor-save">
<a href='#' onclick='$("form").submit()' class="easyui-linkbutton" data-options="iconCls:'icon-save'">保存数据</a>
</div>
</div>
</div>
}
</body>
</html>
/// <summary>
/// 添加
/// </summary>
/// <returns></returns>
public ActionResult AddSysRole()
{
if (ClassesLib.SessionIsNull())
{
Response.Redirect("/Login/AdminLogin");
}
return View();
}
[HttpPost]
public ActionResult AddSysRole(SYS_ROLE sysRole)
{
try
{
if (ModelState.IsValid)
{
sysRole.ID = ClassesLib.GetIdByTime();
sysRole.CREATEUSER = ClassesLib.getLoginRealName();
sysRole.CREATETIME = System.DateTime.Now;
sysRole.CREATEIP = Request.UserHostAddress;
sysRole.MODIFYTIME = System.DateTime.Now;
sysRole.MODIFYIP = Request.UserHostAddress;
sysRole.MODIFYUSER = ClassesLib.getLoginRealName();
db.SYS_ROLE.Add(sysRole);
db.SaveChanges();
return Content("<script>window.parent.windowClose();</script>");
}
return View(sysRole);
}
catch
{
return View();
}
}
主要有两个方法,第一个方法是点击创建按钮访问的方法主要用于页面跳转,第二个方法是点击保存按钮执行的方法,.net mvc的访问保存机制就是这样,一般增加修改方法都会有这个两个。
@model NewSystem.Models.SYS_ROLE
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>AddSysRole</title>
<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="../../Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
<script src="../../Scripts/jquery.easyui.min.js" type="text/javascript"></script>
<link href="../../Content/themes/default/easyui.css" rel="stylesheet" />
<link href="../../Content/themes/icon.css" rel="stylesheet" />
<link href="../../Content/Css/Modify.css" rel="stylesheet" />
<style>
.modify-content {
padding: 10px;
}
</style>
</head>
<body>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<div class="modify-content">
@Html.HiddenFor(model => model.POWERLIST)
<div class="editor-box">
<div class="editor-label">
@Html.LabelFor(model => model.NAME)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.NAME)<span class="required">*</span>
@Html.ValidationMessageFor(model => model.NAME)
</div>
</div>
@*<div class="editor-box">
<div class="editor-label">
@Html.LabelFor(model => model.ROLETYPE)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.ROLETYPE, BankActivity.Models.GetDropDownListItem.GetSelectList("ROLETYPE"))<span class="required">*</span>
@Html.ValidationMessageFor(model => model.ROLETYPE)
</div>
</div>*@
<div class="editor-box">
<div class="editor-label">
@Html.LabelFor(model => model.ROLEDESC)
</div>
<div class="editor-field">
@Html.TextAreaFor(model => model.ROLEDESC, new { @rows = 4, @cols = 40 })
@Html.ValidationMessageFor(model => model.ROLEDESC)
</div>
</div>
<div class="editor-box">
<div class="editor-save">
<a href='#' onclick='$("form").submit()' class="easyui-linkbutton" data-options="iconCls:'icon-save'">保存数据</a>
</div>
</div>
</div>
}
</body>
</html>
/// <summary>
/// 修改
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public ActionResult EditSysRole(string id)
{
if (ClassesLib.SessionIsNull())
{
Response.Redirect("/Login/AdminLogin");
}
SYS_ROLE sysRole = db.SYS_ROLE.Find(id);
return View(sysRole);
}
[HttpPost]
public ActionResult EditSysRole(SYS_ROLE sysRole)
{
try
{
if (ModelState.IsValid)
{
var tmpModel = db.SYS_ROLE.Find(sysRole.ID);
sysRole.MODIFYTIME = System.DateTime.Now;
sysRole.MODIFYIP = Request.UserHostAddress;
sysRole.MODIFYUSER = ClassesLib.getLoginRealName();
UpdateModel(tmpModel);
db.SaveChanges();
return Content("<script>window.parent.windowClose();</script>");
}
return View(sysRole);
}
catch (Exception e)
{
ModelState.AddModelError("", e.ToString());
}
return View(sysRole);
}
删除角色主要使用的ajax其他提交后台删除
if (row) {
$.ajax({
url: "/System/DelSysRole",
type: 'get',
cache: false,
dataType: 'html',
data: { dataId: row.ID },
success: function (data) {
if (data == "Success") {
$("#gridList").datagrid('reload');
$.messager.alert('提示信息', '删除成功!', 'info');
}
else $.messager.alert('提示信息', '删除失败!', 'info');
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus); return;
}
});
}
else $.messager.alert('提示信息', '请先选择数据!', 'info');
/// <summary>
/// 删除
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public ActionResult DelSysRole(string dataId)
{
try
{
var tmpModel = db.SYS_ROLE.Find(dataId);
db.SYS_ROLE.Remove(tmpModel);
db.SaveChanges();
return Content("Success");
}
catch (Exception e) { return Content(e.Message); }
}
- 完美解决iis下JWplayer提示Error loading media: File could not be played错误(4068)
- asp.net mvc+jquery easyui开发基础(一)模块首页及增加、修改、删除模块实现(3418)
- .Net Mvc中使用Jquery EasyUI控件讲解(一)表格控件datagrid使用介绍(3015)
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(三)登录模块开发(2906)
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(七)权限管理模块之系统菜单动态生成(2904)
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(八)权限管理模块之权限管理实现(2515)
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(六)权限管理模块之初始数据准备(2488)
- Jquery ajax访问asp.net web api跨域问题解决方案(1931)
- asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(五)后台模板html页面集成到项目中(1705)
- .Net Mvc中使用Jquery EasyUI控件讲解(二)树形控件tree使用介绍(1660)
- 1. Windows Server 2008 R2永久激活及Chew-WGA v0.9下载(13315)
- 2.Visual Studio 2017中安装visualSVN及使用详解(5227)
- 3.完美解决iis下JWplayer提示Error loading media: File could not be played错误(4068)
- 4.asp.net mvc+jquery easyui开发基础(一)模块首页及增加、修改、删除模块实现(3418)
- 5.Android avax.net.ssl.SSLPeerUnverifiedException: No peer certificate 解决方法(httpClient支持HTTPS的访问方式)(3262)
- 6..Net Mvc中使用Jquery EasyUI控件讲解(一)表格控件datagrid使用介绍(3015)
- 7.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(三)登录模块开发(2906)
- 8.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(七)权限管理模块之系统菜单动态生成(2904)
- 9.asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(八)权限管理模块之权限管理实现(2515)
- 10. asp.net mvc+jquery easyui开发实战教程之网站后台管理系统开发(六)权限管理模块之初始数据准备(2488)
