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

2018-09-06 12:37

阅读:326

  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%>
<%
作者站点:
邮箱:
QQ:514777880
Response.Charset = utf-8
%>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
<html xmlns=
<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;
{
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-
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>

打包下载地址


评论


亲,登录后才可以留言!