由于每一次写系统都要自己创建不同的菜单,即构建菜单树,非常繁琐,于是为了一劳永逸,写了一个生成菜单树模板的小插件,通过往数据库表里增加数据就可以动态创建菜单树,并在前端展示
一:引入依赖
依赖引入:(需自己把jar包加入到自己的Maven本地仓库中,该依赖暂未上传到中央仓库)
<dependency>
<groupId>org.menubuilder</groupId>
<artifactId>menubuilder</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
二:数据库表与实体类
/**
* 菜单项实体
* @author
*
*/
public class MenuItem {
//菜单id
private int menuId;
//菜单名
private String menuName;
//创建人
private String createBy;
//更新人
private String updateBy;
//更新时间
private Date updateTime;
//创建时间
private Date createTime;
//权限等级
private int privilege;
//是否展示
private int isShow;
//菜单类型(一级带单,二级菜单....)
private int menuType;
//目标地址
private String url;
//父菜单id
private int parentId;
//主题
private String theme;
//菜单标识(唯一)
private String remark;
三:使用
(1)直接使用
通过创建MenuBuilder实例,调用buildMenuTree(List<MenuItem>originalMenuList)即可创建出一棵具有层级结构的菜单树
//示例: MenuBuilder builder = new MenuBuilder(); List<MenuItem> menu = builder.buildMenuTree(originalMenuList)
(2)扩展使用
通过自定义类继承MenuBuilder,直接使用默认的逻辑构建菜单树,并且重写MenuBuilder的增加,修改,删除菜单项等方法,也可以通过实现IMenuBuilder接口调用并实现接口方法(推荐使用自定义接口继承IMenuBuilder接口)
MenuBuilder只提供菜单树的构建,不提供菜单项的增加,修改,删除的逻辑,可由使用者自定义实现//示例:(本示例是基于Spring框架) /* * 自定义业务层 菜单Service接口,自定义接口继承IMenuBuilder接口 */ public interface MenuService extends IMenuBuilder{ } /* * * 业务层 菜单实现类 */ @Service public class MenuServiceImpl extends MenuBuilder implements MenuService{ @Autowired private MenuMapper menuMapper; //使用原本逻辑实现接口方法buildMenuTree() @Override public List<MenuItem> buildMenuTree() { // TODO Auto-generated method stub List<MenuItem> originalMenuList = menuMapper.selectAllMenuItem(); List<MenuItem> topMenu = buildMenuTree(originalMenuList); return topMenu; } /** * 前端交互 Controller * @author Administrator * */ @Controller public class MenuController { @Autowired private MenuService menuService; @RequestMapping("/buildTree") public String BuildTree(HttpSession session) { List<MenuItem> menu = menuService.buildMenuTree(); session.setAttribute("menu", menu); return "Menu"; }
四:自定义
(1)通过接口继承IMenuBuilder接口或自定义类实现IMenuBuilder接口,实现接口方法即可
接口方法包括:buildMenuTree()生成菜单树,addMenuItem(MenuItem menuItem)添加菜单等
(2)通过继承IMenuBuilder的实现类MenuBilder,重写该父类方法即可
父类方法包括:builderMenuTree()以及buildMenuTree(List<MenuItem> orginalMenuList)生成菜单树,addMenuItem(MenuItem menuItem)添加菜单项等
五:API
/** * 自定义菜单树生成方法 * * @return */ public List<MenuItem> buildMenuTree(); /** * MenuBuilder默认实现的生成菜单树的方法 * @param orginalMenuList 从数据库中获取的所有合法的菜单项,该集合的数据需要从按照菜单项类型 * 升序排序 * @return 顶级菜单项 */ public default List<MenuItem> buildMenuTree(List<MenuItem> orginalMenuList) { return null; } /** * 增加菜单项 * @param menuItem 增加的菜单项 * @return 操作结果 */ public default boolean addMenuItem(MenuItem menuItem) { return false; } /** * 通过菜单id修改菜单项 * @param MenuId 菜单id * @return 操作结果 */ public default boolean updateMenuItem(MenuItem menuItem) { return false; } /** * 通过菜单id删除菜单项 * @param MenuId 菜单id * @return 操作结果 */ public default boolean deleteMenuItem(int MenuId) { return false; }
六:工具类架构
七:效果图(基于Bootstrap框架)