ajax+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)    '类别文件根目录(生成静态文件路径,小站奇人异事网([url][/url])用的是生成静态,故设置此字段)
        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
%>


核心js代码 

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wfzzjd.html