<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    efa's blog

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

    導航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿(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://m.tkk7.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 閱讀(5824) 評論(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
    大撒旦撒倒薩倒薩  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 天堂亚洲免费视频| 国产成人精品免费直播| 亚洲VA中文字幕无码毛片| 人妻无码中文字幕免费视频蜜桃| 亚洲综合激情六月婷婷在线观看| 久久精品国产亚洲香蕉| 色播在线永久免费视频网站| 亚洲精品~无码抽插| 人与动性xxxxx免费| 久久久久亚洲精品无码网址| 91在线视频免费观看| 亚洲免费在线视频| 1000部拍拍拍18免费网站| 国产精品亚洲片在线va| 日本免费网站观看| 国产精品免费看久久久香蕉| 亚洲日本乱码在线观看| 免费不卡在线观看AV| 亚洲人成7777影视在线观看| 日本一道一区二区免费看 | 亚洲乱码在线播放| 久久福利资源网站免费看| 中文字幕精品三区无码亚洲| 免费不卡中文字幕在线| 好男人资源在线WWW免费| 亚洲av网址在线观看| 欧美日韩国产免费一区二区三区| 久久久久亚洲Av片无码v| 国拍在线精品视频免费观看| 亚洲精品亚洲人成在线| 亚洲日韩精品一区二区三区无码 | 亚洲AV无码久久精品狠狠爱浪潮| 亚洲乱色伦图片区小说| 国产成人精品曰本亚洲79ren| 亚洲熟妇无码av另类vr影视 | 成人免费看黄20分钟| 一级一级一级毛片免费毛片| 亚洲第一福利网站| 免费毛片在线看片免费丝瓜视频| 亚洲欧洲国产成人精品| 成人免费视频国产|