数据源为XML,因此放便扩展。
废话不多说,直接上代码(因一些原因,把部分数据修改或精简了)。
XML代码:
复制代码 代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<MenuData>
<Module Permissions="49,53,58,59,65,99,100,70,69" IsExpand="true">
<Menu Permissions="49,53,58" IsExpand="true">
<Item Permissions="49" IsOnlyVip="true" Url="Business/ProList.aspx" Title="预订单"/>
<Item Permissions="53" IsOnlyVip="true" Url="Business/List.aspx" Title="在订单"/>
<Item Permissions="58" IsOnlyVip="true" Url="Business/RList.aspx" Title="订单历史"/>
</Menu>
<Menu Permissions="59" IsExpand="true">
<Item Permissions="59" Url="Client/List.aspx" Title="客户列表"/>
</Menu>
<Menu Permissions="65,99,100" IsExpand="true">
<Item Permissions="65" IsOnlyVip="true" Url="Report/Finance.aspx" Title="收入统计"/>
<Item Permissions="99" IsOnlyVip="true" Url="Report/Product.aspx" Title="产品统计"/>
<Item Permissions="100" IsOnlyVip="true" Url="Report/Client.aspx" Title="客户统计"/>
</Menu>
<Menu Permissions="70,69" IsExpand="true">
<Item Permissions="70" Url="" Title="发送站内消息" EventScript="onclick='OpenMsgWindow()'" />
<Item Permissions="69" Url="Message/RList.aspx" Title="消息接收列表"/>
<Item Permissions="69" Url="Message/SList.aspx" Title="消息发送列表"/>
</Menu>
</Module>
<Module Permissions="89,90" EventScript="OpenTuiGuangIndex();" >
<Menu Permissions="89" Url="TuiGuang/Product.aspx" Title="产品推广"/>
<Menu Permissions="90" Url="TuiGuang/Ad.aspx" Title="广告推广"/>
</Module>
<Module Permissions="67,68">
<Menu Permissions="67" Url="SysManage/Password.aspx" Title="更改系统密码"/>
<Menu Permissions="68" Url="SysManage/Config.aspx" Title="系统配置"/>
</Module>
<Module Permissions="" IsUnVip="true">
<Menu Url="VIP/index.html" Title="会员服务"/>
</Module>
</MenuData>
程序代码:
复制代码 代码如下:
using System.Text;
using System.Collections;
using System.Xml;
using System.Web;
using System;
/// <summary>
/// CreateTree 的摘要说明
/// </summary>
public class MenuTree
{
int index = 0;//菜单栏目ID索引
private ArrayList havePermission = new ArrayList();
private bool isVip = false;
/// <summary>
/// 登录用户所拥有的权限
/// </summary>
private ArrayList HavePermissions
{
get { return havePermission; }
set { havePermission = value; }
}
/// <summary>
/// 登录用户是否是VIP
/// </summary>
private bool IsVip
{
get { return isVip; }
set { isVip = value; }
}
/// <summary>
/// 登录用户所拥有的权限 是否为VIP用户
/// </summary>
/// <param></param>
/// <param></param>
public MenuTree(ArrayList havePermission, bool isVip)
{
this.HavePermissions = havePermission;
this.IsVip = isVip;
}
/// <summary>
/// 绑定树
/// </summary>
public string BindDataToTree()
{
System.Xml.XmlDocument document = new System.Xml.XmlDataDocument();
document.Load(HttpContext.Current.Server.MapPath("MenuData.xml"));
return CreateTreeHtml(document.DocumentElement, 0);
}
/// <summary>
/// 创建栏目树
/// </summary>
/// <param>xml节点</param>
/// <param>树深度</param>
private string CreateTreeHtml(System.Xml.XmlNode document, int deep)
{
string nodeType = "Menu";//节点的类型,来生成子节点的CSS类型
StringBuilder treeHtml = new StringBuilder();
foreach (System.Xml.XmlNode node in document.ChildNodes)
{
string menuId = string.Empty;
string treeNodeHtml = string.Empty;
string nodeName = node.Name;
string showName = GetAttributesValue(node.Attributes["Name"]);//显示栏目名
string nodeId = GetAttributesValue(node.Attributes["Id"]);//栏目ID
bool isExpand = GetAttributesValue(node.Attributes["IsExpand"]).ToLower().Trim() == "true" ? true : false;//是否展开
string permissions = GetAttributesValue(node.Attributes["Permissions"]);//权限字串
bool isOnlyVip = GetAttributesValue(node.Attributes["IsOnlyVip"]).ToLower().Trim() == "true" ? true : false;//是否只允许VIP访问
bool isUnVip = GetAttributesValue(node.Attributes["IsUnVip"]).ToLower().Trim() == "true" ? true : false;//是否只准非VIP访问
string eventScript = GetAttributesValue(node.Attributes["EventScript"]);//事件脚本
int chlidNodesCount = node.ChildNodes.Count;//子节点数
bool isPermissions = GetIsPermissions(permissions);//是否有权限
if (!isPermissions)
{
continue; //如果没有权限,不生成此节点
}
if (nodeName == "Module")
{
if (isUnVip && IsVip)
{
continue;//如果为VIP会员 设为不允许访问子栏目
}
menuId = GetMenuId(nodeId);
treeHtml.AppendFormat("<div onselectstart='return false;'>", menuId, eventScript);
treeHtml.Append(" <img src='https://www.jb51.net/images/sideMenuIcon.gif' alt='' /> ");
treeHtml.AppendFormat("<span>{0}</span>", showName);
treeHtml.Append("</div>");
deep = 0;
nodeType = "Module";
}
else
{
treeHtml.Append("<table cellpadding='0' cellspacing='0'>");
treeHtml.Append("<tr>");
for (int i = 0; i < deep; i++)
{
if (i == deep - 1)
{
treeHtml.Append("<td>");
if (chlidNodesCount > 0)
{
menuId = GetMenuId(nodeId);
treeHtml.AppendFormat("<a href='javascript:;'><img src='https://www.jb51.net/Images/{1}.gif' alt=''/></a>", menuId, (isExpand ? "open-menu" : "close-menu"));
}
else
{
treeHtml.Append("<img src='https://www.jb51.net/Images/open-menuno.gif' alt=''/>");
}
treeHtml.Append("</td>");
}
else
{
treeHtml.Append("<td> </td>");
}
}
string url = GetAttributesValue(node.Attributes["Url"]); //链接地址
string title = GetAttributesValue(node.Attributes["Title"]);//链接TITLE信息
string menuNodeId = nodeId.Trim().Length > 0 ? "id='MenuNode" + nodeId + "'" : string.Empty;//树节点ID
treeHtml.Append("<td>");
if (url.Length > 0 || chlidNodesCount == 0)
{
if (!isOnlyVip || (isOnlyVip && IsVip))//栏目是否只为VIP开放
{
if (url.Length > 0)
{
treeHtml.AppendFormat("<a href='https://www.jb51.net/article/{0}' target='MainFrame' title='{1}' {3} {4}>{2}</a>", url, title, showName, eventScript, menuNodeId);
}
else
{
treeHtml.AppendFormat("<a href='javascript:;' target='MainFrame' title='https://www.jb51.net/article/{0}' {2} {3}>{1}</a>", title, showName, eventScript, menuNodeId);
}
}
else
{
treeHtml.AppendFormat("<a href='javascript:;' target='MainFrame' title='{1}' {3}>{2}</a>", url, title, showName, menuNodeId);
}
}
else
{
treeHtml.AppendFormat("<a href='javascript:;' title='{1}' {3} {4}>{2}</a>", menuId, title, showName, eventScript, menuNodeId);
}
treeHtml.Append("</td>");
treeHtml.Append("</tr>");
treeHtml.Append("</table>");
}
if (chlidNodesCount > 0)
{
treeNodeHtml = CreateTreeHtml(node, deep + 1);
}
if (treeNodeHtml.Length > 0)
{
treeHtml.AppendFormat("<div {1}>", menuId, (nodeType == "Module" ? "class='Menus'" : "class='MenuNodes'"), (isExpand ? "display:block;" : "display: none;"));
treeHtml.Append(treeNodeHtml);
treeHtml.Append("</div>");
}
}
return treeHtml.ToString();
}
/// <summary>
/// 取得栏目的ID
/// </summary>
private string GetMenuId(string nodeId)
{
return nodeId.Length > 0 ? nodeId : Convert.ToString(++index);
}
/// <summary>
/// 取得节点值
/// </summary>
private string GetAttributesValue(XmlAttribute attributeValue)
{
return attributeValue == null ? "" : attributeValue.Value.Trim();
}
/// <summary>
/// 是否有权限
/// </summary>
private bool GetIsPermissions(string permissions)
{
if (HavePermissions.Count == 0)
{
return false;
}
if (permissions.Length == 0)
{
return true;
}
else
{
string[] arrPermissions = permissions.Split(',');
for (int i = 0; i < arrPermissions.Length; i++)
{
if (HavePermissions.Contains(arrPermissions[i].Trim()))
{
return true;
}
}
return false;
}
}
}
相关JS代码:
复制代码 代码如下: