<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://www.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
    大撒旦撒倒薩倒薩  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品国产手机| 亚洲高清美女一区二区三区| 国产亚洲蜜芽精品久久| 国产精品四虎在线观看免费| 亚洲AV无码男人的天堂 | 8x网站免费入口在线观看| 亚洲国产精品无码久久SM| 可以免费观看的毛片| 久久久久亚洲AV片无码下载蜜桃| 91大神免费观看| 一本天堂ⅴ无码亚洲道久久| 日韩视频免费在线| 免费一级毛片在线播放视频免费观看永久 | www国产亚洲精品久久久| free哆拍拍免费永久视频| 亚洲中文字幕无码日韩| 无码人妻精品中文字幕免费| 亚洲福利视频网址| 成人免费视频88| 一级一级毛片免费播放| 亚洲午夜未满十八勿入| 性一交一乱一视频免费看| 成年大片免费视频播放一级| 久久香蕉国产线看观看亚洲片| 国产电影午夜成年免费视频| 亚洲AV无码国产剧情| 亚洲线精品一区二区三区| 曰批视频免费30分钟成人| 美女免费视频一区二区三区| 久久精品国产69国产精品亚洲| 亚洲电影在线免费观看| 国产亚洲福利精品一区二区| 亚洲AV午夜福利精品一区二区| 99久久免费国产精品特黄| 成年大片免费高清在线看黄| 337p欧洲亚洲大胆艺术| 国产精品公开免费视频| 久久香蕉国产线看免费| 男人的天堂av亚洲一区2区| 亚洲2022国产成人精品无码区| 永久免费bbbbbb视频|