📄 admin_classmove.asp
字号:
<%@language=vbscript codepage=936 %>
<%
option explicit
response.buffer=true
Const PurviewLevel=2 '操作权限
%>
<!--#include file="Admin_ChkPurview.asp"-->
<!--#include file="inc/conn.asp"-->
<!--#include file="inc/function.asp"-->
<!--#include file="inc/admin_code.asp"-->
<%
dim Action,ClassID,sql,rsClass,i,FoundErr,ErrMsg
dim SkinID,LayoutID,BrowsePurview,AddPurview
Action=trim(Request("Action"))
ClassID=trim(request("ClassID"))
if ClassID="" then
FoundErr=True
ErrMsg=ErrMsg & "<br><li>参数不足!</li>"
else
ClassID=CLng(ClassID)
sql="select * From ArticleClass 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
if Action="Move" then
call MoveClass()
else
call main()
end if
end if
rsClass.close
set rsClass=nothing
end if
if FoundErr=True then
call WriteErrMsg()
end if
call CloseConn()
sub MoveClass()
dim rParentID
dim trs,rs,sql
dim ParentID,RootID,Depth,Child,ParentPath,ParentName,iParentID,iParentPath,PrevOrderID,PrevID,NextID
rParentID=trim(request("ParentID"))
if rParentID="" then
rParentID=0
else
rParentID=CLng(rParentID)
end if
if rsClass("ParentID")<>rParentID then '更改了所属栏目,则要做一系列检查
if rParentID=rsClass("ClassID") then
FoundErr=True
ErrMsg=ErrMsg & "<br><li>所属栏目不能为自己!</li>"
end if
'判断所指定的栏目是否为外部栏目或本栏目的下属栏目
if rsClass("ParentID")=0 then
if rParentID>0 then
set trs=conn.execute("select rootid From ArticleClass where LinkUrl='' and ClassID="&rParentID)
if trs.bof and trs.eof then
FoundErr=True
ErrMsg=ErrMsg & "<br><li>不能指定外部栏目为所属栏目</li>"
else
if rsClass("rootid")=trs(0) then
FoundErr=True
ErrMsg=ErrMsg & "<br><li>不能指定该栏目的下属栏目作为所属栏目</li>"
end if
end if
trs.close
set trs=nothing
end if
else
set trs=conn.execute("select ClassID From ArticleClass where ParentPath like '"&rsClass("ParentPath")&"," & rsClass("ClassID") & "%' and ClassID="&rParentID)
if not (trs.eof and trs.bof) then
FoundErr=True
ErrMsg=ErrMsg & "<br><li>您不能指定该栏目的下属栏目作为所属栏目</li>"
end if
trs.close
set trs=nothing
end if
end if
if FoundErr=True then
exit sub
end if
if rsClass("ParentID")=0 then
ParentID=rsClass("ClassID")
iParentID=0
else
ParentID=rsClass("ParentID")
iParentID=rsClass("ParentID")
end if
Depth=rsClass("Depth")
Child=rsClass("Child")
RootID=rsClass("RootID")
ParentPath=rsClass("ParentPath")
PrevID=rsClass("PrevID")
NextID=rsClass("NextID")
rsClass.close
set rsClass=nothing
'假如更改了所属栏目
'需要更新其原来所属栏目信息,包括深度、父级ID、栏目数、排序、继承版主等数据
'需要更新当前所属栏目信息
'继承版主数据需要另写函数进行更新--取消,在前台可用ClassID in ParentPath来获得
dim mrs,MaxRootID
set mrs=conn.execute("select max(rootid) From ArticleClass")
MaxRootID=mrs(0)
set mrs=nothing
if isnull(MaxRootID) then
MaxRootID=0
end if
dim k,nParentPath,mParentPath
dim ParentSql,ClassCount
dim rsPrevOrderID
if clng(parentid)<>rParentID and not (iParentID=0 and rParentID=0) then '假如更改了所属栏目
'更新原来同一父栏目的上一个栏目的NextID和下一个栏目的PrevID
if PrevID>0 then
conn.execute "update ArticleClass set NextID=" & NextID & " where ClassID=" & PrevID
end if
if NextID>0 then
conn.execute "update ArticleClass set PrevID=" & PrevID & " where ClassID=" & NextID
end if
if iParentID>0 and rParentID=0 then '如果原来不是一级分类改成一级分类
'得到上一个一级分类栏目
sql="select ClassID,NextID from ArticleClass where RootID=" & MaxRootID & " and Depth=0"
set rs=server.CreateObject("Adodb.recordset")
rs.open sql,conn,1,3
PrevID=rs(0) '得到新的PrevID
rs(1)=ClassID '更新上一个一级分类栏目的NextID的值
rs.update
rs.close
set rs=nothing
MaxRootID=MaxRootID+1
'更新当前栏目数据
conn.execute("update ArticleClass set depth=0,OrderID=0,rootid="&maxrootid&",parentid=0,ParentPath='0',PrevID=" & PrevID & ",NextID=0 where ClassID="&ClassID)
'如果有下属栏目,则更新其下属栏目数据。下属栏目的排序不需考虑,只需更新下属栏目深度和一级排序ID(rootid)数据
if child>0 then
i=0
ParentPath=ParentPath & ","
set rs=conn.execute("select * From ArticleClass where ParentPath like '%"&ParentPath & ClassID&"%'")
do while not rs.eof
i=i+1
mParentPath=replace(rs("ParentPath"),ParentPath,"")
conn.execute("update ArticleClass set depth=depth-"&depth&",rootid="&maxrootid&",ParentPath='"&mParentPath&"' where ClassID="&rs("ClassID"))
rs.movenext
loop
rs.close
set rs=nothing
end if
'更新其原来所属栏目的栏目数,排序相当于剪枝而不需考虑
conn.execute("update ArticleClass set child=child-1 where ClassID="&iParentID)
elseif iParentID>0 and rParentID>0 then '如果是将一个分栏目移动到其他分栏目下
'得到当前栏目的下属子栏目数
ParentPath=ParentPath & ","
set rs=conn.execute("select count(*) From ArticleClass where ParentPath like '%"&ParentPath & ClassID&"%'")
ClassCount=rs(0)
if isnull(ClassCount) then
ClassCount=1
end if
rs.close
set rs=nothing
'获得目标栏目的相关信息
set trs=conn.execute("select * From ArticleClass where ClassID="&rParentID)
if trs("Child")>0 then
'得到与本栏目同级的最后一个栏目的OrderID
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentID=" & trs("ClassID"))
PrevOrderID=rsPrevOrderID(0)
'得到与本栏目同级的最后一个栏目的ClassID
sql="select ClassID,NextID from ArticleClass where ParentID=" & trs("ClassID") & " and OrderID=" & PrevOrderID
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,3
PrevID=rs(0) '得到新的PrevID
rs(1)=ClassID '更新上一个栏目的NextID的值
rs.update
rs.close
set rs=nothing
'得到同一父栏目但比本栏目级数大的子栏目的最大OrderID,如果比前一个值大,则改用这个值。
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentPath like '" & trs("ParentPath") & "," & trs("ClassID") & ",%'")
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
PrevOrderID=trs("OrderID")
end if
'在获得移动过来的栏目数后更新排序在指定栏目之后的栏目排序数据
conn.execute("update ArticleClass set OrderID=OrderID+" & ClassCount & "+1 where rootid=" & trs("rootid") & " and OrderID>" & PrevOrderID)
'更新当前栏目数据
conn.execute("update ArticleClass set depth="&trs("depth")&"+1,OrderID="&PrevOrderID&"+1,rootid="&trs("rootid")&",ParentID="&rParentID&",ParentPath='" & trs("ParentPath") & "," & trs("ClassID") & "',PrevID=" & PrevID & ",NextID=0 where ClassID="&ClassID)
'如果有子栏目则更新子栏目数据,深度为原来的相对深度加上当前所属栏目的深度
set rs=conn.execute("select * From ArticleClass where ParentPath like '%"&ParentPath&ClassID&"%' order by OrderID")
i=1
do while not rs.eof
i=i+1
iParentPath=trs("ParentPath") & "," & trs("ClassID") & "," & replace(rs("ParentPath"),ParentPath,"")
conn.execute("update ArticleClass set depth=depth-"&depth&"+"&trs("depth")&"+1,OrderID="&PrevOrderID&"+"&i&",rootid="&trs("rootid")&",ParentPath='"&iParentPath&"' where ClassID="&rs("ClassID"))
rs.movenext
loop
rs.close
set rs=nothing
trs.close
set trs=nothing
'更新所指向的上级栏目的子栏目数
conn.execute("update ArticleClass set child=child+1 where ClassID="&rParentID)
'更新其原父类的子栏目数
conn.execute("update ArticleClass set child=child-1 where ClassID="&iParentID)
else '如果原来是一级栏目改成其他栏目的下属栏目
'得到移动的栏目总数
set rs=conn.execute("select count(*) From ArticleClass where rootid="&rootid)
ClassCount=rs(0)
rs.close
set rs=nothing
'获得目标栏目的相关信息
set trs=conn.execute("select * From ArticleClass where ClassID="&rParentID)
if trs("Child")>0 then
'得到与本栏目同级的最后一个栏目的OrderID
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentID=" & trs("ClassID"))
PrevOrderID=rsPrevOrderID(0)
sql="select ClassID,NextID from ArticleClass where ParentID=" & trs("ClassID") & " and OrderID=" & PrevOrderID
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,3
PrevID=rs(0)
rs(1)=ClassID
rs.update
set rs=nothing
'得到同一父栏目但比本栏目级数大的子栏目的最大OrderID,如果比前一个值大,则改用这个值。
set rsPrevOrderID=conn.execute("select Max(OrderID) From ArticleClass where ParentPath like '" & trs("ParentPath") & "," & trs("ClassID") & ",%'")
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
PrevOrderID=trs("OrderID")
end if
'在获得移动过来的栏目数后更新排序在指定栏目之后的栏目排序数据
conn.execute("update ArticleClass set OrderID=OrderID+" & ClassCount &"+1 where rootid=" & trs("rootid") & " and OrderID>" & PrevOrderID)
conn.execute("update ArticleClass set PrevID=" & PrevID & ",NextID=0 where ClassID=" & ClassID)
set rs=conn.execute("select * From ArticleClass where rootid="&rootid&" order by OrderID")
i=0
do while not rs.eof
i=i+1
if rs("parentid")=0 then
if trs("ParentPath")="0" then
ParentPath=trs("ClassID")
else
ParentPath=trs("ParentPath") & "," & trs("ClassID")
end if
conn.execute("update ArticleClass set depth=depth+"&trs("depth")&"+1,OrderID="&PrevOrderID&"+"&i&",rootid="&trs("rootid")&",ParentPath='"&ParentPath&"',parentid="&rParentID&" where ClassID="&rs("ClassID"))
else
if trs("ParentPath")="0" then
ParentPath=trs("ClassID") & "," & rs("ParentPath")
else
ParentPath=trs("ParentPath") & "," & trs("ClassID") & "," & rs("ParentPath")
end if
conn.execute("update ArticleClass set depth=depth+"&trs("depth")&"+1,OrderID="&PrevOrderID&"+"&i&",rootid="&trs("rootid")&",ParentPath='"&ParentPath&"' where ClassID="&rs("ClassID"))
end if
rs.movenext
loop
rs.close
set rs=nothing
trs.close
set trs=nothing
'更新所指向的上级栏目栏目数
conn.execute("update ArticleClass set child=child+1 where ClassID="&rParentID)
end if
end if
call CloseConn()
Response.Redirect "Admin_ClassManage.asp"
end sub
sub main()
%>
<html>
<head>
<title>修改栏目</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="Admin_Style.css" rel="stylesheet" type="text/css">
</head>
<body leftmargin="2" topmargin="0" marginwidth="0" marginheight="0">
<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="70" height="30"><strong>管理导航:</strong></td>
<td height="30"><a href="Admin_ClassManage.asp">栏目管理首页</a> | <a href="Admin_ClassAdd.asp">添加一级栏目</a> | <a href="Admin_ClassOrder.asp">一级栏目排序</a> | <a href="Admin_ClassOrderN.asp">N级栏目排序</a> | <a href="Admin_ClassReset.asp">复位所有栏目</a> | <a href="Admin_ClassUnite.asp">栏目合并</a></td>
</tr>
</table>
<form name="form1" method="post" action="Admin_ClassMove.asp">
<table width="100%" border="0" align="center" cellpadding="2" cellspacing="1" class="border">
<tr class="title">
<td height="22" colspan="2" align="center"><strong>移 动 栏 目</strong></td>
</tr>
<tr class="tdbg">
<td width="200"><strong>栏目名称:</strong></td>
<td><%=rsClass("ClassName")%> <input name="ClassID" type="hidden" id="ClassID" value="<%=rsClass("ClassID")%>"></td>
</tr>
<tr class="tdbg">
<td width="200"><strong>当前所属栏目:</strong></td>
<td>
<%
if rsClass("ParentID")<=0 then
response.write "无(作为一级栏目)"
else
dim rsParent,sqlParent
sqlParent="Select * From ArticleClass where ClassID in (" & rsClass("ParentPath") & ") order by Depth"
set rsParent=server.CreateObject("adodb.recordset")
rsParent.open sqlParent,conn,1,1
do while not rsParent.eof
for i=1 to rsParent("Depth")
response.write " "
next
if rsParent("Depth")>0 then
response.write "└"
end if
response.write " " & rsParent("ClassName") & "<br>"
rsParent.movenext
loop
rsParent.close
set rsParent=nothing
end if
%>
</td>
</tr>
<tr class="tdbg">
<td width="200"><strong>移动到:</strong><br>
不能指定为当前栏目的下属子栏目<br>
不能指定为外部栏目</td>
<td><select name="ParentID" size="2" style="height:300px;width:500px;"><%call Admin_ShowClass_Option(0,rsClass("ParentID"))%></select></td>
</tr>
<tr class="tdbg">
<td height="40" colspan="2" align="center"><input name="Action" type="hidden" id="Action" value="Move">
<input name="Submit" type="submit" value=" 保存移动结果 " style="cursor:hand;">
<input name="Cancel" type="button" id="Cancel" value=" 取 消 " onClick="window.location.href='Admin_ClassManage.asp'" style="cursor:hand;"></td></tr>
</table>
</form>
</body>
</html>
<%
end sub
%>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -