efa's blog

          以用戶角度出發,你就已經成功一半了.

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          常用鏈接

          留言簿(18)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          Bi report

          dba

          info security

          other

          perl

          php

          python

          tech blogs

          tech websites

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          無限級分類設計

          • 前言
                     無限級分類其實在很多項目中需要應用,例如一些企業部門的分級,區域劃分及至商品類別的劃分等,數據之間是分等級存在的.結構如下
            area name                       LEVEL 
            中國                               
            1
              華南地區                     
            2
                          廣州                 
            3   
                          廣西                 
            3
                 華東地區                     
            2
            美國                               
            1
                 北美                          
            2
                 南美                          
            2

            C/S開發中有很方便快捷的控件支持可以快速開發,然而在web 應用中總需要我們進行大量的設計及編碼.本文以區域(area)為例介紹web app中無限級分類設計。

            主要設計思考:
            A  DAO層返回分層次的 area  數據 
            B  jsp接收翻譯為XML格式化文件
            C  js DOM 操作格式化
            D  HTC接收格式化后的html
            E  控制綁定上HTC,響應onclick事件,進行操作
            效果圖如下:

            areatree.gif

            說明:本設計涉及到業務邏輯以及view層的設計
            oracle sql 在分等級的查詢中做到了很好的支持,關于oracle中的分等級查詢使用,如下
          The START WITH . . . CONNECT BY clause

          The PRIOR operator

          The 
          LEVEL pseudocolumn

          筆者另一篇未完BLOG:
                      齊來學習oracle Mastering Oracle SQL 之 Hierarchical Queries/分等級的查詢
          將會介紹到 : )
          • 業務邏輯
            1、進行多級分類,傳統比較笨的辦法就是建立N多的表進行關聯,
                  例如:
                  (國家)country  1-*  (省份)province 1-* (市)city …………等等
                  然而這樣就屬于有限分級,每增加一個級別都要增加相關的表及修改N多源碼.
                  再者區域劃分并不是國家,省份,市這樣簡單的劃分能說明問題的。
            2、更優的設計 - 自己關聯自己
                  area _no                    <-|
                  code                              
            |
                  name                             
            |
                  father_area_no 
            ---------|
                  
                  每個area都有一個father_area_no字段,關聯到其所屬區域,如無可為0或null
              然后使用oracle的超級等級查詢sql

            select t.*level from area t
             
            start with t.father_area_no is null             
             connect 
            by prior t.area_no = t.father_area_no    //關系
             
            order SIBLINGS by area_no                            //排序
            //////////////////////////////////////////////////////////////////////////////////////////////////
              AREA_NO CODE                 NAME            PARENT_ID      LEVEL
            ---------- -------------------- -------------- ---------- ----------
                   1 A0001                中國                              1
                   2 A0002                華南地區                      1                       2
                   3 A0002-1              廣東                            1                        3
                   4 A0002-2              廣西                            2                       3
                   5 A0002-3              福建                            2                       3
                   6 A0002-4              還是不知道的            2                        3
                   7 A0003                華東地區                     1                        2

            3、hibernate3原生sql的支持
                public List getGoodsCatalogTree()
                
            {
                    String treeSql 
            = "select {t.*}, level from area t  " +
                            
            " start with t.parent_catalog_no is null " +
                            
            " connect by prior t.goods_catalog_no = t.parent_catalog_no " +
                            
            " order SIBLINGS by goods_catalog_no";

                    
            return getSession().createSQLQuery(treeSql)
                            .addEntity(
            "t", GoodsCatalog.class)
                            .addScalar(
            "level", Hibernate.INTEGER).setParameter(0,"A:valid").list();
                }

          • VIEW層設計
            說明,本文hibernate為演示

            1、tree.jsp 接收 hibernate 返回的list并翻譯為XML格式 
                 效果如下:
             <?xml version="1.0" encoding="GBK" ?> 
            <tree>
              
            <tree text="根類別" sId="" action="selectThis(this)" /> 
            <tree text="中國" sId="221" action="selectThis(this)">
            <tree text="華南地區" sId="222" action="selectThis(this)">
              
            <tree text="廣東" sId="242" action="selectThis(this)" /> 
              
            <tree text="廣西" sId="244" action="selectThis(this)" /> 
              
            <tree text="福建" sId="245" action="selectThis(this)" /> 
              
            <tree text="還是不知道的" sId="247" action="selectThis(this)" /> 
              
            </tree>
            <tree text="華東地區" sId="241" action="selectThis(this)">
              </tree>
              
            </tree>
              
            </tree>
            BTW:   關于如何實現,可參考筆者另一篇文章:
              http://www.aygfsteel.com/davidxu/archive/2005/08/18/10424.html

            2、js DOM解析(筆者使用的是http://webfx.eae.net/ 提供的樹)

                 pretree.gif
            3、htc 編寫,作為js DOM 解析后容器 
                  有關于htc更詳細的資料請參考相關教程,如你覺得HTC并不適合,可以自己再做相關的封裝實現一樣的效果.
            //初始化
            <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="InitElement()" />
              // 響應onclick事件
            <PUBLIC:ATTACH EVENT="onclick" ONEVENT="keyDownElement()" />

            ………………
            ………………
            //
            function InitElement()
            {
             var IFRAMEsrc = "<IFRAME border=0 id='multisortTreediv' src='"+ datapage +"'></IFRAME>";
             element.document.body.insertAdjacentHTML("AfterBegin",IFRAMEsrc);
            }
            function keyDownElement()
            {
                //顯示隱藏層
            }


            4、area編輯頁面中的所屬區域控件的調用
             <input type="text" class="text" id="areaName" 
                                           
            objectId="fatherAreaNo"  
                                            name
            ="fatherArea.name"  size="48" 
                                            datapage
            ="/multi-sortTree.jsp?page=/setup/area.do?msg=getAreaTree" 
                                            style="behavior:url(/js/multi-sortTree.htc);" value="">
                               
            <input type="hidden" name="fatherArea.areaNo" id="fatherAreaNo" value="">

            后注:本文只是一種設計思想的介紹,并不提供源碼:)
            (本文完! )

          posted on 2005-08-17 14:13 一凡@ITO 閱讀(5827) 評論(5)  編輯  收藏

          評論

          # re: 無限級分類設計 2005-08-18 09:51 hope

          老大能不能說說怎么有數據庫聲稱xml呢 給各類 讓我學習學習好么?
          還有個問題 我用xml樹發現刷新有點問題 就是我選擇一個節點顯示頁面 然后進行數據提交或者更新什么的 然后去別的頁面 最后通過節點回來發現 頁面沒有刷新 也就是沒有顯示更新過的數據 這個怎么解決阿  回復  更多評論   

          # re: 無限級分類設計 2005-08-18 11:22 一天一點

          1、"數據庫聲稱xml" 應該是數據庫生成XML吧?
          這個問題等下班再寫。比較復雜的東東
          2、“頁面沒有刷新”首先要確認數據庫是否真的變化了。確認后沒變化考慮一下是否緩存的問題,可以在meta內定義no-cache
          <meta http-equiv=Expires content=0>
          <meta http-equiv=Pragma content=no-cache>
          <meta http-equiv=Cache-Control content=no-cache>
            回復  更多評論   

          # re: 無限級分類設計 2005-08-18 12:35 hope

          老大謝謝你回答我的問題 期待你對生成xml的文章 呵呵 還有就是老大做過通過java寫入word文件么我最近要做個這個東西 老大說的方法我現在去試驗一下 呵呵  回復  更多評論   

          # re: 無限級分類設計 2005-08-30 12:22 hope me fly

          為什么不提供源碼阿,給啦  回復  更多評論   

          # re: 無限級分類設計 2014-01-07 10:56 ##

          @hope me fly
          大撒旦撒倒薩倒薩  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 麻江县| 翁源县| 泊头市| 健康| 博罗县| 安溪县| 休宁县| 新宾| 莆田市| 科尔| 湖口县| 修武县| 高平市| 芦山县| 莫力| 台东市| 临海市| 驻马店市| 紫阳县| 南木林县| 时尚| 兰州市| 柞水县| 南宁市| 潮州市| 新干县| 阿拉善右旗| 广元市| 平度市| 焉耆| 沙雅县| 苍溪县| 绵竹市| 北宁市| 甘肃省| 达拉特旗| 布尔津县| 中牟县| 香格里拉县| 象山县| 花垣县|