2017年7月30日---階段性工作總結

近期工作總結:

最近接觸的是內蒙古移動渠道後臺管理系統的一個項目,該項目已經上線。

我負責的內容只是優化他的一個樹結構的回顯。

該樹一共有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;
    }
其中Object是你查詢到的對象,這裏也就是所有樹的節點,ComboTreeModel是你要封裝的對象模型,反射取屬性的時候用的,Set集合是
已經選中的節點id的集合。他與總節點表是有關聯的,就是他關聯屬性的set集合。

        Set pIds = new HashSet();
        Map> pIdMap = new HashMap>();
我把7個跟節點放入一個集合,把相同的pid的節點放入一個key爲string,value爲list<combotree>的集合,該集合有90多個這樣的集合。
然後我去遞歸查詢封裝整個樹。

    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));
                }
            }
        }













發佈了21 篇原創文章 · 獲贊 17 · 訪問量 8649
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章