按钮类型:增、删、改、查、导出、导出、流程查看、流程跟踪
菜单:menu1、menu2
权限组:哪个组有哪些菜单的按钮权限
1、根据菜单编号和操作按钮编号数组([add,del,search,update] 等),返回数组中的每个操作是否有权限true或false
2、根据true或false直接显示或隐藏按钮;
**********************************common.js**********************************Start
/**
* 一次处理所有的按钮权限,节省请求次数,减轻负载压力;
* @param optArr 按钮数组
* @param menuId 菜单编号
* @returns {json}
*/
function hasPrivsForAllBtn(optArr, menuId) {
var allBtnPrivsJson={};
//1 如果没有传入menuId,取一下
if(!menuId)
//menuId = top.document.getElementById('top').name;
menuId = top.document.getElementById('currMenuId').value;
//2 如果menuId 有值,去匹配当前登录人时候有对应按钮权限
if(optArr && menuId) {
//ajax 判断当前登录用户是否具有该按钮的权限
$.ajax({
method : 'post',
url : 'Privs_hasPrivsForAllBtn.do',
data:{"optArr":optArr,"menuId":menuId},
dataType : 'JSON',
traditional: true,//在struts2下该属性必须有
async : true,//异步;同步会导致请求阻塞。zhangyouxue 2015-04-08
success : function(result) {
for(var i=0; i<optArr.length; i++) {
if(allBtnPrivsJson[optArr[i]]) {
//没有权限则隐藏掉按钮
$("div[data-options='"+ optArr[i] +"']").attr('style', 'display:none;');
}else {
$("div[data-options='"+ optArr[i] +"']").attr('style', '');
}
}
}
});
}
return allBtnPrivsJson;
}
**********************************common.js**********************************End
**********************************PrivsAction.java**********************************Start
private String[] optArr;
public String[] getOptArr() {
return optArr;
}
public void setOptArr(String[] optArr) {
this.optArr = optArr;
}
/**
* 对hasPrivs优化,对处理多合一。
* @return
* @throws IOException
*/
public String hasPrivsForAllBtn() throws IOException {
String menuId = request.getParameter("menuId");
DhccUser loginUser = (DhccUser)request.getSession().getAttribute("loginUser");
//StringBuilder allBtnPrivsJson = new StringBuilder();
Map<String,String> jsonMap = new HashMap<String,String>();
for (String opt : optArr) {
if(loginUser!=null && menuId!=null && !menuId.equals("") && opt!=null && !opt.equals("")) {
if(loginUser.isSysAdmin() || loginUser.hasPrivs(opt+"_"+menuId)){
jsonMap.put(opt,"true");
}else{
jsonMap.put(opt,"false");
}
}
}
//allBtnPrivsJson.append(JsonUtil.toJSONStringByFastjson(jsonMap));
PrintWriter out = response.getWriter();
out.write(JsonUtil.toJSONStringByFastjson(jsonMap));
out.flush();
out.close();
return null;
}
**********************************PrivsAction.java**********************************End
**********************************DhccUser.java********************************** Start
是否系统管理员,在系统登录时认证,存到session中。
public boolean isSysAdmin() {
boolean rtn = false;
if(iuser.getKeyName().equalsIgnoreCase("administrator"))
rtn = true;
return rtn;
}
//判断该用户是否具有指定菜单的权限
public boolean hasPrivs(String menuId) {
/*1 如果该菜单不存在,则默认具有该菜单权限(主要是为了处理按钮级别的权限控制,例如某个功能点不需要判断其CRUD的权限,可能在sysmenu中就没有定义,这时候默认其具有该权限)*/
if(MenuUtils.getAllMenuMap().get(menuId) == null)
return true;
else if(menuId!=null && !menuId.equals("") && privsMap.get(menuId)!=null)
return true;
else
return false;
}
**********************************DhccUser.java**********************************End
**********************************MenuUtils.java**********************************Start
/**
* 获得顶级菜单
* 可以再根据菜单的getSons方法逐级获取下级菜单
* @Descrption
* @return
* @Version 1.0
* @Author ***
* @Date Sep 6, 2012
*/
public static List<Menu> getRootMenus() {
if(root_menus==null)
root_menus = XmlUtils.xml2Menus();
return root_menus;
}
/**
* 获得map格式的所有菜单
* @Descrption
* @return
* @Version 1.0
* @Author ***
* @Date Feb 4, 2013
*/
private static Map<String, Menu> all_menus_map = null;
public static Map<String, Menu> getAllMenuMap() {
if(all_menus_map == null) {
//保存到map中
all_menus_map = new HashMap<String, Menu>();
all_menus = getAllMenus();
for(int i=0; i<all_menus.size(); i++) {
all_menus_map.put(all_menus.get(i).getId(), all_menus.get(i));
}
}
return all_menus_map;
}
/**
* 获得所有菜单
* @Descrption
* @return
* @Version 1.0
* @Author ***
* @Date Sep 6, 2012
*/
public static List<Menu> getAllMenus() {
if(all_menus==null) {
all_menus = new ArrayList<Menu>();
root_menus = getRootMenus();
for(Menu m : root_menus) {
all_menus.add(m);
getAllMenus(m);
}
//过滤一下null
all_menus.remove(null);
}
return all_menus;
}
/*
获得所有菜单项
*/
private static void getAllMenus(Menu me) {
for(Menu m : me.getSons()) {
all_menus.add(m);
getAllMenus(m);
}
}
/**
* 重新加载菜单,用于解决菜单文件更新后需要重启服务器的问题
* @Descrption
* @Version 1.0
* @Author ***
* @Date Sep 6, 2012
*/
public static void initMenus() {
root_menus = null;
all_menus = null;
getRootMenus();
getAllMenus();
}
**********************************MenuUtils.java**********************************End
**********************************XmlUtils.java**********************************Start
/**
* //返回的是一个三层map(用于解析导出excel 定义的数据转换文件)
* // 1 最外层的key,是所有的类 -->bean_map
* // 2 中间层的key,是一个类所有的属性 -->prop_map
* // 3 最里层的key,一个属性所有的转换集合 -->format_map
* @Descrption
* @return
* @Version 1.0
* @Author ***
* @Date Sep 5, 2012
*/
public static Map<String, Map<String, Map<String, String>>> xml2Map() {
SAXReader reader = new SAXReader();
Document doc;
File file = new File(XmlUtils.class.getClassLoader().getResource("format.xml").getPath());//这里执行配置文件的地址,放在src下
try {
doc = reader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
return xml2Map(null);
}
return xml2Map(doc);
}
private static Map<String, Map<String, Map<String, String>>> xml2Map(Document doc) {
//返回的是一个三层map
// 1 最外层的key,是所有的类 -->bean_map
// 2 中间层的key,是一个类所有的属性 -->prop_map
// 3 最里层的key,一个属性所有的转换集合 -->format_map
Map<String, Map<String, Map<String, String>>> bean_map = new HashMap<String, Map<String, Map<String, String>>>();
if (doc == null)
return bean_map;
Element root = doc.getRootElement();
List<Element> beans = root.elements("bean");
for(Element bean : beans) {
Map<String, Map<String, String>> prop_map = new HashMap<String, Map<String, String>>();
List<Element> props = bean.elements("prop");
for(Element prop : props) {
Map<String, String> format_map = new HashMap<String, String>();
List<Element> formats = prop.elements("format");
for(Element format : formats) {
format_map.put(format.attributeValue("key"), format.attributeValue("value"));
}
prop_map.put(prop.attributeValue("name"), format_map);
}
bean_map.put(bean.attributeValue("name"), prop_map);
}
return bean_map;
}
/**
* 获取菜单文件
* 这种方式支持无限下级
* @Descrption
* @param args
* @throws URISyntaxException
* @throws DocumentException
* @throws DocumentException
* @Version 1.0
* @Author ***
* @Date Sep 6, 2012
*/
public static List<Menu> xml2Menus() {
SAXReader reader = new SAXReader();
File file = new File("");
try {
file = new File(XmlUtils.class.getClassLoader().getResource("sysmenus.xml").toURI().getPath());
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
//这里执行配置文件的地址,放在src下
Document doc = null;
try {
doc = reader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
return null;
}
Element root = doc.getRootElement();
return getSons(root, 1, null);
}
//递归获取下级
private static List<Menu> getSons(Element e, int level, Menu father) {
List<Menu> menus = new ArrayList<Menu>();
List<Element> elements = e.elements();
if(elements==null || elements.size()<1)
return menus;
for(Element ele : elements) {
String id = ele.attributeValue("id");
String name = ele.attributeValue("name");
String type = ele.attributeValue("type");
String url = ele.attributeValue("url");
String icon = ele.attributeValue("icon");
if(type==null || type.equals(""))//type 默认为link
type = "link";
//Menu m = new Menu(id, name, type, url, level, father);
Menu m = new Menu(id, name, type, url, icon, level, father);
m.setSons(getSons(ele, level+1, m));
menus.add(m);
}
return menus;
}
**********************************XmlUtils.java**********************************End
**********************************sysmenus.xml**********************************Start
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
注意:
1、 多个参数的连接符号在xml中用 & 表示
2、 id 必须是唯一的,id不要随便更改,很多都是在程序中直接用到了,尤其是带字幕前缀的id
-->
<menus>
<menu id="04" name="个人办公" url="" icon="dhcc02.png">
<menu id="0400" name="文件柜" url="">
<menu id="040001" name="公共文件柜" url="office/filecabinet/list.jsp?isPublic=Y"></menu>
<menu id="040002" name="个人文件柜" url="office/filecabinet/list.jsp?isPublic=N"></menu>
</menu>
<menu id="0401" name="通讯录" url="">
<menu id="040103" name="公共通讯录" url="addressbook/list.jsp?type=1">
<menu id="a_040103" name="新建" type="button" />
<menu id="q_040103" name="查看" type="button" />
<menu id="d_040103" name="删除" type="button" />
<menu id="u_040103" name="修改" type="button" />
<menu id="e_040103" name="导出" type="button" />
</menu>
</menu>
<menu id="0405" name="个人考勤" url="">
<menu id="040501" name="签到/签退登记" url="SignInfoManage_toSignInfoUpdate.do"></menu>
</menu>
</menu>
</menus>
**********************************sysmenus.xml**********************************End