首页 > 编程 > ASP > 正文

ajax+asp无限级分类树型结构(带数据库)

2024-05-04 11:08:50
字体:
来源:转载
供稿:网友
带数据库的ajax+asp无限级分类树型结构,好东西别错过
 
 
 
IE测试通过,FF有点小BUG 
Cls_Leibie.asp 
复制代码代码如下:

<% 
'数据库字段为类属性,添加、删除、修改、操作检查等函数为类的方法 
Class Cls_Leibie 
Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath '定义私有变量(类的属性,即数据库字段对应的变量) 
Private rs,sql,ErrorStr 
Private Sub Class_Initialize() 
ErrorStr="" '初始化错误信息为空 
End Sub 
Private Sub Class_Terminate() '销毁类时关闭数据库连接 
If IsObject(Conn) Then 
Conn.Close 
Set Conn = Nothing 
End If 
End Sub 
'*******************设置各个属性****************************************************** 
Public Property Let ClassID(str) '获取类别ID(主键) 
nClassID=str 
call ClassProperty() '获取类别ID时调用此函数读出类的所有属性 
End Property 
Public Property Let ClassName(str) '获取类别名称 
sClassName=str 
End Property 
Public Property Get ClassName 
ClassName=sClassName 
End Property 
Public Property Let ParentID(str) '获取类别父ID 
nParentID=str 
End Property 
Public Property Get ParentID 
ParentID=nParentID 
End Property 
Public Property Let ParentPath(str) '获取父路径ID 
sParentPath=str 
End Property 
Public Property Get ParentPath 
ParentPath=sParentPath 
End Property 
Public Property Let Depth(str) '获取类别深度 
nDepth=str 
End Property 
Public Property Get Depth 
Depth=nDepth 
End Property 
Public Property Let RootID(str) '获取类别根ID 
nRootID=str 
End Property 
Public Property Get RootID 
RootID=nRootID 
End Property 
Public Property Let Child(str) '子类别个数 
nChild=str 
End Property 
Public Property Get Child 
Child=nChild 
End Property 
Public Property Let OrderID(str) '排序ID 
nOrderID=str 
End Property 
Public Property Get OrderID 
OrderID=nOrderID 
End Property 
Public Property Let FilePath(str) '类别文件根目录(生成静态文件路径,小站老杨Web技术博客用的是生成静态,故设置此字段) 
sFilePath=str 
End Property 
Public Property Get FilePath 
FilePath=sFilePath 
End Property 
'****************************************************************************** 
Private Sub ClassProperty() '读取类的所有属性 
sql="select * from ArticleClass where ClassID="& nClassID 
set rs=conn.execute(sql) 
if not rs.eof then 
sClassName=trim(rs("ClassName")) 
nParentID=trim(rs("ParentID")) 
sParentPath=trim(rs("ParentPath")) 
nDepth=trim(rs("Depth")) 
nRootID=trim(rs("RootID")) 
nChild=trim(rs("Child")) 
nOrderID=trim(rs("OrderID")) 
sFilePath=trim(rs("FilePath")) 
end if 
set rs=nothing 
End Sub 
Public Function FAddCheck() '类别添加检查函数,结果为0表示通过检查,为1表示有错误发生,有错误发生时退出函数,将错误信息写入错误变量ErrorStr 
dim temprs 
FAddCheck=0 
if sClassName="" then '类名为空 
FAddCheck=1 
ErrorStr="类名不能为空!" 
exit Function 
else 
if nParentID="" then '父id为空 
FAddCheck=1 
ErrorStr="父id不能为空!" 
exit Function 
else 
if nParentID<>0 then 
set temprs=conn.execute("select ClassID From ArticleClass where ClassID=" & nParentID) '父类别不存在 
if temprs.eof then 
FAddCheck=1 
ErrorStr="所属类别不存在或已经被删除!" 
exit Function 
else 
sql="select ClassID from ArticleClass where ClassName='"& sClassName &"' and ParentID="& nParentID '类名重复 
set rs=conn.execute(sql) 
if not rs.eof then 
FAddCheck=1 
ErrorStr="类名重复!" 
exit Function 
end if 
set rs=nothing 
end if 
set temprs=nothing 
else 
sql="select ClassID from ArticleClass where ClassName='"& sClassName &"' and ParentID="& nParentID '类名重复 
set rs=conn.execute(sql) 
if not rs.eof then 
FAddCheck=1 
ErrorStr="类名重复!" 
exit Function 
end if 
set rs=nothing 
end if 
end if 
end if 
End Function 
Public Sub SAdd() 
dim maxClassID,maxRootID 
set rs = conn.execute("select Max(ClassID) from ArticleClass") '查找当前数据库中最大的类别id,如果没有数据则设置为0,要插入的类别id为当前最大id加1 
maxClassID=rs(0) 
if isnull(maxClassID) then 
maxClassID=0 
end if 
set rs=nothing 
nClassID=maxClassID+1 
set rs=conn.execute("select max(rootid) From ArticleClass") '查找当前数据库中最大的根id,如果没有数据则设置为0,要插入的根id为当前最大根id加1 
maxRootID=rs(0) 
if isnull(maxRootID) then 
maxRootID=0 
end if 
nRootID=maxRootID+1 
set rs=conn.execute("select RootID,Depth,ParentPath,Child,OrderID From ArticleClass where ClassID=" & nParentID) '查找父类别相应信息 
if not rs.eof then 
nRootID=trim(rs("Rootid")) '根id与父类别根id相同 
sParentPath=trim(rs("ParentPath"))& "," &nParentID 
if cint(trim(nParentID))>0 then '父id大于0则有父类别,故要插入的类别的深度父类别的深度加1,父id不大于0则当前要插入的类别为根类别,则深度为0 
nDepth=cint(trim(rs("Depth")))+1 
else 
nDepth=0 
end if 
if cint(trim(rs("Child")))>0 then 
dim rsPrevOrderID 
'得到与本栏目同级的最后一个栏目的OrderID 
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentID=" & ParentID) 
prevOrderID=rsPrevOrderID(0) 
'得到同一父栏目但比本栏目级数大的子栏目的最大OrderID,如果比前一个值大,则改用这个值。 
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentPath like '" & ParentPath & ",%'") 
if (not(rsPrevOrderID.bof and rsPrevOrderID.eof)) then 
if not IsNull(rsPrevOrderID(0)) then 
if rsPrevOrderID(0)>prevOrderID then 
prevOrderID=rsPrevOrderID(0) 
end if 
end if 
end if 
set rsPrevOrderID=nothing 
end if 
nOrderID=prevOrderID+1 
else 
nOrderID=0 
sParentPath="0" 
nDepth=0 
end if 
set rs=nothing 
nChild=0 
sql="insert into ArticleClass (ClassID,ClassName,ParentID,ParentPath,Depth,RootID,Child,OrderID,FilePath) values ("& nClassID &",'"& sClassName &"',"& nParentID &",'"& sParentPath &"',"& nDepth &","& nRootID &","& nChild &","& nOrderID &",'"& sFilePath &"')" 
conn.execute(sql) 
if ParentID>0 then 
'更新其父类的子栏目数 
conn.execute("update ArticleClass set child=child+1 where ClassID="& nParentID) 
'更新该栏目排序以及大于本需要和同在本分类下的栏目排序序号 
if prevOrderID<>"" then 
conn.execute("update ArticleClass set OrderID=OrderID+1 where rootid=" & nRootid & " and OrderID>"& prevOrderID &" and ClassID<>"& nClassID) 
end if 
end if 
End Sub 
Public Function FEditCheck() '类别修改检查函数,结果为0表示通过检查,为1表示有错误发生,有错误发生时退出函数,将错误信息写入错误变量ErrorStr 
dim temprs 
FEditCheck=0 
if nClassID="" then '类别id为空 
FEditCheck=1 
ErrorStr="类别id不能为空!" 
exit Function 
else 
if sClassName="" then '类名为空 
FEditCheck=1 
ErrorStr="类名不能为空!" 
exit Function 
else 
if nParentID<>0 then 
set temprs=conn.execute("select ClassID From ArticleClass where ClassID=" & nParentID) '父类别不存在 
if temprs.eof then 
FAddCheck=1 
ErrorStr="所属类别不存在或已经被删除!" 
exit Function 
else 
set rs=conn.execute("select ClassID from ArticleClass where ClassName='"& sClassName &"' and ClassID<>"& nClassID &"and ParentID="& nParentID) 
if not rs.eof then '类名重复 
FEditCheck=1 
ErrorStr="类名重复!" 
exit Function 
end if 
set rs=nothing 
end if 
set temprs=nothing 
end if 
end if 
end if 
End Function 
Public Sub SEdit() '类别修改 
sql="update ArticleClass set ClassName='"& sClassName &"',FilePath='"& sFilePath &"' where ClassID="& nClassID 
conn.execute(sql) 
End Sub 
Public Function FDeleteCheck() '类别删除检查函数,结果为0表示通过检查,为1表示有错误发生,有错误发生时退出函数,将错误信息写入错误变量ErrorStr 
FDeleteCheck=0 '这里删除没有写级联删除文章部分的代码,删除时应该级联删除 
if nClassID="" then 
FDeleteCheck=1 
ErrorStr="要删除的类别id不能为空!" 
exit Function 
else 
set rs=conn.execute("select Child from ArticleClass where ClassID="& nClassID) 
if rs.bof and rs.eof then 
FDeleteCheck=1 
ErrorStr="类别不存在或者已经被删除!" 
exit Function 
else 
if trim(rs("Child"))>0 then 
FDeleteCheck=1 
ErrorStr="该类别含有子类别,请删除其子类别后再进行删除本类别的操作!" 
exit Function 
end if 
end if 
end if 
End Function 
Public Sub SDelete() 
if nDepth>0 then '修改父id孩子数 
conn.execute("update ArticleClass set child=child-1 where child>0 and ClassID=" & nParentID) 
end if 
sql="delete from ArticleClass where ClassID="& nClassID 
conn.execute(sql) 
End Sub 
Public Function FErrStr() 
FErrStr=ErrorStr 
End Function 
End Class 
%> 
index.asp 
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> 
<% 
'作者站点:www.guaishi.org 
'邮箱:guaishiorg@126.com 
'QQ:514777880 
Session.CodePage=65001 
Response.Charset = "utf-8" 
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title></title> 
<style type="text/css"> 
body{margin:0;padding:0;font-size:12px; background-color:#FFFFFF;} 
ul{ list-style-type:none; margin:0 0 0 20px; padding:0;} 
li{ white-space:nowrap; padding:0;} 
.childdiv{ background:url(images/dot.gif);background-repeat:repeat-y;} 
span { cursor:pointer;} 
</style> 
<script type="text/javascript"> 
var xmlHttp; //定义一个全局变量 
var currentID=1;//设置当前选中ID,如果此ID不存在则会发生js错误 
//类别显示主函数 
//cid--子类别所在层id 
//id --类别id 
//pid--[+]和[-]图标id 
//fid--类别图标id 
function DivDisplay(cid,id,pid,fid) 

if (GetId(cid).style.display=='') //子类别不显示时图标显示控制 

GetId(cid).style.display='none'; 
GetId(pid).src = 'images/closed.gif'; 
GetId(fid).src = 'images/folder.gif'; 

else //展开子类别时的操作 

GetId(cid).style.display=''; 
GetId(pid).src = 'images/opened.gif'; 
GetId(fid).src = 'images/folderopen.gif'; 
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='正在提交数据...') 

GetId(cid).innerHTML=''; 
ShowChild(cid,id); //调用显示子类别函数 



//与上一个函数作用相同,只作用在最后一个类别 
function DivDisplay2(cid,id,pid,fid) 

if (GetId(cid).style.display=='') 

GetId(cid).style.display='none'; 
GetId(pid).src = 'images/lastclosed.gif'; 
GetId(fid).src = 'images/folder.gif'; 

else 

GetId(cid).style.display=''; 
GetId(pid).src = 'images/lastopen.gif'; 
GetId(fid).src = 'images/folderopen.gif'; 
if (GetId(cid).innerHTML==''||GetId(cid).innerHTML=='正在提交数据...') 

GetId(cid).innerHTML=''; 
ShowChild(cid,id); 



//类别添加函数 
//id--类别id 
function ClassAdd(id){ 
if (GetId("p"+id).src.indexOf("last")>0){ //最后一个类别时的添加操作 
if (!GetId("p"+id).onclick){ 
GetId("p"+id).onclick=function (){DivDisplay2("c"+id,id,"p"+id,"f"+id);}; //为[+]和[-]添加单击事件 
GetId("s"+id).ondblclick=function (){DivDisplay2("c"+id,id,"p"+id,"f"+id);}; //为显示类别文字的span添加双击事件 
GetId("p"+id).src = 'images/lastopen.gif'; 


else{ 
if (!GetId("p"+id).onclick){ //不为最后一个类别的添加操作 
GetId("p"+id).onclick=function (){DivDisplay("c"+id,id,"p"+id,"f"+id);}; 
GetId("s"+id).ondblclick=function (){DivDisplay("c"+id,id,"p"+id,"f"+id);}; 
GetId("p"+id).src = 'images/opened.gif'; 


GetId("c"+id).style.display=''; 
ShowChild("c"+id,id); 

//类别修改函数 
function ClassEdit(id,classname){ 
GetId("s"+id).innerHTML=classname; 

//有多个子类别的类别的删除函数 
function ClassDel(id){ 
ShowChild("c"+id,id); 
CurrentSelect(currentID,id) 
BrowseRight(id); 

//只有一个子类别的类别的删除函数 
function ClassDel1(id){ 
if (GetId("p"+id).src.indexOf("last")>0){ //当类别是当前类别的最后一个类别时 
GetId("p"+id).style.cursor="cursor"; //设置图标的鼠标经过样式 
GetId("p"+id).onclick=function (){}; //因为只有一个子类别删除后就不再有子类别,故将图标单击事件修改为空函数 
GetId("s"+id).ondblclick=function (){}; //同上 
GetId("p"+id).src = 'images/lastnochild.gif'; //图标设置 

else{ 
GetId("p"+id).style.cursor="cursor"; //非最后一个类别的删除操作 
GetId("p"+id).onclick=function (){}; 
GetId("s"+id).ondblclick=function (){}; 
GetId("p"+id).src = 'images/nofollow2.gif'; //这里的图标设置与前面不一样 

ShowChild("c"+id,id); 
CurrentSelect(currentID,id); 
BrowseRight(id); 

//向右边框架传递参数 
function BrowseRight(id){ 
CurrentSelect(currentID,id); 
top.ContentFrame.location="../ArticleMain.asp?ClassID="+ id; 

//设置类别选中状态的函数 
function CurrentSelect(oldid,newid){ 
currentID=newid; 
document.getElementById("s"+oldid).style.backgroundColor="white"; 
document.getElementById("s"+currentID).style.backgroundColor="#C0C0E9"; 

//创建XMLHttpRequest对象 
function CreateXMLHttpRequest() 

if (window.ActiveXObject) 

xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 

else 

xmlHttp = new XMLHttpRequest(); 


//Ajax处理函数 
//id,层id 
//rid,数据在表中的id 
function ShowChild(cid,id) 

CreateXMLHttpRequest(); 
if(xmlHttp) 

xmlHttp.open('POST','child.asp',true); 
xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); 
var SendData = 'id='+id; 
xmlHttp.send(SendData); 
xmlHttp.onreadystatechange=function() 

if(xmlHttp.readyState==4) 

if(xmlHttp.status==200) 

GetId(cid).innerHTML = xmlHttp.responseText; 

else 

GetId(cid).innerHTML='出错:'+xmlHttp.statusText; 


else 

GetId(cid).innerHTML="正在提交数据..."; 



else 

GetId(cid).innerHTML='抱歉,您的浏览器不支持XMLHttpRequest,请使用IE6以上版本!'; 


//取得页面对象 
//id,层id 
function GetId(id) 

return document.getElementById(id); 

</script> 
</head> 
<body> 
<!--#include file="../conn.asp"--> 
<% 
'显示根目录 
sql="select *,(select top 1 ClassID from ArticleClass where Depth=0 order by ClassID desc) as lastid from ArticleClass where Depth=0 order by ClassID" 
set rs=conn.execute(sql) 
if not rs.eof then 
response.Write "<ul>"&vbcr 
do while not rs.eof 
if cint(trim(rs("ClassID")))=cint(trim(rs("lastid"))) then 
if rs("Child")>0 then 
response.Write "<li><img id='p"&rs("ClassID")&"' src=""images/lastclosed.gif"" onclick=""DivDisplay2('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"" style=""cursor : hand;"" align=""absmiddle"">" 
response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"" ondblclick=""DivDisplay2('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"">"& rs("ClassName") &"</span>" 
else 
response.Write "<li><img id='p"& rs("ClassID") &"' src=""images/lastnochild.gif"" align=""absmiddle"" />" 
response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"">"& rs("ClassName") &"</span>" 
end if 
else 
if rs("Child")>0 then 
response.Write "<li><img id='p"&rs("ClassID")&"' src=""images/closed.gif"" onclick=""DivDisplay('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"" style=""cursor : hand;"" align=""absmiddle"">" 
response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"" ondblclick=""DivDisplay('c"&rs("ClassID")&"','"&rs("ClassID")&"','p"&rs("ClassID")&"','f"& rs("ClassID") &"')"">"& rs("ClassName") &"</span>" 
else 
response.Write "<li><img id='p"& rs("ClassID") &"' src=""images/nofollow2.gif"" align=""absmiddle"" />" 
response.Write "<img src=""images/folder.gif"" align=""absmiddle"" id='f"& rs("ClassID") &"' /> <span id='s"& trim(rs("ClassID")) &"' onclick=""BrowseRight("& trim(rs("ClassID")) &")"">"& rs("ClassName") &"</span>" 
end if 
end if 
if cint(trim(rs("ClassID")))=cint(trim(rs("lastid"))) then 
response.Write "<div id='c"&rs("ClassID")&"' style='display:none;'></div>" 
else 
response.Write "<div id='c"&rs("ClassID")&"' style='display:none;' class=""childdiv""></div>" 
end if 
response.Write "</li>"&vbcr 
rs.movenext 
loop 
response.Write "</ul>"&vbcr 
end if 
rs.close 
set rs=nothing 
conn.close 
Set conn = Nothing 
%> 
</body> 
</html> 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表