Web应用程序系统的多用户权限控制设计及实现-权限模块【10】

时间:2022-10-23 18:33:26

前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的权限配置模块。页面模块涉及到的数据表为权限表。权限配置模块是按照用户组和页面,栏目结合组成的。通过配置一个用户组可以访问的页面即完成了该类型用户的访问权限管理。

1.1权限域

为了更规范和方便后期系统的二次开发和维护,对应特定的业务模块采用Area(域)的方式开发,权限模块的开发域如下图所示:

aaarticlea/png;base64,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" alt="" />

由于在Areas下还建立了一个新的目录SystemManage,故需要改变原来的路由。权限模块的路由文件名称为RightManageAreaRegistration。改变路由代码的文件名称为如下:

using System.Web.Mvc;
namespace CodeForMvcTest.Areas.RightManage
{
    public class RightManageAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "SystemManage/RightManage";
            }
        }
        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "SystemManage_RightManage_default",
                "SystemManage/RightManage/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

1.2Model

权限模块的Model可参看第三章项目架构的系统共有类,对应model为TreeModel.cs。文件路径为Areas/SystemManage/Models。

1.3视图

权限模块的视图包含在权限域中,文件路径为Areas/SystemManage/OperatorManage/Views/RightManage,视图名称为RightMange.cshtml。视图的完整代码如下:

 @{
ViewBag.Title = "权限管理";
Layout = "~/Views/Shared/_BaseLayout.cshtml";
} <div class="easyui-layout" data-options="fit:true"> <div data-options="region:'north',split:true" style="height: 50px;">
<table style="margin-left: 5px; margin-top: 5px;">
<tr>
<td><span style="margin-left: 10px;">用户组:</span></td>
<td>
<select class="easyui-combobox" name="operatorGroupId" id="operatorGroupId" style="width: 150px;"
data-options="editable:false,required:true,onSelect:GetRightList">
@Html.Raw(ViewBag.GroupList)
</select>
</td>
<td>
<button id="btn_submit" style="margin-left: 10px; margin-right: 10px;" onclick="UpdateRight();">保存修改</button>
</td>
</tr>
</table> </div> <div data-options="region:'center',split:true" style="padding-bottom: 10px; padding-top: 10px;">
<ul class="easyui-tree" id="pageTree"
data-options="
checkbox:true,
url:'/SystemManage/RightManage/RightManage/GetRightTree',
method:'get',
onLoadSuccess:GetRightList">
</ul>
<br />
</div> </div> @section scripts
{
<script type="text/javascript" src="/Areas/SystemManage/SystemJS/rightManage.js"></script>
<script type="text/javascript">
</script>
}

RightManage.cshtml

1.4JS文件

权限模块相关的JS文件路径为Areas/SystemManage/SystemJS,JS文件名称为rightManage.js。JS的完整代码如下:

 //加载用户组对应的权限列表
function GetRightList() {
LoadMask("正在查询,请稍等... ..."); var operatorGroupId = $("#operatorGroupId").combobox("getValue");
var roots = $("#pageTree").tree('getRoots');
if (roots != null && roots.length > 0) {
for (var i = 0; i < roots.length; i++) {
$("#pageTree").tree("uncheck", roots[i].target);
}
} $.ajax({
url: '/SystemManage/RightManage/RightManage/RightManage',
data: { operatorGroupId: operatorGroupId },
type: 'POST',
dataType: 'json',
success: function (data) {
if (data.isSuccess == "0") {
alert("未能成功加载用户组对应权限!");
} else {
if (data.dataList.length > 0) {
for (var i = 0; i < data.dataList.length; i++) {
var nodeId = data.dataList[i];
var node = $("#pageTree").tree("find", nodeId);
if (node != null && $("#pageTree").tree("isLeaf", node.target) == true) {
$("#pageTree").tree("check", node.target);
}
}
}
}
HideMask();
},
error: function (data) {
if (data.responseText.indexOf("/Login/Login") >= 0) {
window.parent.location.href = '/Login/Login';
}
alert("加载用户组对应权限出错!");
HideMask();
}
});
}; //修改用户组的权限
function UpdateRight() {
LoadMask("正在修改,请稍等... ...");
var operatorGroupId = $("#operatorGroupId").combobox("getValue");
var nodes = $("#pageTree").tree("getChecked"); //选中的所有节点
//将所有叶子节点(即页面节点)的ID值取出,组合为数组
var rightArray = [];
if (nodes.length > 0) {
var j = 0;
for (var i = 0; i < nodes.length; i++) {
if ($("#pageTree").tree('isLeaf', nodes[i].target) == true) {
var nodeObj;
nodeObj = {
PageIndex: nodes[i].id
};
rightArray[j] = nodeObj;
j++;
}
}
} $.ajax({
url: '/SystemManage/RightManage/RightManage/UpdateRight',
data: { operatorGroupId: operatorGroupId, rightIdListStr: JSON.stringify(rightArray) },
dataType: 'text',
type: 'POST',
traditional: true,
success: function (data) {
if (data.indexOf("/Login/Login") >= 0) {
window.parent.location.href = '/Login/Login';
}
alert(data);
HideMask();
},
error: function (data) {
if (data.responseText.indexOf("/Login/Login") >= 0) {
window.parent.location.href = '/Login/Login';
}
alert("修改权限出错!");
HideMask();
}
}); };

rightManage.js

1.5控制器

权限模块的控制器包含在权限域中,文件路径为Areas/SystemManage/PageMange/Controllers,控制器名称为RightManageController.cs。控制器的完整代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Session;
using OdbcDbAccess;
using System.Data;
using Models;
using Controllers;
using System.Data.SqlClient;
using Newtonsoft.Json;
using LogInfo;
using System.IO;
using System.Text; namespace CodeForMvcTest.Areas.RightManage.Controllers
{
public class RightManageController : BaseController
{
/// <summary>
/// ****************************
/// 功能:权限处理类
/// 作者:Author
/// 时间:2015-7-18
/// 邮箱:1129137758@qq.com
/// **************************** public ActionResult RightManage()
{
IList<OperatorGroup> groupList = GetOperatorGroup();
ViewBag.GroupList = DataTransfor.ListToComboboxHtml(groupList, "GroupId", "GroupName", false);
return View();
} /// <summary>
/// 获取权限树
/// </summary>
/// <returns></returns>
public ActionResult GetRightTree()
{
IList<TreeModel> catalogNodeList = new List<TreeModel>();
//查询语句
string sql = "select * from catalog where isavailable=1 order by catalogid,showno";
try
{
//获取目录数据,并封装
DataSet categoryDs = SqlHelper.ExecuteQuery(SqlSeverConnectionName, sql);
if (categoryDs != null && categoryDs.Tables.Count > )
{
catalogNodeList = TreeModel.BuildTreeNodeList(categoryDs.Tables[].Rows, "catalogid", "catalogname",
"parentid", false);
//获取页面数据
sql = "select catalogid,pageid,pagename from pageinfo where isavailable=1 order by catalogid,showno";
DataSet pageDs = SqlHelper.ExecuteQuery(SqlSeverConnectionName, sql); if (pageDs != null && pageDs.Tables.Count > )
{
DataTable table = pageDs.Tables[];
foreach (DataRow pageRow in table.Rows)
{
decimal parentId = DBNull.Value.Equals(pageRow["catalogid"]) ? : Convert.ToDecimal(pageRow["catalogid"]);
decimal id = DBNull.Value.Equals(pageRow["pageid"]) ? : Convert.ToDecimal(pageRow["pageid"]);
id = Convert.ToDecimal(parentId + id.ToString(""));
string pageName = DBNull.Value.Equals(pageRow["pagename"]) ? "" : Convert.ToString(pageRow["pagename"]); var node = new TreeModel
{
id = id,
text = pageName,
state = "close"
}; if (!TreeModel.FoundTreeNode(catalogNodeList, node, parentId))
{
catalogNodeList.Add(node);
} }
}
}
}
catch (Exception ex)
{
Log.SaveErrorLog(ex.ToString(), "构建页面列表树出错!");
}
return Json(catalogNodeList, JsonRequestBehavior.AllowGet);
} /// <summary>
/// 通过用户组ID获取拥有的页面权限
/// </summary>
/// <param name="operatorGroupId">用户组ID</param>
/// <returns></returns>
[HttpPost]
public ActionResult RightManage(int operatorGroupId)
{
//对应的节点ID
IList<decimal> nodeId = new List<decimal>(); try
{
string sql = "select * from rightlist where operatorgroupid='" + operatorGroupId + "'";
DataSet dataSet = SqlHelper.ExecuteQuery(SqlSeverConnectionName, sql);
if (dataSet != null && dataSet.Tables.Count > )
{
DataTable table = dataSet.Tables[];
decimal categoryId, pageId;
foreach (DataRow dr in table.Rows)
{
categoryId = Convert.ToDecimal(dr["categoryid"]);
pageId = Convert.ToDecimal(categoryId + Convert.ToInt32(dr["pageid"]).ToString(""));
if (!nodeId.Contains(categoryId))
{
nodeId.Add(categoryId);
}
nodeId.Add(pageId);
}
}
object result = new
{
isSuccess = ,
dataList = nodeId
};
return Json(result);
}
catch (Exception ex)
{
Log.SaveErrorLog(ex.ToString(), "查询用户组权限出错");
object result = new
{
isSuccess =
};
return Json(result);
}
} /// <summary>
/// 修改用户组权限
/// </summary>
/// <param name="operatorGroupId">用户组ID</param>
/// <param name="rightIdList">权限ID列表</param>
/// <returns></returns>
[HttpPost]
public ActionResult UpdateRight(int operatorGroupId, string rightIdListStr)
{
IList<Page> rightIdList = JsonConvert.DeserializeObject<IList<Page>>(rightIdListStr);
var sql = new StringBuilder();
sql.Append("delete from rightlist where operatorgroupid=").Append(operatorGroupId); try
{
if (rightIdList != null && rightIdList.Count > )
{
string sqlItem = "insert into rightlist (pageid,categoryid,operatorgroupid,state,issys) values ({0},{1},{2},1,0)";
foreach (Page item in rightIdList)
{
string pageNodeId = item.PageIndex.ToString();
if (pageNodeId.Length > )
{
string categoryId = pageNodeId.Substring(, pageNodeId.Length - );
string pageId = pageNodeId.Substring(pageNodeId.Length - , ); sql.Append(";").Append(string.Format(sqlItem, Convert.ToInt32(pageId), categoryId, operatorGroupId));
}
}
}
string sqlinfo=sql.ToString ();
int result=SqlHelper .ExecuteTran(SqlSeverConnectionName,sqlinfo); Log.SaveOperatorLog("", , "修改权限成功");
return Content("修改成功!");
}
catch (Exception ex)
{ Log.SaveErrorLog(ex.ToString(), "修改权限出错");
return Content("未能成功修改权限!");
} } /// <summary>
/// 获取用户组列表
/// </summary>
/// <returns></returns>
private IList<OperatorGroup> GetOperatorGroup()
{
IList<OperatorGroup> groupList = new List<OperatorGroup>();
string sql = "select * from operatorgroup order by groupid";
try
{
DataSet dataSet = SqlHelper.ExecuteQuery(SqlSeverConnectionName, sql);
int[] columnIndexArray = { , , , , };
string[] propertyArray = { "GroupId", "GroupName", "OrderNum", "State", "ParentId" };
groupList = DataTransfor.DataSetTransfor<OperatorGroup>(dataSet, columnIndexArray, propertyArray);
}
catch (Exception ex)
{
Log.SaveErrorLog(ex.ToString(), "获取用户组出错!");
}
return groupList;
}
}
}

RightManage.cs

1.6界面运行截图

权限管理主界面如下图所示:

aaarticlea/png;base64,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" alt="" />