zoukankan      html  css  js  c++  java
  • 无限级菜单

    if exists(select * from sysobjects where name='tb_tree')
    drop table tb_tree
    go
    create table tb_tree
    (
        id int primary key identity,
        name varchar(50),
        pId int,
        level int,
        sort int,
        cNum int
    )
    go
    
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1',0,1,0,6);
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-1',1,2,2,3);
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-1-1',2,3,3,0);
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-1-2',2,3,2,0);
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-1-3',2,3,1,0);
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-1-3-1',5,4,0,0);
    
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-2',1,2,1,2);
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-2-1',6,3,2,0);
    insert into tb_tree(name,pId,level,sort,cNum) values('节点1-2-2',6,3,1,0);
    
    
    --------------修改排序----------
    if exists (select * from sysobjects where name='proc_tree_move')
    drop proc proc_tree_move
    go
    create proc proc_tree_move(@id int,@newpId int,@sibId int,@dir int)--假设@sibId=3
    as
        declare @oldpId int,@oldsort int, @newSibsort int    --@newSibsort:目标节点的排序值
        select @oldpId=pId,@oldsort=sort from tb_tree where id=@id
        --修改原兄弟节点的排序,后面的不动,前面的全部减1 例如:5,4,3,2,1 将3移走 5,4都减去1 就变成了 4,3,2,1
        update tb_tree set sort=sort-1 where pId=@oldpId and sort>@oldsort
    
        if(@sibId<>0)--判断是否选中了目标节点
            begin
                --获得目标节点的排序(排序靠前或靠后:@dir=-1:表示移动到目标节点后面,@dir=1:表示移动到目标节点的前面)
                select @newSibsort=sort from tb_tree where id=@sibId
                --修改目标兄弟节点的排序 只修改排序大于等于目标节点的值的 如:原排序:5,4,3,2,1 
                --情况1 :将一个节点插入到目标节点3的 "前" 面,则5,4排序值加1,就变成了 6,5,(插入值),3(表目标节点),2,1
                --情况2 :将一个节点插入到目标节点3的 "后" 面,则5,4,3排序值加1,就变成了 6,5,4(目标节点),(插入值),2,1
                if(@dir>0)--前面
                    begin
                        update tb_tree set sort=sort+1 where pId=@newpId and sort>=@newSibsort+1    --前面(@newSibsort=3)
                    end
                else--后面
                    begin
                        update tb_tree set sort=sort+1 where pId=@newpId and sort>=@newSibsort    --后面(@newSibsort=3)
                    end     
                --重新给目标节点赋值(前面(@dir=1):目标节点排序不变等于3,后面(@dir=0):目标节点排序加1等于4)
                select @newSibsort=sort from tb_tree where id=@sibId
                --修改自己的排序
                update tb_tree set sort=@newSibsort+@dir where id=@id
            end
        else
            begin
                --修改自己的排序
                update tb_tree set sort=0 where id=@id
            end
    go
    
    
    --修改父节点子节点数量
    --修改兄弟节点的排序
    
    
    --修改自身及其子节点的深度
    if exists (select * from sysobjects where name='proc_tree_level')
    drop proc proc_tree_level
    go
    create proc proc_tree_level(@id int,@level int)
    as
        declare @count int,@tmpId int
        select @count=COUNT(1) from tb_tree where pId=@id
        if(@count<>0)--判断是否有子节点
        begin
            declare cur_level cursor local for select id from tb_tree where pId=@id
            open cur_level
           fetch next from cur_level into @tmpId
           while(@@FETCH_STATUS=0)
           begin
                exec proc_tree_level @tmpId,@level
                fetch next from cur_level into @tmpId
           end    
           close cur_level
           deallocate cur_level
        end
        update tb_tree set level=level+@level where id=@id 
    go
    
    --修改父节点的子节点个数
    if exists (select * from sysobjects where name='proc_tree_cNum')
    drop proc proc_tree_cNum
    go
    create proc proc_tree_cNum(@pId int,@cNum int)
    as
        declare @tmpId int
        select @tmpId=pId from tb_tree where id=@pId
        if(@tmpId<>0)
        begin
            exec proc_tree_cNum @tmpId,@cNum
        end
        update tb_tree set cNum=cNum+@cNum where id=@pId
    go
    
    
    --添加节点
    if exists (select * from sysobjects where name='proc_tree_add')
    drop proc proc_tree_add
    go
    create proc proc_tree_add(@name varchar(50),@pId int)
    as
        declare @pLevel int,@pCNum int
        select @pLevel=level,@pCNum=cNum from tb_tree where id=@pId
        begin try
            begin tran
                insert into tb_tree(name,pId,level,sort,cNum) values(@name,@pId,@pLevel+1,0,0);--添加节点
                exec proc_tree_cNum @pId,1--修改父节点的子节点个数
            commit tran
        end try
        begin catch
            rollback tran
        end catch
    go
        
    
    select * from tb_tree
    --exec proc_tree_add '节点1-1-4',2
    --exec proc_tree_cNum 4,1
    --exec proc_tree_level 1,2;
    exec proc_tree_move 6,1,2,-1;
    select * from tb_tree
    
    
    
    
    
    
    
        
  • 相关阅读:
    css中单位的使用
    css中max-width和min-width的应用
    css-样式初始化
    html中map标签和area标签的应用
    html中常见的小问题(1)
    防止图片被盗用
    关于thinkphp的__construct和_initialize
    禁用cookie后如何使用session还有session_id的使用
    is_null(self::$_instance) && self::$_instance = new self();
    echo、print、print_r、printf、sprintf、var_dump的区别
  • 原文地址:https://www.cnblogs.com/wzq806341010/p/3448217.html
Copyright © 2011-2022 走看看