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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    樹形組織結構圖

    第一、組織結構預覽如下圖:

     第二、功能說明:

    當鼠標點擊左邊某組織時,會把該組織下的所有成員添加到右邊(排重);

    當鼠標點擊左邊某成員時,會把該成員添加到右邊(排重);

    當鼠標點擊"全選"時,會把所有組織的成員添加到右邊(排重);

    當鼠標點擊"移除"時,會把右側被選中的成員移除;

    第三、java script代碼實現如下:

    //添加成員
        function addUser(id, name) {
            var oOption = document.createElement("OPTION");
            oOption.text = name;
            oOption.value = id;
            var oSelect = window.parent.document.getElementById("groupdest");
            if (!checkById(id, name)) {
                oSelect.add(oOption);
            } 
        }

    //添加組織
        function addGroup(id, ids, names) {
            if (ids == "") {
                return;
            }
            var idArr = ids.split(",");
            var nameArr = names.split(",");
            var len = idArr.length;
            for (var i = 0; i < len - 1; i ++) {
                addUser(idArr[i], nameArr[i]);
            }
        }

    //檢查是否已經添加過
        function checkById(id, name) {
            var oSelect = window.parent.document.getElementById("groupdest");
            var bContains = false;
            for (var i = 0; i < oSelect.length; i++) {
                if (oSelect.options[i].value == id || oSelect.options[i].text == name) {
                    bContains = true;
                }
            }
            return bContains;
        }

    //移除用戶

    function removeUser() {
            var oSelect = document.getElementById("groupdest");
            for (var i = 0; i < oSelect.length; i++) {
                var option = oSelect.options[i];
                if (option.selected == true) {
                    oSelect.remove(i);
                    return;
                }
            }
        }

    第四:樹狀組織結構圖的MzTreeView-1.0動態實現的Table

    /**
     *
     */
    package com.daniel.lr.crbt.share.db;

    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Table;

    import org.hibernate.validator.Pattern;

    /**
     * @author Daniel Cao
     * @date   2007-4-27
     * @time   下午10:47:59
     *
     * 樹狀菜單(Menu)數據庫定義.
     * 利用MzTreeView1.0生成.
     * 每個字段值中不可有冒號,不可以換行,
     * 引號酌情考慮應不與節點字符串的引號相沖突
     *
     */
    @Entity
    @Table(name="sys_menu")
    public class Menu extends HibernateObject {
     private static final long serialVersionUID = 9135605811004668162L;
     //父節點ID,若已經是根節點則為0
     private Long   parentId;
     //節點顯示文本,根節點可空,表示不顯示
     private String text;
     //節點提示說明
     private String hint;
     //節點的圖標,對應的名字在類里的icons和iconsExpand定義,這里表示圖片的名稱pic.gif;picopen.gif格式
     private String icon;
     //節點掛的數據,如param=value&param=value,url里?后的那串字符串格式
     private String data;
     //節點的鏈接,它為空或者為#時,這個節點的鏈接,點擊將無反應
     private String url;
     //每個節點的鏈接允許在不同的target里打開,為空時取類里的默認值
     private String target;
     //點擊該鏈接時所想觸發的腳本語句
     private String method;
     
     @Column(name="menu_data")
     @Pattern(regex="[^:\n\r]+")
     public String getData() {
      return data;
     }
     public void setData(String data) {
      this.data = data;
     }
     @Column(name="menu_hint")
     @Pattern(regex="[^:\n\r]+")
     public String getHint() {
      return hint;
     }
     public void setHint(String hint) {
      this.hint = hint;
     }
     @Column(name="menu_icon")
     @Pattern(regex="[^:\n\r]+")
     public String getIcon() {
      return icon;
     }
     public void setIcon(String icon) {
      this.icon = icon;
     }
     @Column(name="menu_method")
     @Pattern(regex="[^:\n\r]+")
     public String getMethod() {
      return method;
     }
     public void setMethod(String method) {
      this.method = method;
     }
     @Column(name="menu_parent_id")
     @Pattern(regex="[^:\n\r]+")
     public Long getParentId() {
      return parentId;
     }
     public void setParentId(Long parentId) {
      this.parentId = parentId;
     }
     @Column(name="menu_target")
     @Pattern(regex="[^:\n\r]+")
     public String getTarget() {
      return target;
     }
     public void setTarget(String target) {
      this.target = target;
     }
     @Column(name="menu_text",nullable=false)
     @Pattern(regex="[^:\n\r]+")
     public String getText() {
      return text;
     }
     public void setText(String text) {
      this.text = text;
     }
     @Column(name="menu_url")
     @Pattern(regex="[^:\n\r]+")
     public String getUrl() {
      return url;
     }
     public void setUrl(String url) {
      this.url = url;
     }
    }

    /**
     *
     */
    package com.daniel.lr.crbt.share.db;

    import java.io.Serializable;
    import java.util.Date;

    import javax.persistence.Column;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.MappedSuperclass;

    /**
     * @author Dianel Cao
     * @date   2007-4-18
     * @time   下午02:43:34
     *
     */
    @MappedSuperclass
    public abstract class HibernateObject implements Serializable {
     private Long   id;  //id主鍵值
     private String name;  //名稱,備用字段
     private String status;  //status,備用字段
     private String memo;  //memo,備用字段
     private String createUser;  //創建者,備用字段
     private Date   createTime;  //創建日期,備用字段
     private Date   lastUpdateTime;  //更新日期,備用字段
     
     @Id@GeneratedValue(strategy=GenerationType.IDENTITY)
     public Long getId() {
      return id;
     }
     public void setId(Long id) {
      this.id = id;
     }
     @Column(name="name",length=60)
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     @Column(name="status",length=10)
     public String getStatus() {
      return status;
     }
     public void setStatus(String status) {
      this.status = status;
     }
     @Column(name="memo")
     public String getMemo() {
      return memo;
     }
     public void setMemo(String memo) {
      this.memo = memo;
     }
     @Column(updatable=true,name="createUser",nullable=true,length=60)
     public String getCreateUser() {
      return createUser;
     }
     public void setCreateUser(String createUser) {
      this.createUser = createUser;
     }
     @Column(updatable=false,name="createTime",nullable=false)
     public Date getCreateTime() {
      return createTime;
     }
     public void setCreateTime(Date createTime) {
      this.createTime = createTime;
     }
     @Column(name="lastUpdateTime")
     public Date getLastUpdateTime() {
      return lastUpdateTime;
     }
     public void setLastUpdateTime(Date lastUpdateTime) {
      this.lastUpdateTime = lastUpdateTime;
     }
    }

    第五、動態樹狀組織結構的Taglib實現:

    /**
     *
     */
    package com.daniel.lr.crbt.service.web.taglib;

    import java.io.IOException;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;

    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.JspWriter;
    import javax.servlet.jsp.tagext.Tag;
    import javax.servlet.jsp.tagext.TagSupport;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import com.daniel.lr.crbt.share.db.Menu;

    /**
     * @author Daniel Cao
     * @date 2007-4-27
     * @time 下午11:51:09
     *
     */
    public class TreeMenuTag extends TagSupport {
     private static final long serialVersionUID = -4747559965295669957L;
     protected Log logger = LogFactory.getLog(TreeMenuTag.class);
     // 菜單數據
     private Collection<Menu> menuCollection;
     // 樹節點的圖標存放位置路徑,可以是相對路徑或絕對路徑
     private String imagePath = "images/";
     // 點擊節點時,默認跳轉的Url
     private String defaultUrl = "#";
     // 點擊節點時,打開的默認位置,可以是_top,_self,_parent,某一頁面Name等
     private String defaultTegart = "_self";

     @Override
     public int doEndTag() throws JspException {
      try {
       JspWriter out = this.pageContext.getOut();
       out.write(buildTreeMenu(menuCollection));
      } catch (IOException ioe) {
       logger.error("輸出自定義標簽時錯誤.", ioe);
       throw new JspException("輸出自定義標簽時錯誤.");
      } catch (Exception e) {
       logger.error("創建自定義標簽時錯誤.", e);
       throw new JspException("創建自定義標簽時錯誤.");
      }
      return Tag.EVAL_PAGE;
     }

     @Override
     public int doStartTag() throws JspException {
      return Tag.SKIP_BODY;
     }

     @Override
     public void release() {
      menuCollection = null;
      super.release();
     }
     
     private String buildIcons(Collection<Menu> menuCollection) throws Exception{
      StringBuilder sb = new StringBuilder("");
      
      List<String> iconList = new ArrayList<String>();
      for (Menu menu : menuCollection) {
       String icon = menu.getIcon();
       if (icon == null || icon.trim().equals("") || icon.trim().equals(";")){
        continue;
       }
       if (icon.indexOf(";") == 0) {//只有打開圖標不符合,用默認圖標
        continue;
       }else if (icon.indexOf(";") == icon.length() - 1) {
        String iconname = icon.substring(0, icon.length() - 1);
        String iconname1 = iconname.split("file://.")[0/];
        if (!iconList.contains(iconname)) {
         sb.append("tree.icons[\"");
         sb.append(iconname1);
         sb.append("\"] = \"");
         sb.append(iconname);
         sb.append("\";\n");
         
         iconList.add(iconname1);
        }
       }else{
        String[] icons = icon.trim().split(";");
        String name0 = icons[0].split("file://.")[0/];
        if (!iconList.contains(name0)) {
         sb.append("tree.icons[\"");
         sb.append(name0);
         sb.append("\"] = \"");
         sb.append(icons[0]);
         sb.append("\";\n");
         sb.append("tree.iconsExpand[\"");
         sb.append(name0);
         sb.append("\"] = \"");
         sb.append(icons[1]);
         sb.append("\";\n");

         iconList.add(name0);
        }
       }
      }
      
      return sb.toString();
     }

     private String buildTreeMenu(Collection<Menu> menuCollection) throws Exception {
      StringBuilder sb = new StringBuilder("");
      sb.append("<script language=\"JavaScript\">\n");
      sb.append("var tree = new MzTreeView(\"tree\");\n");
      //以下三步不能換位置
      //1,創建自定義圖標庫
      sb.append(buildIcons(menuCollection));
      //2,設定圖標庫路徑
      sb.append("tree.setIconPath(\"");
      sb.append(imagePath);
      sb.append("\"); \n");
      //3,設定節點屬性
      for (Menu menu : menuCollection) {
       String nodeInfo = "";
       String text = menu.getText();
       if (text != null && !text.equals("")) {
        nodeInfo += "text:" + text + ";";
       }
       Long id = menu.getId();
       Long pId = menu.getParentId();
       String hint = menu.getHint();
       if (hint != null && !hint.equals("")) {
        nodeInfo += "hint:" + hint + ";";
       }
       String icon = menu.getIcon();
       if (icon != null && !icon.trim().equals("") && icon.trim().length() > 1) {
        if (icon.indexOf(";") == 0) {//只有打開圖標不符合,用默認圖標
         continue;
        } else if (icon.indexOf(";") == icon.length() - 1) {
         String iconname = icon.substring(0, icon.length() - 1);
         String iconname1 = iconname.split("file://.")[0/];
         nodeInfo += "icon:" + iconname1 + ";";
        } else {
         String[] icons = icon.trim().split(";");
         String name0 = icons[0].split("file://.")[0/];
         nodeInfo += "icon:" + name0 + ";";
        }
       }
       String data = menu.getData();
       if (data != null && !data.trim().equals("")){
        nodeInfo += "data:" + data + ";\n";
       }else{
        nodeInfo += "data:id=" + id + "&name=" + URLEncoder.encode(text,"utf-8") + ";";
       }
       String url = menu.getUrl();
       if (url != null && !url.trim().equals("")){
        nodeInfo += "url:" + url + ";";
       }
       String target = menu.getTarget();
       if (target != null && !target.trim().equals("")){
        nodeInfo += "target:" + target + ";";
       }
       String method = menu.getMethod();
       if (method !=null && !method.trim().equals("")){
        String methodName = method.split("file://(")[0/];
        if (methodName.indexOf("javascript:") == -1){
         methodName = "javascript:" + methodName;
        }
        if (method != null && !method.trim().equals("")){
         nodeInfo += "method:" + methodName + "(" + id + ",'" + text + "');";
        }
       }
       nodeInfo += "\";";
       
       sb.append("tree.nodes[\"");
       sb.append(pId);
       sb.append("_");
       sb.append(id);
       sb.append("\"] = \"");
       sb.append(nodeInfo);
       sb.append("\n");
      }
      sb.append("tree.setURL(\"");
      sb.append(defaultUrl);
      sb.append("\");\n");
      sb.append("tree.setTarget(\"");
      sb.append(defaultTegart);
      sb.append("\");\n");
      sb.append("document.write(tree.toString());\n");
      sb.append("</script>\n");

      return sb.toString();
     }

     public String getDefaultTegart() {
      return defaultTegart;
     }

     public void setDefaultTegart(String defaultTegart) {
      this.defaultTegart = defaultTegart;
     }

     public String getDefaultUrl() {
      return defaultUrl;
     }

     public void setDefaultUrl(String defaultUrl) {
      this.defaultUrl = defaultUrl;
     }

     public String getImagePath() {
      return imagePath;
     }

     public void setImagePath(String imagePath) {
      this.imagePath = imagePath;
     }

     public Collection<Menu> getMenuCollection() {
      return menuCollection;
     }

     public void setMenuCollection(Collection<Menu> menuCollection) {
      this.menuCollection = menuCollection;
     }
    }



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1611914

    posted on 2007-10-09 08:51 蘆葦 閱讀(4218) 評論(1)  編輯  收藏 所屬分類: JAVA

    Feedback

    # re: 樹形組織結構圖 2009-06-29 10:35 瑜伽館
    有沒有全部的代碼,直接下載或能查看全部代碼的?
    這樣看不懂哦  回復  更多評論
      

    主站蜘蛛池模板: 日韩亚洲翔田千里在线| 亚洲成a人片在线观看中文动漫 | 日本成年免费网站| 亚洲2022国产成人精品无码区| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 在线综合亚洲欧洲综合网站| 91精品国产免费久久久久久青草| 亚洲欧洲精品久久| 免费黄色网址网站| 亚洲国产系列一区二区三区| 美女被免费视频网站a国产| 亚洲gay片在线gv网站| 国产jizzjizz免费看jizz| 美女羞羞喷液视频免费| 亚洲A丁香五香天堂网| 久久99精品免费一区二区| 亚洲AV无码精品色午夜果冻不卡| 最新亚洲成av人免费看| 亚洲人成7777| 亚洲AV无码乱码在线观看| 一级特黄a免费大片| 国产亚洲AV手机在线观看| 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲av福利无码无一区二区| 久久国产精品免费视频| 亚洲人成电影在线观看青青| 永久黄网站色视频免费直播| 免费无码午夜福利片69| 亚洲精品国产精品乱码不99| 免费看男女下面日出水来| 国产成人亚洲精品无码AV大片| 丁香亚洲综合五月天婷婷| 国产在线19禁免费观看国产| 国产成人1024精品免费| 中文字幕亚洲综合久久| 日本午夜免费福利视频| 成人免费区一区二区三区| 亚洲av无码专区在线| 亚洲视频在线免费| 最近2019中文字幕免费直播 | 久久一区二区免费播放|