近期工作總結:
最近接觸的是內蒙古移動渠道後臺管理系統的一個項目,該項目已經上線。
我負責的內容只是優化他的一個樹結構的回顯。
該樹一共有7個跟節點,原方式是在前臺頁面去遞歸然後去查詢接口,這種方式我之前基本就沒見過
也沒想到他會是這麼一個邏輯。他包含子節點的節點一共90多個,然後一次點擊事件,展開這個樹接口被調用了90多次。。。sql語句發了n條。
然後他有一個庫是保存所有節點的庫,另外一個庫是保存已經選中節點的庫。這樣他兩個庫數據還需要去比對。
我是通過Map去做的,提高了效率。我一次查詢所有的。然後直接返回整個樹結構,這樣以後加入redis也方便,比查好幾次更方便用緩存。
// 構建ComboTree
private ComboTree myComboTree(Object obj, ComboTreeModel comboTreeModel, Set inIDs) {
ComboTree tree = new ComboTree();
Map attributes = new HashMap();
ReflectHelper reflectHelper = new ReflectHelper(obj);
String id = oConvertUtils.getString(reflectHelper.getMethodValue(comboTreeModel.getIdField()));
tree.setId(id);
tree.setPid(oConvertUtils.getString(reflectHelper.getMethodValue("這裏定義pid")));
tree.setText(oConvertUtils.getString(reflectHelper.getMethodValue(comboTreeModel.getTextField())));
if (comboTreeModel.getSrcField() != null) {
attributes.put("href", oConvertUtils.getString(reflectHelper.getMethodValue(comboTreeModel.getSrcField())));
tree.setAttributes(attributes);
}
if (inIDs == null) {
} else {
if (inIDs.size() > 0) {
boolean add = inIDs.add(id);//爲true 添加成功了,則說明該節點沒有在被選中;爲false則說明已經被選中了
if (!add) {
tree.setChecked(true);
}
}
}
return tree;
}
Set pIds = new HashSet();
Map> pIdMap = new HashMap>();
private void abc(ComboTree comboTree, Map> pIdMap) {
if (pIdMap.get(comboTree.getId()) != null) {
comboTree.setChildren(pIdMap.get(comboTree.getId()));
if (pIdMap.get(comboTree.getId()) != null) {
for (ComboTree tree : pIdMap.get(comboTree.getId())) {
abc(tree, pIdMap);
}
}
}
}
for (Object obj : all) {
ComboTree comboTree = new ComboTree();
comboTree = myComboTree(obj, comboTreeModel, inIDs);
if (comboTree.getPid = null) {
trees.add(comboTree);
} else {
boolean add = pIds.add(comboTree.getPid);
if (add) {//如果pId添加進去了則說明第一次
pIdMap.put(comboTree.getPid, new ArrayList());
} else {//否則這個pId之前就已經被添加過了
pIdMap.put(comboTree, pIdMap.get(comboTree.getPid).add(comboTree));
}
}
}