开发工具与关键技术:vs与mvc js
作者:执~漠
撰写时间:2020年8月7日星期五
权限的原理:
第一张表是用户表:因为要设置权限时,要知道你的用户账号是否存在于这个数据库里。因为只有存在的账号才有最基本的权限,就是能登陆进这个系统里面。
第二张表是用户类型(角色)表:你的账号能进入这个系统之后,再判断你的账号是属于那个角色的。因为不同的角色,有不同的权力。
第三张表是用户类型明细表:这张表是标记用户表对用户类型(角色)表的关系,它们的关系是多对多的关系。一个账号可能是对应多个类型,一个类型也可以有多个账号。这个意思就是用户表于用户类型表(角色)表是多对多的关系。要怎么创建这个多对多的表格呢?首先把用户表和用户类型表它们的主键ID,用来做这个表的外键ID从而达到多对多的关系。
第四张表是模块表:这个表要对应是你系统里面的功能模块。这个表是控制每个不同的用户类型对每个模块的使用权力的大与小。这个表控制了不同的用户类型能看见的模块。
第五张表是操作表:这个表是对每个模块里面的每个功能点进行控制。这个表控制了个用户类型能对那些模块进行那些操作的表。
第六张表是模块明细表:这个表是标记模块表对操作表的关系,它们的关系是多对多的关系。意思是不同的模块里面有不同的操作。这个意思是模块表对操作表的关系。要怎么创建呢?首先把模块表和操作表它们的主键ID,用来做这个表的外键ID从而达到多对多的关系。
实现的方法:
隐藏跳转页面的按钮(原理是欺骗浏览器)。
首先声明一个对象,一个菜单名和页面按钮id匹配相匹配的对象。
通过登录的角色来判断该角色能操作那些模块
if (Session["UserID"] != null)
{
int userId = Convert.ToInt32(Session["UserID"]);
//读取权限信息
var tempModulars = from tbPermission in myModel.S_Permission
join tbModule in myModel.S_Module on tbPermission.moduleID equals tbModule.moduleID
join tbUser in myModel.S_User on tbPermission.UserTypeID equals tbUser.userTypeID
where tbUser.userID == userId && tbModule.blFun == false
select new
{
ID = tbModule.moduleID,//模块ID
Name = tbModule.moduleDescrible.Trim()
};
//输出演示
var ttt = tempModulars.ToList();
//外连接(左连接:全部数据来源于S_Module)
var userModulars = (from tbSysModular in myModel.S_Module
join tbTempModulars in tempModulars on tbSysModular.moduleID equals tbTempModulars.ID into temp
select new
{
ModularID = tbSysModular.moduleID,
ModularName = tbSysModular.moduleDescrible.Trim(),
ID = temp.Select(t => t.ID).FirstOrDefault() != null ? temp.Select(t => t.ID).FirstOrDefault() : 0
}).ToList();
return Json(userModulars, JsonRequestBehavior.AllowGet);
}
查询可以操作的模块后,用左连接来查询模块表里面的模块ID是否存在这个用户能操作的权限,如果这个用户不能操作的权限ID让这个ID等于0,然后返回给页面
$.post("/Main/SelectModularJurisdiction", { time: (new Date()).getTime().toString() }, function (objModulars) {
//console.log(objModulars);
if (objModulars == "") {
//权限为空,跳转页面
window.location.href = "/";
}
else {
//不为空
for (key in objModulars) {
var obj = objModulars[key];
//获取ID==0说明没有匹配到数据
if (obj.ID == 0) {
//提取模块名称
var modularName = obj.ModularName;
//使用模块名称匹配页面中的按钮
var elId = dirIdModlarName[modularName];
console.log(elId);
//根据ID选择器移除按钮
$("#" + elId).remove();//去掉没有的权限对应的菜单
}
}
}
});
通过objModulars返回的结果进行判断,如果为空时就跳转空页面,不为空时判断哪些功能该隐藏哪些功能该显示,不过这样的缺点是如果知道链接还是能直接访问到相关的页面