Asp教程

通过asp实例结合结合ACCESS,MSSQL来更好的深入Asp学习 - 爬坡者

« js调用asp传递参数自动刷新页面方法总结 »

ASP无限级分类(2007-8-2)

<!--#include file="../include/conn.asp"--> 
<% 
Dim Action,ParentID,ErrMsg,FoundErr,strTemp 
ParentID=trim(request("ParentID")) 
Action=trim(Request("Action")) 

if ParentID="" then 
ParentID=0 
else 
ParentID=CLng(ParentID) 
end if 
%> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>分类管理</title> 
<link href="style.css" rel="stylesheet" type="text/css"> 
</head> 

<body> 
<table width="100%" border="0" align="center" cellpadding="2" cellspacing="1" class="border"> 
<tr class="topbg"> 
<td height="22" colspan="2" align="center"><strong>信 息 分 类 管 理</strong></td> 
</tr> 
<tr class="tdbg"> 
<td width="100" height="30" ><strong>分类管理导航:</strong></td> 
<td> <a href="?Action=Add">添加分类</a> | <a href="?">管理分类</a></td> 
</tr> 
</table> 
<% 
if Action="Add" then 
call AddClass() 
elseif Action="SaveAdd" then 
call SaveAdd() 
elseif Action="Modify" then 
call Modify() 
elseif Action="SaveModify" then 
call SaveModify() 
elseif Action="Del" then 
call DeleteClass() 
else 
call main() 
end if 
conn.close 
set conn=nothing 

if FoundErr=True then 
call WriteErrMsg() 
end if 

sub main() 
dim arrShowLine(10) 
for i=0 to ubound(arrShowLine) 
arrShowLine(i)=False 
next 
dim sqlClass,rsClass,i,iDepth 
sqlClass="select * From zl_class order by RootID,OrderID" 

set rsClass=server.CreateObject("adodb.recordset") 
rsClass.open sqlClass,conn,1,1 
%> 
<table width="100%" border="0" cellpadding="2" cellspacing="1" class="border"> 
<tr align="center" class="title"> 
<td width="50%" height="22"><strong>信息分类名称</strong></td> 
<td><strong>操作选项</strong></td> 
</tr> 
<% 
If Not rsClass.Eof Then 
do while not rsClass.eof 
%> 
<tr class="tdbg"> 
<td> 
<% 
iDepth=rsClass("Depth") 
if rsClass("NextID")>0 then 
arrShowLine(iDepth)=True 
else 
arrShowLine(iDepth)=False 
end if 
if iDepth>0 then 
for i=1 to iDepth 
if i=iDepth then 
if rsClass("NextID")>0 then 
response.write "<img src='images/tree/tree_line1.gif' width='17' height='16' valign='abvmiddle'>" 
else 
response.write "<img src='images/tree/tree_line2.gif' width='17' height='16' valign='abvmiddle'>" 
end if 
else 
if arrShowLine(i)=True then 
response.write "<img src='images/tree/tree_line3.gif' width='17' height='16' valign='abvmiddle'>" 
else 
response.write "<img src='images/tree/tree_line4.gif' width='17' height='16' valign='abvmiddle'>" 
end if 
end if 
next 
end if 
if rsClass("Child")>0 then 
response.write "<img src='images/tree/tree_folder4.gif' width='15' height='15' valign='abvmiddle'>" 
else 
response.write "<img src='images/tree/tree_folder3.gif' width='15' height='15' valign='abvmiddle'>" 
end if 
if rsClass("Depth")=0 then 
response.write "<b>" 
end if 
response.write "<a href='?Action=Modify&ClassID=" & rsClass("ClassID") & "' title='" & rsClass("ClassName") & "'>" & rsClass("ClassName") & "</a>" 
if rsClass("Child")>0 then 
response.write "(" & rsClass("Child") & ")" 
end if 
%> 
</td> 
<td align="center"> 
<a href="?Action=Add&ParentID=<%=rsClass("ClassID")%>">添加子分类</a> 
| <a href="?Action=Modify&ClassID=<%=rsClass("ClassID")%>">修改设置</a> | <a href="?Action=Del&ClassID=<%=rsClass("ClassID")%>" onClick="<%if rsClass("Child")>0 then%>return ConfirmDel1();<%else%>return ConfirmDel2();<%end if%>">删除分类</a> </td> 
</tr> 
<% 
rsClass.movenext 
loop 
Else 
Response.Write("<tr><td class=""tdbg"" height=""22"" colspan=""2"" align=""center"">请先添加分类!</td></tr>") 
End If 
rsClass.close 
set rsClass=nothing 
%> 
</table> 
<script language="JavaScript" type="text/JavaScript"> 
function ConfirmDel1() 

alert("此分类下还有子分类,必须先删除下属子分类后才能删除此分类!"); 
return false; 


function ConfirmDel2() 

if(confirm("删除分类将同时删除此分类中的所有信息,并且不能恢复!确定要删除此分类吗?")) 
return true; 
else 
return false; 


</script> 
<% 
end sub 

sub AddClass() 
%> 
<table width="100%" border="0" cellpadding="2" cellspacing="1" class="border"> 
<form name="form1" method="post" action="?" onSubmit="return check()"> 
<tr align="center" class="title"> 
<td height="22" colspan="2"><strong>添加分类</strong></td> 
</tr> 
<tr class="tdbg"> 
<td width="40%" align="right"><strong>所属分类</strong>:<br></td> 
<td> 
<select name="ParentID"> 
<%call ShowClass_Option(0,ParentID)%> 
</select> 
</td> 
</tr> 
<tr class="tdbg"> 
<td height="22" align="right"><strong>分类名称</strong>:</td> 
<td> 
<input name="ClassName" type="text" size="37" maxlength="20"></td> 
</tr> 

<tr class="tdbg"> 
<td colspan="2" align="center"><br> 
<input name="Action" type="hidden" id="Action" value="SaveAdd"> <input name="Add" type="submit" class="button" id="Add" value="添加分类"> 
    <input name="Cancel" type="button" class="button" id="Cancel" onClick="window.location.href='?'" value="取 消"> 
<br> 
<br></td> 
</tr> 
</form> 
</table> 
<script language="JavaScript" type="text/JavaScript"> 
function check() 

if (document.form1.ClassName.value=="") 

alert("分类名称不能为空!"); 
document.form1.ClassName.focus(); 
return false; 


</script> 
<% 
end sub 

sub Modify() 
dim ClassID,sql,rsClass,i 
ClassID=trim(request("ClassID")) 
if ClassID="" then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>参数不足!</li>" 
exit sub 
else 
ClassID=CLng(ClassID) 
end if 

sql="select * From zl_class where ClassID=" & ClassID 
set rsClass=server.CreateObject ("Adodb.recordset") 
rsClass.open sql,conn,1,3 
if rsClass.bof and rsClass.eof then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>找不到指定的分类!</li>" 
else 
%> 
<table width="100%" border="0" cellpadding="2" cellspacing="1" class="border"> 
<form name="form1" method="post" action="?" onSubmit="return check()"> 
<tr class="title"> 
<td height="22" colspan="2" align="center"><strong>修改分类</strong></td> 
</tr> 
<tr class="tdbg"> 
<td width="40%" align="right"><strong>所属分类</strong>:<br></td> 
<td> 
<% 
if rsClass("ParentID")<=0 then 
response.write "无(作为一级分类)" 
else 
dim rsParentClass,sqlParentClass 
sqlParentClass="Select * From zl_class where ClassID in (" & rsClass("ParentPath") & ") order by Depth" 
set rsParentClass=server.CreateObject("adodb.recordset") 
rsParentClass.open sqlParentClass,conn,1,1 
do while not rsParentClass.eof 
for i=1 to rsParentClass("Depth") 
response.write "    " 
next 
if rsParentClass("Depth")>0 then 
response.write "└" 
end if 
response.write " " & rsParentClass("ClassName") & "<br>" 
rsParentClass.movenext 
loop 
rsParentClass.close 
set rsParentClass=nothing 
end if 
%> </td> 
</tr> 
<tr class="tdbg"> 
<td align="right"><strong>分类名称</strong>:</td> 
<td><input name="ClassName" type="text" value="<%=rsClass("ClassName")%>" size="37" maxlength="20"> 
<input name="ClassID" type="hidden" id="ClassID" value="<%=rsClass("ClassID")%>"></td> 
</tr> 

<tr class="tdbg"> 
<td colspan="2" align="center"><br> 
<input name="Action" type="hidden" id="Action" value="SaveModify"> <input name="Submit" type="submit" class="button" id="Submit" value="保存修改结果"> 
    <input name="Cancel" type="button" class="button" id="Cancel" onClick="window.location.href='?'" value="取 消"> 
<br> 
<br></td> 
</tr> 
</form> 
</table> 
<script language="JavaScript" type="text/JavaScript"> 
function check() 

if (document.form1.ClassName.value=="") 

alert("分类名称不能为空!"); 
document.form1.ClassName.focus(); 
return false; 


</script> 
<% 
end if 
rsClass.close 
set rsClass=nothing 
end sub 
%> 
</body> 
</html> 

<% 
sub SaveAdd() 
dim ClassID,ClassName,OnElite,OnTop,ClassPicUrl,LinkUrl,PrevOrderID 
dim sql,rs,trs 
dim RootID,ParentDepth,ParentPath,ParentStr,ParentName,MaxClassID,MaxRootID 
dim PrevID,NextID,Child 
FoundErr=False 
ClassName=trim(request("ClassName")) 
if ClassName="" then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>分类名称不能为空!</li>" 
end if 
if FoundErr=True then 
exit sub 
end if 

set rs = conn.execute("select Max(ClassID) From zl_class") 
MaxClassID=rs(0) 
if isnull(MaxClassID) then 
MaxClassID=0 
end if 
rs.close 
ClassID=MaxClassID+1 
set rs=conn.execute("select max(RootID) From zl_class") 
MaxRootID=rs(0) 
if isnull(MaxRootID) then 
MaxRootID=0 
end if 
rs.close 
RootID=MaxRootID+1 

if ParentID>0 then 
sql="select * From zl_class where ClassID=" & ParentID & "" 
rs.open sql,conn,1,1 
if rs.bof and rs.eof then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>所属分类已经被删除!</li>" 
end if 
if FoundErr=True then 
rs.close 
set rs=nothing 
exit sub 
else 
RootID=rs("RootID") 
ParentName=rs("ClassName") 
ParentDepth=rs("Depth") 
ParentPath=rs("ParentPath") 
Child=rs("Child") 
ParentPath=ParentPath & "," & ParentID '得到此分类的父级分类路径 
PrevOrderID=rs("OrderID") 
if Child>0 then 
dim rsPrevOrderID 
'得到与本分类同级的最后一个分类的OrderID 
set rsPrevOrderID=conn.execute("select Max(OrderID) From zl_class where ParentID=" & ParentID) 
PrevOrderID=rsPrevOrderID(0) 
set trs=conn.execute("select ClassID From zl_class where ParentID=" & ParentID & " and OrderID=" & PrevOrderID) 
PrevID=trs(0) 

'得到同一父分类但比本分类级数大的子分类的最大OrderID,如果比前一个值大,则改用这个值。 
set rsPrevOrderID=conn.execute("select Max(OrderID) From zl_class 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 
else 
PrevID=0 
end if 

end if 
rs.close 
else 
if MaxRootID>0 then 
set trs=conn.execute("select ClassID From zl_class where RootID=" & MaxRootID & " and Depth=0") 
PrevID=trs(0) 
trs.close 
else 
PrevID=0 
end if 
PrevOrderID=0 
ParentPath="0" 
end if 

sql="Select * From zl_class Where ParentID=" & ParentID & " AND ClassName='" & ClassName & "'" 
set rs=server.CreateObject("adodb.recordset") 
rs.open sql,conn,1,1 
if not(rs.bof and rs.eof) then 
FoundErr=True 
if ParentID=0 then 
ErrMsg=ErrMsg & "<br><li>已经存在一级分类:" & ClassName & "</li>" 
else 
ErrMsg=ErrMsg & "<br><li>“" & ParentName & "”中已经存在子分类“" & ClassName & "”!</li>" 
end if 
rs.close 
set rs=nothing 
exit sub 
end if 
rs.close 

sql="Select top 1 * From zl_class" 
rs.open sql,conn,1,3 
rs.addnew 
rs("ClassID")=ClassID 
rs("ClassName")=ClassName 
rs("RootID")=RootID 
rs("ParentID")=ParentID 
if ParentID>0 then 
rs("Depth")=ParentDepth+1 
else 
rs("Depth")=0 
end if 
rs("ParentPath")=ParentPath 
rs("OrderID")=PrevOrderID 
rs("Child")=0 
rs("PrevID")=PrevID 
rs("NextID")=0 
rs.update 
rs.Close 
set rs=Nothing 

'更新与本分类同一父分类的上一个分类的“NextID”字段值 
if PrevID>0 then 
conn.execute("update zl_class set NextID=" & ClassID & " where ClassID=" & PrevID) 
end if 

if ParentID>0 then 
'更新其父类的子分类数 
conn.execute("update zl_class set Child=Child+1 where ClassID="&ParentID) 

'更新该分类排序以及大于本需要和同在本分类下的分类排序序号 
conn.execute("update zl_class set OrderID=OrderID+1 where RootID=" & rootid & " and OrderID>" & PrevOrderID) 
conn.execute("update zl_class set OrderID=" & PrevOrderID & "+1 where ClassID=" & ClassID) 
end if 
Response.Redirect "?" 
end sub 

sub SaveModify() 
dim ClassName,OnElite,OnTop,ClassPicUrl,LinkUrl 
dim trs,rs 
dim ClassID,sql,rsClass,i 
FoundErr=False 

ClassID=trim(request("ClassID")) 
if ClassID="" then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>参数不足!</li>" 
else 
ClassID=CLng(ClassID) 
end if 
ClassName=trim(request("ClassName")) 
OnElite=trim(request("OnElite")) 
OnTop=trim(request("OnTop")) 
ClassPicUrl=trim(request("ClassPicUrl")) 
LinkUrl=trim(request("LinkUrl")) 
if ClassName="" then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>分类名称不能为空!</li>" 
end if 

if FoundErr=True then 
exit sub 
end if 

sql="select * From zl_class where ClassID=" & ClassID 
set rsClass=server.CreateObject ("Adodb.recordset") 
rsClass.open sql,conn,1,3 
if rsClass.bof and rsClass.eof then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>找不到指定的分类!</li>" 
rsClass.close 
set rsClass=nothing 
exit sub 
end if 
if rsClass("Child")>0 and LinkUrl<>"" then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>本分类有子分类,所以不能设为外部链接地址。</li>" 
end if 
if OnElite="Yes" then 
OnElite=True 
else 
OnElite=False 
end if 
if OnTop="Yes" then 
OnTop=True 
else 
OnTop=False 
end if 
if FoundErr=True then 
rsClass.close 
set rsClass=nothing 
exit sub 
end if 
rsClass("ClassName")=ClassName 
rsClass.update 
rsClass.close 
set rsClass=nothing 
Response.Redirect "?" 
end sub 


sub DeleteClass() 
dim sql,rs,PrevID,NextID,ClassID 
FoundErr=False 

ClassID=trim(Request("ClassID")) 
if ClassID="" then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>参数不足!</li>" 
exit sub 
else 
ClassID=CLng(ClassID) 
end if 

sql="select * From zl_class where ClassID=" & ClassID 
set rs=server.CreateObject ("Adodb.recordset") 
rs.open sql,conn,1,3 
if rs.bof and rs.eof then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>分类不存在,或者已经被删除</li>" 
else 
if rs("Child")>0 then 
FoundErr=True 
ErrMsg=ErrMsg & "<br><li>该分类含有子分类,请删除其子分类后再进行删除本分类的操作</li>" 
end if 
end if 
if FoundErr=True then 
rs.close 
set rs=nothing 
exit sub 
end if 
PrevID=rs("PrevID") 
NextID=rs("NextID") 
if rs("Depth")>0 then 
conn.execute("update zl_class set Child=Child-1 where ClassID=" & rs("ParentID")) 
end if 
rs.delete 
rs.update 
rs.close 
set rs=nothing 

'修改上一分类的NextID和下一分类的PrevID 
if PrevID>0 then 
conn.execute "update zl_class set NextID=" & NextID & " where ClassID=" & PrevID 
end if 
if NextID>0 then 
conn.execute "update zl_class set PrevID=" & PrevID & " where ClassID=" & NextID 
end if 
Response.Redirect "?" 
end sub 

sub ShowClass_Option(ShowType,CurrentID) 
if ShowType=0 then 
response.write "<option value='0'" 
if CurrentID=0 then response.write " selected" 
response.write ">-请选择-</option>" 
end if 
dim rsClass,sqlClass,strTemp,tmpDepth,i 
dim arrShowLine(20) 
for i=0 to ubound(arrShowLine) 
arrShowLine(i)=False 
next 
sqlClass="select * From zl_class order by RootID,OrderID" 
set rsClass=Conn.execute(sqlClass) 
if rsClass.bof and rsClass.eof then 
response.write "<option value=''>请先添加信息分类</option>" 
else 
do while not rsClass.eof 
tmpDepth=rsClass("Depth") 
if rsClass("NextID")>0 then 
arrShowLine(tmpDepth)=True 
else 
arrShowLine(tmpDepth)=False 
end if 
if ShowType=1 then 
strTemp="<option value='" & rsClass("ClassID") & "'" 
elseif ShowType=2 then 
strTemp="<option value='" & rsClass("ClassID") & "'" 
elseif ShowType=3 then 
if rsClass("Child")>0 then 
strTemp="<option value=''" 
else 
strTemp="<option value='" & rsClass("ClassID") & "'" 
end if 
elseif ShowType=4 then 
if rsClass("Child")>0 then 
strTemp="<option value=''" 
else 
strTemp="<option value='" & rsClass("ClassID") & "'" 
end if 
else 
strTemp="<option value='" & rsClass("ClassID") & "'" 
end if 
if CurrentID>0 and rsClass("ClassID")=CurrentID then 
strTemp=strTemp & " selected" 
end if 
strTemp=strTemp & ">" 

if tmpDepth>0 then 
for i=1 to tmpDepth 
strTemp=strTemp & "   " 
if i=tmpDepth then 
if rsClass("NextID")>0 then 
strTemp=strTemp & "├ " 
else 
strTemp=strTemp & "└ " 
end if 
else 
if arrShowLine(i)=True then 
strTemp=strTemp & "│" 
else 
strTemp=strTemp & " " 
end if 
end if 
next 
end if 
strTemp=strTemp & rsClass("ClassName") 
strTemp=strTemp & "</option>" 
response.write strTemp 
rsClass.movenext 
loop 
end if 
rsClass.close 
set rsClass=nothing 
end sub 
%> 
附:表结构(表名为zl_class,以下是其包含字段名和字段类型) 
ClassID ClassName ParentID ParentPath Depth RootID Child PrevID NextID OrderID 
自动编号 文本 数字 文本 数字 数字 数字 数字 数字 数字 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Spirit Build 80710

Copyright 2007-2008 papozhe.com [asp教程] All Rights Reserved.
浙ICP备07030537号
免责申明:所有文章除特别声明,均来自网上,主要为学习用!内容仅供参考,版权归原作者。如侵犯您利益,请来信告知.
Email:papozhe$Gmail.com QQ:76336503