efa's blog

          以用戶角度出發(fā),你就已經(jīng)成功一半了.

          導(dǎo)航

          <2005年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          統(tǒng)計

          常用鏈接

          留言簿(18)

          我參與的團(tuán)隊

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          Bi report

          dba

          info security

          other

          perl

          php

          python

          tech blogs

          tech websites

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          無限級分類設(shè)計

          • 前言
                     無限級分類其實(shí)在很多項目中需要應(yīng)用,例如一些企業(yè)部門的分級,區(qū)域劃分及至商品類別的劃分等,數(shù)據(jù)之間是分等級存在的.結(jié)構(gòu)如下
            area name                       LEVEL 
            中國                               
            1
              華南地區(qū)                     
            2
                          廣州                 
            3   
                          廣西                 
            3
                 華東地區(qū)                     
            2
            美國                               
            1
                 北美                          
            2
                 南美                          
            2

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

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

            areatree.gif

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

          The PRIOR operator

          The 
          LEVEL pseudocolumn

          筆者另一篇未完BLOG:
                      齊來學(xué)習(xí)oracle Mastering Oracle SQL 之 Hierarchical Queries/分等級的查詢
          將會介紹到 : )
          • 業(yè)務(wù)邏輯
            1、進(jìn)行多級分類,傳統(tǒng)比較笨的辦法就是建立N多的表進(jìn)行關(guān)聯(lián),
                  例如:
                  (國家)country  1-*  (省份)province 1-* (市)city …………等等
                  然而這樣就屬于有限分級,每增加一個級別都要增加相關(guān)的表及修改N多源碼.
                  再者區(qū)域劃分并不是國家,省份,市這樣簡單的劃分能說明問題的。
            2、更優(yōu)的設(shè)計 - 自己關(guān)聯(lián)自己
                  area _no                    <-|
                  code                              
            |
                  name                             
            |
                  father_area_no 
            ---------|
                  
                  每個area都有一個father_area_no字段,關(guān)聯(lián)到其所屬區(qū)域,如無可為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    //關(guān)系
             
            order SIBLINGS by area_no                            //排序
            //////////////////////////////////////////////////////////////////////////////////////////////////
              AREA_NO CODE                 NAME            PARENT_ID      LEVEL
            ---------- -------------------- -------------- ---------- ----------
                   1 A0001                中國                              1
                   2 A0002                華南地區(qū)                      1                       2
                   3 A0002-1              廣東                            1                        3
                   4 A0002-2              廣西                            2                       3
                   5 A0002-3              福建                            2                       3
                   6 A0002-4              還是不知道的            2                        3
                   7 A0003                華東地區(qū)                     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層設(shè)計
            說明,本文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="華南地區(qū)" 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="華東地區(qū)" sId="241" action="selectThis(this)">
              </tree>
              
            </tree>
              
            </tree>
            BTW:   關(guān)于如何實(shí)現(xiàn),可參考筆者另一篇文章:
              http://www.aygfsteel.com/davidxu/archive/2005/08/18/10424.html

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

                 pretree.gif
            3、htc 編寫,作為js DOM 解析后容器 
                  有關(guān)于htc更詳細(xì)的資料請參考相關(guān)教程,如你覺得HTC并不適合,可以自己再做相關(guān)的封裝實(shí)現(xiàn)一樣的效果.
            //初始化
            <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="InitElement()" />
              // 響應(yīng)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編輯頁面中的所屬區(qū)域控件的調(diào)用
             <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="">

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

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

          評論

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

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

          # re: 無限級分類設(shè)計 2005-08-18 11:22 一天一點(diǎn)

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

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

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

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

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

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

          @hope me fly
          大撒旦撒倒薩倒薩  回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洛扎县| 奉新县| 罗江县| 黔西县| 天门市| 迁西县| 黄浦区| 阳江市| 包头市| 平湖市| 宜春市| 临江市| 通城县| 桓仁| 卢龙县| 奎屯市| 卓尼县| 汉源县| 宜宾市| 平江县| 阜新市| 武乡县| 曲松县| 合川市| 太谷县| 东兰县| 普兰店市| 筠连县| 忻州市| 灵璧县| 沧源| 遂川县| 遂宁市| 伽师县| 双城市| 南漳县| 贺州市| 武鸣县| 萨迦县| 来凤县| 利川市|