菜单的动态维护问题(菜单从数据库中读出),解决了另开帖加200分

csdn_search 2003-10-15 11:05:15
1
1_1
1_1_1
2
2_1
2_1_1
大家注意一下,我要实现这样功能:
1、1_1、1_1_1,2、2_1、2_1_1,这些菜单都是从数据库中读出,动态维护的,那我要问的是后台该怎么实现动态维护呢,比如:我要在2_1_1下增加子菜单和子菜单连接的页面,而且这写信息都要写入数据库。


我的数据库表:
菜单名称
父菜单
本级菜单位置
菜单连接
我的数据库表描述的是:树的概念(不知道大家是否了解了)
...全文
46 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_search 2003-10-20
  • 打赏
  • 举报
回复
以上回答的问题,莫名其妙!
xxrl 2003-10-17
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/read_article.asp?id=20679
yipanchen 2003-10-17
  • 打赏
  • 举报
回复
markup!
zhouguoyao 2003-10-16
  • 打赏
  • 举报
回复
<script LANGUAGE="JavaScript">
<!--
//每个节点有一个数组,包含 4+n个元素
// node[0]为0/1 对应节点的展开/关闭
// node[1]为0/1 对应文件夹的关闭/展开
// node[2]为1 如果节点的子节点是文档
// node[3]是节点的名称
// node[4]...node[4+n]为n个子节点

// 初始化菜单的数据

function generateTree()
{
//var aux1, aux2, aux3, aux4
var aux
aux=new Array

foldersTree = folderNode("我的网站")
<%
//menu_id,menu_name,parent_menu_id,folder_or_file,menu_location
String sql="select * from tree_menu ";
ResultSet RS;
RS=executeQuery(sql);
try
{

while(RS.next())
{
String foldersTree;
int id=RS.getInt("menu_id");
int loc=RS.getInt("menu_location");
int parent=RS.getInt("parent_menu_id");
int folder_or_file=RS.getInt("folder_or_file");
if(loc==1){
foldersTree="foldersTree";
}else{
//foldersTree="aux"+(int)(loc-1);
foldersTree="aux["+parent+"]";
}

out.println("aux["+id+"]"+" = appendChild("+foldersTree+", folderNode('<a href=main.jsp?menuid="+id+"&loc="+loc+" target=folderFrame>"+RS.getString("menu_name")+"</a>'));");

}

}
catch(Exception e)
{
out.println(e.toString());
}
%>

}

// 创建节点的辅助函数
function folderNode(name)
{
var arrayAux
arrayAux = new Array
arrayAux[0] = 0
arrayAux[1] = 0
arrayAux[2] = 0
arrayAux[3] = name

return arrayAux
}
function leafNode(name)
{
var arrayAux
arrayAux = new Array
arrayAux[0] = 0
arrayAux[1] = 0
arrayAux[2] = 1
arrayAux[3] = name

return arrayAux
}

function appendChild(parent, child)
{
parent[parent.length] = child
return child
}

function generateDocEntry(icon, docDescription, link)
{
var retString =""

if (icon==0)
retString = "<A href='"+link+"' target=folderFrame><img src='doc.gif' alt='在右边框架中打开'"
else
retString = "<A href='"+link+"' target=_blank><img src='link.gif' alt='在新窗口中打开'"
retString = retString + " border=0></a><td nowrap><font style='font-size:9pt;font-family:宋体'>" + docDescription + "</font>"

return retString

}


//刷新树状菜单
function redrawTree()
{
var doc = top.treeFrame.window.document

doc.clear()
doc.write("<body bgcolor='white'>")
redrawNode(foldersTree, doc, 0, 1, "")
doc.close()
}

function redrawNode(foldersNode, doc, level, lastNode, leftSide)
{
var j=0
var i=0

doc.write("<table border=0 cellspacing=0 cellpadding=0>")
doc.write("<tr><td valign = middle nowrap>")

doc.write(leftSide)

if (level>0)
if (lastNode) //'brother'子节点数组中有否兄弟节点
{
doc.write("<img src='lastnode.gif' width=16 height=22>")
leftSide = leftSide + "<img src='blank.gif' width=16 height=22>"
}
else
{
doc.write("<img src='node.gif' width=16 height=22>")
leftSide = leftSide + "<img src='vertline.gif' width=16 height=22>"
}

displayIconAndLabel(foldersNode, doc)
doc.write("</table>")

if (foldersNode.length > 4 && foldersNode[0]) //有更低层的节点和文件夹展开着
{
if (!foldersNode[2])//带文件夹的文件夹
{
level=level+1
for (i=4; i<foldersNode.length;i++)
if (i==foldersNode.length-1)
redrawNode(foldersNode[i], doc, level, 1, leftSide)
else
redrawNode(foldersNode[i], doc, level, 0, leftSide)
}
else //带文档的文件夹
{
for (i=4; i<foldersNode.length;i++)
{
doc.write("<table border=0 cellspacing=0 cellpadding=0 valign=center>")
doc.write("<tr><td nowrap>")
doc.write(leftSide)
if (i==foldersNode.length - 1)
doc.write("<img src='lastnode.gif' width=16 height=22>")
else
doc.write("<img src='node.gif' width=16 height=22>")
doc.write(foldersNode[i])
doc.write("</table>")
}
}
}
}

function displayIconAndLabel(foldersNode, doc)
{
doc.write("<A href='javascript:top.openBranch(\"" + foldersNode[3] + "\")'><img src=")
if (foldersNode[1])
doc.write("openfolder.gif width=24 height=22 border=noborder></a>")
else
doc.write("closedfolder.gif width=24 height=22 border=noborder></a>")
doc.write("<td valign=middle align=left nowrap>")
doc.write("<font style='font-size:9pt;font-family:宋体'>"+foldersNode[3]+"</font>")
}


//树收拢时调用的函数

//当父节点关闭,其所有的子节点也都闭合
function closeFolders(foldersNode)
{
var i=0

if (!foldersNode[2])
{
for (i=4; i< foldersNode.length; i++)
closeFolders(foldersNode[i])

}
foldersNode[0] = 0
foldersNode[1] = 0
}

//收拢节点
function clickOnFolderRec(foldersNode, folderName)
{
var i=0

if (foldersNode[3] == folderName)
{
if (foldersNode[0])
closeFolders(foldersNode)
else
{
foldersNode[0] = 1
foldersNode[1] = 1
}
}
else
{
if (!foldersNode[2])
for (i=4; i< foldersNode.length; i++)
clickOnFolderRec(foldersNode[i], folderName)
}
}


//打开分支
function openBranch(branchName)
{
clickOnFolderRec(foldersTree, branchName)
if (branchName=="Start folder" && foldersTree[0]==0)
top.folderFrame.location="basefolder.htm"
timeOutId = setTimeout("redrawTree()",100)
}

//页面载入时的初始化
function initializeTree()
{
generateTree()
redrawTree()
}
var foldersTree = 0
var timeOutId = 0

-->
</script>
longshenwang 2003-10-16
  • 打赏
  • 举报
回复
顶 顶 顶......
csdn_search 2003-10-16
  • 打赏
  • 举报
回复
请大家谈谈后台维护该怎么做?
liuruhong 2003-10-15
  • 打赏
  • 举报
回复
这个方面的例子很多的,你找一个支持多级菜单的,要么能够提供xml文件,要么有可以调用的接口
nolonely 2003-10-15
  • 打赏
  • 举报
回复
http://fason.nease.net/

数据结构是id,parentid,这样管理很方便
csdn_search 2003-10-15
  • 打赏
  • 举报
回复
各位老大,没人顶啊?顶了就给分
csdn_search 2003-10-15
  • 打赏
  • 举报
回复
请高手帮忙
csdn_search 2003-10-15
  • 打赏
  • 举报
回复
例子虽然很多,都不适合我,后台维护采取什么样的形式?怎么样添加和删除菜单?

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧