最近在學習權限管理, 要用到樹形按鈕, 但是字符串的拼接是一個難理解的問題, 然后從網上找了一個從前台用js來遍歷組成這個json字符串, 很好! 但是沒看懂...
var data = [ {"id":1,"parendId":0,"name":"Foods"}, {"id":2,"parentId":1,"name":"Fruits"}, {"id":3,"parentId":1,"name":"Vegetables"}, {"id":4,"parentId":2,"name":"apple"}, {"id":5,"parentId":2,"name":"orange"}, {"id":6,"parentId":3,"name":"tomato"}, {"id":7,"parentId":3,"name":"carrot"}, {"id":8,"parentId":3,"name":"cabbage"}, {"id":9,"parentId":3,"name":"potato"}, {"id":10,"parentId":3,"name":"lettuce"} ]; function exists(rows, parentId){ for(var i=0; i<rows.length; i++){ if (rows[i].id == parentId) { return true; } } return false; } function convert(rows){ var nodes = []; //取到第一級菜單 for(var i=0; i<rows.length; i++){ var row = rows[i]; if (!exists(rows, row.parentId)){ nodes.push({ id:row.id, text:row.name }); } } var toDo = []; for(var i=0; i<nodes.length; i++){ toDo.push(nodes[i]); } while(toDo.length){ var node = toDo.shift(); // the parent node //取得子菜單 for(var i=0; i<rows.length; i++){ var row = rows[i]; if (row.parentId == node.id){ var child = {id:row.id,text:row.name}; if (node.children){ node.children.push(child); } else { node.children = [child]; } toDo.push(child); } } } return nodes; } var data1 = convert(data); $('#tt').tree({ data:data1 });
下面是從后台拼接字符串
貼在這里從后台實現的方法不是一種可取的辦法, 是利用多次從數據庫取出數據進行拼接, 最后也能實現效果, 只是這個數據量太小了, 如果是企業里比較大型的項目, 這樣會占用不少電腦的性能, 從網上找的那些基本沒看懂
import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList;
import java.sql.Connection; /** * @author 25673 * @數據庫連接類 */ public class ConnectionUtil { public static Connection getConnection() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); //"jdbc:mysql://數據庫地址:3306/數據庫名","用戶名","用戶密碼" conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/quanxian","root",""); } catch (Exception e) { e.printStackTrace(); } return conn; } public static ArrayList<Menu> findMenu(String parentid) { String sql = "select * from sys_menu where parent_id = '"+parentid+"'"; Connection c = null; Statement s = null; ResultSet r = null; ArrayList<Menu> arrList = null; c = getConnection(); try { s = c.createStatement(); r = s.executeQuery(sql); arrList = new ArrayList<Menu>(); while(r.next()) { Menu menu = new Menu(); menu.setId(r.getString("id")); menu.setParentid(r.getString("parent_id")); menu.setMenuName(r.getString("menu_name")); arrList.add(menu); } } catch (Exception e) { e.printStackTrace(); } finally { try { c.close(); s.close(); r.close(); } catch (Exception e) { e.printStackTrace(); } } return arrList; } /** * @param arrList 查詢出來的所有符合條件的結果 * @param parentid 第一級菜單的parentid * @return */ public static String strJson(String parentid) { /* 每調用一次這個方法, 就要去連接一次數據庫, 總覺這樣會增加很多工作量, 因為是進行了多次查詢
這里使用了遞歸的方式 */ ArrayList<Menu> arrList = findMenu(parentid); StringBuilder sb = new StringBuilder(); for(int n = 0;n < arrList.size();n++) { sb.append("{"); sb.append("\"id\":\""+arrList.get(n).getId()+"\","); sb.append("\"text\":\""+arrList.get(n).getMenuName()+"\""); String str = strJson(arrList.get(n).getId()); if(!str.equals("")) { sb.append(",\"state\":\"closed\""); sb.append(",\"children\":["+str+"]"); } sb.append("}"); if(n < (arrList.size() - 1)) { sb.append(","); } } return sb.toString(); } }
還在繼續思考怎么從后台一次性查出所有的信息, 直接用拼接的方式組成這個字符串, 希望能有人指點一下, 謝謝