树形菜单构造

来源:互联网 发布:mac 照片 导出 编辑:程序博客网 时间:2024/06/01 08:05

后台管理系统的树形菜单是非常常见的一个功能,今天我就把自己工作中所写的简单代码贴一下,希望对一些网友有帮助。首先创建一个菜单数据表:

CREATE TABLE `resources` (`id` int(11) NOT NULL AUTO_INCREMENT,`parentId` int(11) DEFAULT '0' COMMENT '父ID',`name` varchar(30) NOT NULL COMMENT '菜单名称',`resourceDesc` varchar(100) NOT NULL COMMENT '描述',`resourceStr` varchar(100) DEFAULT NULL COMMENT '菜单字符串',`enabled` tinyint(1) DEFAULT NULL COMMENT '是否有效',`issys` tinyint(1) DEFAULT NULL COMMENT '是否为系统菜单',`module` varchar(20) DEFAULT '' COMMENT '模块',`icon` varchar(20) DEFAULT '' COMMENT '图标',`imgUrl` varchar(255) DEFAULT '' COMMENT '图片存储路径',`resouceType` varchar(10) NOT NULL DEFAULT 'menu' COMMENT '资源类型: menu 菜单, button 按钮', PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=283 DEFAULT CHARSET=utf8 COMMENT='后台菜单表'

----------数据表对应的实体类Resources

package com.lxh;import java.util.List;/** * 菜单 */public class Resources { private Integer id; private String name; private String resourceDesc; private String resourceStr; private String module; private Boolean enabled; private Boolean issys; private String icon; private int order; private String imgUrl; private String moduleName; private String resouceType; private Integer parentId; private Integer sortOrder; // 排列顺序 private Integer isShow; // 是否显示1显示;2隐藏 private Integer level; // 级别 private List<Resources> resources; set get 方法已省略

----------

生成菜单树的简单算

package com.lxh;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class ResourceTree { public void testQueryResourcesList(List<Resources> list) { List<Resources> rootResources = list; List<Resources> menuList = new ArrayList<Resources>(); // 先找到所有的一级菜单 for (int i = 0; i < rootResources.size(); i++) { // 一级菜单没有parentId if (rootResources.get(i).getParentId()==0) { menuList.add(rootResources.get(i)); } } // 为一级菜单设置子菜单,getChild是递归调用的 for (Resources menu : menuList) { menu.setResources(getChild(menu.getId(), rootResources)); } Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put("menu", menuList); }private List<Resources> getChild(int id, List<Resources> rootResources) { // 子菜单 List<Resources> childList = new ArrayList<>(); for (Resources menu : rootResources) { // 遍历所有节点,将父菜单id与传过来的id比较 if (menu.getParentId()!=null) { if (menu.getParentId()==id) { childList.add(menu); } } } //查找子菜单是否有子菜单 for (Resources menu : childList) { menu.setResources(getChild(menu.getId(), rootResources)); }// 递归退出条件 if (childList.size() == 0) { return null; } return childList; }}

测试工具

package com.lxh;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.mysql.jdbc.Connection;import com.mysql.jdbc.PreparedStatement;public class MysqlHelper { // 加载驱动 private final String DRIVER = "com.mysql.jdbc.Driver"; // 定义数据库账号 private final String USERNAME = "develop"; //替换 // 定义数据库密码 private final String PASSWORD = "";//需要替换 // 访问的地址 private final String URL = "jdbc:mysql://10.50.10.202:3306/hhn_user"; //需要替换 // 定义数据库的连接 private Connection connection; // 定义sql语句的执行对象 private PreparedStatement pStatement; // 定义查询返回的结果集合 private ResultSet resultset; private final static Map<String, String> purchaseMap=new HashMap<String, String>(); public MysqlHelper() { try { Class.forName(DRIVER);// 注册驱动 connection = (Connection) DriverManager.getConnection(URL, USERNAME, PASSWORD);// 定义连接 } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { MysqlHelper help = new MysqlHelper(); List<Resources> list= help.query(); new ResourceTree ().testQueryResourcesList(list); } public List<Resources> query(){ String sql = " select id,parentId,name from resources WHERE module='customer' "; PreparedStatement pstmt; List<Resources> tempList = new ArrayList<Resources>(); try { pstmt = (PreparedStatement) connection.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { Resources res = new Resources(); res.setId(rs.getInt(1)); res.setParentId(rs.getInt(2)); res.setName(rs.getString(3));tempList.add(res); } } catch (SQLException e) { e.printStackTrace(); } return tempList; } /** * 注意在finally里面执行以下方法,关闭连接 */ public void closeconnection() { if (resultset != null) { try { resultset.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (pStatement != null) { try { pStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}