📄 menuutil.java
字号:
package com.intohotel.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import java.util.jar.JarInputStream;
import java.util.zip.ZipEntry;
import com.intohotel.entity.Menu;
/**
* 菜单的生成工具类
*
* @author sys53
* @since 7:53:26 PM
* @version 2_0_0
*/
public class MenuUtil {
private static final String MENU_HEADER_TPL = "headmenu.tpl";
private static final String MENU_MAIN_TPL = "menu.tpl";
private static final String MENU_SUBMENU_TPL = "submenu.tpl";
private static String menuHeaderTpl;
private static String menuMainTpl;
private static String subMenuTpl;
//菜单控制常量
private static final String HEAD_CONTROL_CLASS = "\\$\\{header-control-class\\}";
//菜单主体常量
private static final String MENU_MAIN_CLASS = "\\$\\{menu-main-class\\}";
private static final String MENU_HEAD_CLASS = "\\$\\{menu-head-class\\}";
private static final String MENU_HEAD_ID = "\\$\\{head-id\\}";
private static final String MENU_HEAD_TEXT_CLASS = "\\$\\{menu-head-text-class\\}";
private static final String MENU_HEAD_TEXT = "\\$\\{menu-head-text\\}";
private static final String MENU_ID = "\\$\\{menu-id\\}";
private static final String CONTEXTPATH = "\\$\\{contextPath\\}";
private static final String SUBMENU_CLASS = "\\$\\{submenu-class\\}";
private static final String SUB_MENU = "\\$\\{sub-menu\\}";
//子菜单常量
private static final String SUBMENU_TEXT_CLASS = "\\$\\{submenu-text-class\\}";
private static final String SUBMENU_URL = "\\$\\{url\\}";
private static final String SUBMENU_TARGET = "\\$\\{target\\}";
private static final String SUBMENU_TEXT = "\\$\\{submenu-text\\}";
/**
* 菜单的头控制源代码
* @return
*/
public static String genMenuControlHead(String contextPath){
String sMenu = getMenuHeaderTpl();
sMenu = sMenu.replaceAll(HEAD_CONTROL_CLASS, "header-control-class");
sMenu = sMenu.replaceAll(CONTEXTPATH, contextPath);
return sMenu;
}
/**
* 菜单一级菜单的html源代码
* @return
*/
public static String genMenuSource(Menu menu,List<String> rights,String contextPath){
if(!Menu.MENU_STATUS_Y.equals(menu.getMenustatus()) || !allow(menu,rights))
return "";
String sMenu = getMenuMainTpl();
sMenu = sMenu.replaceAll(MENU_MAIN_CLASS, "menu-main-class");
sMenu = sMenu.replaceAll(MENU_HEAD_CLASS, "menu-head-class");
sMenu = sMenu.replaceAll(MENU_HEAD_ID, menu.getGrade()+"");
sMenu = sMenu.replaceAll(MENU_HEAD_TEXT_CLASS, "menu-head-text-class");
sMenu = sMenu.replaceAll(MENU_HEAD_TEXT, menu.getMenuname());
sMenu = sMenu.replaceAll(CONTEXTPATH, contextPath);
sMenu = sMenu.replaceAll(SUBMENU_CLASS, "submenu-class");
//获取子菜单的html源代码
String subMenuSource = "";
if(menu.getMenus()!=null){
Iterator<Menu> it = menu.getMenus().iterator();
while(it.hasNext()){
Menu subMenu = it.next();
if(!Menu.MENU_STATUS_Y.equals(subMenu.getMenustatus()) ||!allow(subMenu,rights))
continue;
String subMenuTpl = getSubMenuTpl();
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_TEXT_CLASS, "submenu-text-class");
if(!StringUtil.isEmpty(subMenu.getAction())){
if(subMenu.getAction().startsWith("ftp://")
||subMenu.getAction().startsWith("http://")
||subMenu.getAction().startsWith("https://")
||subMenu.getAction().startsWith("javascript:")
||subMenu.getAction().startsWith("file://")){
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, subMenu.getAction());
}else{
if(subMenu.getAction().startsWith("/"))
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, subMenu.getAction()==null?"javascript:void(0);":contextPath+subMenu.getAction());
else
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, subMenu.getAction()==null?"javascript:void(0);":contextPath+"/"+subMenu.getAction());
}
}else{
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, "javascript:void(0);");
}
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_TARGET, subMenu.getTarget()==null?"":subMenu.getTarget());
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_TEXT, subMenu.getMenuname()==null?"":subMenu.getMenuname());
subMenuTpl = subMenuTpl.replaceAll(MENU_ID, subMenu.getMenuid()+"");
subMenuSource += subMenuTpl + "\n";
}
}
sMenu = sMenu.replaceAll(SUB_MENU, subMenuSource);
return sMenu;
}
/**
* 菜单一级菜单的html源代码
* @return
*/
public static String genEbookMenuSource(Menu menu,String contextPath){
String sMenu = getMenuMainTpl();
sMenu = sMenu.replaceAll(MENU_MAIN_CLASS, "menu-main-class");
sMenu = sMenu.replaceAll(MENU_HEAD_CLASS, "menu-head-class");
sMenu = sMenu.replaceAll(MENU_HEAD_ID, menu.getGrade()+"");
sMenu = sMenu.replaceAll(MENU_HEAD_TEXT_CLASS, "menu-head-text-class");
sMenu = sMenu.replaceAll(MENU_HEAD_TEXT, menu.getMenuname());
sMenu = sMenu.replaceAll(CONTEXTPATH, contextPath);
sMenu = sMenu.replaceAll(SUBMENU_CLASS, "submenu-class");
//获取子菜单的html源代码
String subMenuSource = "";
if(menu.getMenus()!=null){
Iterator<Menu> it = menu.getMenus().iterator();
while(it.hasNext()){
Menu subMenu = it.next();
if(!Menu.MENU_STATUS_Y.equals(subMenu.getMenustatus()))
continue;
String subMenuTpl = getSubMenuTpl();
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_TEXT_CLASS, "submenu-text-class");
if(!StringUtil.isEmpty(subMenu.getAction())){
if(subMenu.getAction().startsWith("ftp://")
||subMenu.getAction().startsWith("http://")
||subMenu.getAction().startsWith("https://")
||subMenu.getAction().startsWith("javascript:")
||subMenu.getAction().startsWith("file://")){
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, subMenu.getAction());
}else{
if(subMenu.getAction().startsWith("/"))
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, subMenu.getAction()==null?"javascript:void(0);":contextPath+subMenu.getAction());
else
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, subMenu.getAction()==null?"javascript:void(0);":contextPath+"/"+subMenu.getAction());
}
}else{
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_URL, "javascript:void(0);");
}
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_TARGET, subMenu.getTarget()==null?"":subMenu.getTarget());
subMenuTpl = subMenuTpl.replaceAll(SUBMENU_TEXT, subMenu.getMenuname()==null?"":subMenu.getMenuname());
subMenuTpl = subMenuTpl.replaceAll(MENU_ID, subMenu.getMenuid()+"");
subMenuSource += subMenuTpl + "\n";
}
}
sMenu = sMenu.replaceAll(SUB_MENU, subMenuSource);
return sMenu;
}
/**
* 获取菜单的控制模板
*
* @return
*/
public static String getMenuHeaderTpl() {
try {
if (StringUtil.isEmpty(menuHeaderTpl))
menuHeaderTpl = readTplSource(MENU_HEADER_TPL);
} catch (IOException e) {
e.printStackTrace();
}
return menuHeaderTpl;
}
/**
* 获取菜单主内容模板
* @return
*/
public static String getMenuMainTpl(){
try {
if (StringUtil.isEmpty(menuMainTpl))
menuMainTpl = readTplSource(MENU_MAIN_TPL);
} catch (IOException e) {
e.printStackTrace();
}
return menuMainTpl;
}
/**
* 获取菜单主内容模板
* @return
*/
public static String getSubMenuTpl(){
try {
if (StringUtil.isEmpty(subMenuTpl))
subMenuTpl = readTplSource(MENU_SUBMENU_TPL);
} catch (IOException e) {
e.printStackTrace();
}
return subMenuTpl;
}
/**
* 验证菜单是不是有已有权限中,如果是父菜单,那么其子菜单有权限,那个自动会传递到父菜单的权限中去
* @param menu
* @param rights
* @return
* 允许:true,拒绝:false;
*/
// private static boolean allow(Menu menu,List<Authorization> rights){
// if(Menu.MENU_STATUS_Y.equals(menu.getMenustatus())){
// if(rights.contains(menu.getAuthorization()))
// return true;
// else{
// if(menu.getMenus()!=null){
// java.util.Iterator<Menu> it = menu.getMenus().iterator();
// while(it.hasNext()){
// Menu subMenu = it.next();
// if(rights.contains(subMenu.getAuthorization()))
// return true;
// else
// if(allow(subMenu,rights))
// return true;
// }
// }
// }
// }
// return false;
// }
private static boolean allow(Menu menu,List<String> rights){
if(rights==null)
return false;
if(menu.getAuthorization()==null)
return false;
if(Menu.MENU_STATUS_Y.equals(menu.getMenustatus())){
if(rights.contains(menu.getAuthorization().getAuthCode()))
return true;
else{
if(menu.getMenus()!=null){
java.util.Iterator<Menu> it = menu.getMenus().iterator();
while(it.hasNext()){
Menu subMenu = it.next();
if(subMenu.getAuthorization()!=null && subMenu.getAuthorization().getAuthCode()!=null){
if(rights.contains(subMenu.getAuthorization().getAuthCode()))
return true;
else
if(allow(subMenu,rights))
return true;
}
else{
if(allow(subMenu,rights))
return true;
}
}
}
}
}
return false;
}
/**
* 读取tpl文件的内容
* tpl文件放在classes目录下的或者lib下的jar包里,会自动搜过,classes目录下的所有文件,直到找到相应文件为止
* @param fileName
* fileName:文件名
* @return
* @throws IOException
*/
public static String readTplSource(String fileName) throws IOException {
//String path = System.getProperties().getProperty("java.class.path");
String path = MenuUtil.class.getClassLoader().getResource("").getPath();
path = path.replaceAll("%20", " ");
StringTokenizer st = new StringTokenizer(path, ";");
String fullFileName = "";
while (st.hasMoreTokens()) {
String part = st.nextToken();
File partFile = new File(part);
if (partFile.exists()) {
if (partFile.isDirectory())
fullFileName = findFileInDir(partFile, fileName);
else
fullFileName = findFileInJar(partFile, fileName);
}
if(!StringUtil.isEmpty(fullFileName))
break;
}
if(!StringUtil.isEmpty(fullFileName)){
File propFile = new File(fullFileName);
InputStreamReader read = new InputStreamReader (new FileInputStream(propFile),"GBK");
BufferedReader reader=new BufferedReader(read);
String sRet = "";
String line;
while ((line = reader.readLine()) != null) {
sRet += line+"\n";
}
return sRet.trim();
}
return "";
}
/**
* 查找jar包里的匹配文件
* @param partFile
* @param fileName
* @return
*/
private static String findFileInJar(File partFile, String fileName) {
try {
JarInputStream jis = new JarInputStream(
new FileInputStream(partFile));
ZipEntry entry = jis.getNextEntry();
while (entry != null) {
if (!entry.isDirectory()) {
String path = entry.getName();
String shortFileName = path.substring(path.lastIndexOf(File.separatorChar)+1);
if (shortFileName.equals(fileName))
return partFile.getAbsolutePath() + "!"
+ entry.getName();
}
jis.closeEntry();
entry = jis.getNextEntry();
}
} catch (Exception e) {
}
return "";
}
/**
* 查找找定目录下的匹配文件
* @param dir
* @param fileName
* @return
*/
private static String findFileInDir(File dir, String fileName){
String as[] = dir.list();
for (int j = 0; j < as.length; j++) {
File next = new File("" + dir + File.separatorChar + as[j]);
if (next.isFile()) {
String path = next.getAbsolutePath();
String shortFileName = path.substring(path.lastIndexOf(File.separatorChar)+1);
if (shortFileName.equals(fileName))
return next.getAbsolutePath();
} else {
String str = findFileInDir(next, fileName);
if(!StringUtil.isEmpty(str))
return str;
}
}
return "";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -