空間站

          北極心空

            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 蘆葦 閱讀(4221) 評論(1)  編輯  收藏 所屬分類: JAVA

          Feedback

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

          主站蜘蛛池模板: 合江县| 泰安市| 依安县| 清河县| 绥滨县| 绥德县| 临沂市| 科技| 平和县| 云南省| 鱼台县| 军事| 通化县| 新建县| 林州市| 宁远县| 陇川县| 湘西| 宁夏| 上犹县| 东安县| 吉安市| 襄城县| 垦利县| 惠安县| 尚义县| 宁强县| 韶关市| 金山区| 甘孜| 浏阳市| 关岭| 泗水县| 南郑县| 锦州市| 蒙自县| 鄂托克旗| 湘阴县| 斗六市| 定远县| 安陆市|