上周刚进了Java的坑,这周又回来了,毕竟权限这里还有很多遗留的问题需要我去解决的,这次先写一写最近的研究。
控制按钮这个功能一直都没有人来做,当初是我做的控制页面,导致后面接手的兄弟们不太好整,光是看懂那个JS就很费劲了,更别提做出控制按钮了。所以这个从2.0就说要做出来的功能,也是终于有时间来研究研究了。
话说我的思路其实很简单,找一个专门的类来处理点击的页面资源的ID,然后这个ID下的按钮资源,最后返回一个JS去执行。然而问题卡就卡在,这个逻辑要放哪呢?
知道我遇到了Filter这个东西,MVC自带的过滤器,可以设置在Action后面执行,那设置他执行玩加载页面的Action之后执行这个方法不就行了。
然后又遇到一个问题,我是点了一个页面对吧,这个页面也有一个ID对吧,那这个ID怎么传到Filter中呢?这几天还在研究cookie这个东西,然后就顺手用一下吧。
下面是我写的一个示例,因为需要至少三个人的模块来测试,现在大伙都忙,没空管.Net这边的东西,就没做测试,等11期接手了,和他们商量一下测试的事吧。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ITOO.Library.Core.Memcache;
using ITOO.Authority.ViewModel;namespace ITOO.AuthorityDoorLogon.Client.Filter
{public class BtnAuthorityFilter : ActionFilterAttribute{public override void OnActionExecuted(ActionExecutedContext filterContext){List<ResourceViewModel> ResourceList = new List<ResourceViewModel>();List<ResourceViewModel> btnList = new List<ResourceViewModel>();string ControlBtnJS = "<script languge='javascript'>";//1.获得登陆用户的角色信息HttpCookie selfUserInfo = System.Web.HttpContext.Current.Request.Cookies.Get("selfUserInfo");Dictionary<string, string> userInfoRoleId = (Dictionary<string, string>)MemcacheHelper.Get(selfUserInfo.Value);string roleId = userInfoRoleId["RoleViewModelId"].ToString();//2.如果角色信息不为空,根据角色id查询所拥有的资源if (userInfoRoleId != null){//从Memcache缓存中取该角色拥有的资源ResourceList = (List<ResourceViewModel>)MemcacheHelper.Get(roleId);}else{return;}//3.获取当前进入的页面或模块资源的IDstring pageId = System.Web.HttpContext.Current.Request.Cookies.Get("clickPageId").Values.ToString();//4.循环资源列表,获得当前页面下面的按钮//如果获得的资源列表不为空if (ResourceList.Count != 0){//循环资源列表for (int i = 0; i < ResourceList.Count; i++){//如果这个资源的pid是点击的页面,并且类型是按钮,把他加入按钮list中(这里也可以根据pid查询数据库中的字段)if (ResourceList[i].ResourcePId.ToString() == pageId && ResourceList[i].Type == "按钮"){btnList.Add(ResourceList[i]);}}}else{return;}//5.根据获得的按钮list编写返回页面的JSfor (int i = 0; i < btnList.Count; i++){//获得按钮元素ControlBtnJS+="var "+btnList[i].ResourceId+"=document.getElementsByName('"+btnList[i].ResourceName+"')";//控制按钮的样式为显示ControlBtnJS+=btnList[i].ResourceId+".display='inline'";}ControlBtnJS += "</script>";//6.执行JS,使按钮显示System.Web.HttpContext.Current.Response.Write(ControlBtnJS);}}
}
差不多就这样吧,肯定会遇到各种问题,到时候再说。
权限这边剩下的问题也不多了,还有一个AOP拦截WCF类获取参数中的链接字符串,组织机构挂钩的数据权限,CAS要把Cookie写到用户的IP上,注册时逻辑的优化,还有一个门户的重新布局,希望能够和下一版的孩子们合作解决了。