`
raisun_1988
  • 浏览: 117881 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

无限级分类设计--纯数据库实现

    博客分类:
  • .Net
阅读更多
【网上购物论坛】-IT泡吧![Www.itpob.Cn]网上购物社区! - Powered by Discuz!
http://www.itpob.cn/
最近在做个CMS系统,要做无限级 分类 。开始在网上找,希望能有现成的拿来就用,结果没搜到满意的,要吗操作复杂,要吗结构复杂,于是想自己倒腾一个,结果还算满意。 1、表结构: 2、查询所有分类(树型) Select * from Category Order By OrderPath 3、查
  

最近在做个CMS系统,要做无限级分类。开始在网上找,希望能有现成的拿来就用,结果没搜到满意的,要吗操作复杂,要吗结构复杂,于是想自己倒腾一个,结果还算满意。

1、表结构:

2、查询所有分类(树型)

Select * from Category Order By OrderPath

 3、查询某个分类(这里假设该节点ID为 10)下属分类

   a、直接下属:Select * From Category Where ParentId=10

   b、本身及所有子节点:Select * From Category Where ParentPath Like '10%' Order By OrderPath

   c、所有下属子节点(不含本身):Select * From Category Where ParentPath Like '10,%' Order By OrderPath

4:添加分类(存储过程实现):

create   proc Proc_InsertCategory(
 @CategoryName varchar(50),
 @ParentId int,
 @Remark varchar(250)
) as
begin
 declare @KeyId varchar(40)
 declare @OrderId int
 declare @CategoryId int 
 declare @Path varchar(900)
 declare @OrderPath varchar(900)
 select @KeyId=NewId()
 if @ParentId > 0
  Select @OrderId=IsNull(Max(OrderId),0) + 1 From Category Where ParentId=@ParentId
 else
  Select @OrderId=IsNull(Max(OrderId),0) + 1 From Category Where ParentId=CategoryId  
 
 Insert Into Category(ChannelId,KeyId,CategoryName,ParentId,OrderId,Child,Remark)
  Values(@ChannelId,@KeyId,@CategoryName,@ParentId,@OrderId,0,@Remark)
 Select @CategoryId=CategoryId From Category Where KeyId=@KeyId
 if @ParentId > 0
 begin
  select @Path=ParentPath,@OrderPath=OrderPath From Category Where CategoryId=@ParentId
  Update Category Set ParentPath=@Path + ',' + Cast(@CategoryId As Varchar(10)),OrderPath=@OrderPath + ',' + Cast(@OrderId As Varchar(10)) Where CategoryId=@CategoryId  
  Update Category Set Child=Child + 1 Where CategoryId=@ParentId
 end
 else
  Update Category Set ParentId=@CategoryId,Path=Cast(@CategoryId As Varchar(10)),OrderPath=Cast(@OrderId As Varchar(10)) Where CategoryId=@CategoryId
 Select @CategoryId
end

5、顺序调整:

--辅助过程
create   Proc Proc_ResetCategoryOrder(
 @CategoryId int,
 @OrderId int
) as
begin
 Update Category
  Set OrderId=@OrderId,OrderPath=(Select OrderPath From Category Where CategoryId=(Select ParentId From Category Where CategoryId=@CategoryId)) + ',' + cast(@OrderId As varchar(10))
 Where CategoryId=@CategoryId

 Update Category
  Set OrderPath=(Select OrderPath From Category Where CategoryId=@CategoryId) + ',' + cast(OrderId As varchar(10))
 Where ParentPath like (Select ParentPath From Category Where CategoryId=@CategoryId) + ',%'
end

--修改分类序号

create   Proc Proc_ChangeCategoryOrder(
 @CategoryId int,
 @NewOrderId int
) as
begin
 exec Proc_ResetCategoryOrder @CategoryId,@NewOrderId
 declare @OldOrderId int
 declare @ParentId int
 declare @cid int
 declare @oid int
 Select @OldOrderId=OrderId,@ParentId=ParentId From Category Where CategoryId=@CategoryId
 if @OldOrderId=@NewOrderId
  return
 declare @Relation_Category cursor

 if @ParentId = @CategoryId
 begin
  if @OldOrderId>@NewOrderId
   set @Relation_Category = cursor for select CategoryId,OrderId+1 From Category Where CategoryId=ParentId And OrderId<@OldOrderId And OrderId>@NewOrderId
  else
   set @Relation_Category = cursor for select CategoryId,OrderId-1 From Category Where CategoryId=ParentId And OrderId>@OldOrderId And OrderId<@NewOrderId
 end
 else
 begin
  if @OldOrderId>@NewOrderId
   set @Relation_Category = cursor for select CategoryId,OrderId+1 From Category Where CategoryId=@ParentId And OrderId<@OldOrderId And OrderId>@NewOrderId
  else
   set @Relation_Category = cursor for select CategoryId,OrderId-1 From Category Where CategoryId=@ParentId And OrderId>@OldOrderId And OrderId<@NewOrderId
 end
 open @Relation_Category
 fetch next from @Relation_Category into @cid,@oid
 while @@fetch_status=0
 begin
  exec Proc_ResetCategoryOrder @cid,@oid 
  fetch next from @Relation_Category into @cid,@oid
 end
 close @Relation_Category
 DEALLOCATE @Relation_Category
end

 6、删除分类:

 Delete From Category Where ParentPath Like (Select ParentPath From Category Where CategoryId=@CategoryId) + '%'

7、修改:

就只是修改名称和备注,直接更新就可以了

开始的时候觉得好像很难,做出来了才发现,很简单的嘛

欢迎朋友们点评哈~

分享到:
评论

相关推荐

    无限级级联菜单源码,asp.net,ajax

    在IT领域,尤其是在Web开发中,无限级级联菜单是一种常见的交互设计,它允许用户通过逐级下拉的方式来浏览和选择深层次的结构化数据。在本案例中,我们讨论的是一段实现这种功能的源码,它基于ASP.NET和AJAX技术栈。...

    纯ajax 无限级 树形 菜单 源码+.rar

    标题中的“纯ajax 无限级 树形 菜单 源码”指的是一个使用纯JavaScript(通过AJAX技术)实现的无限级树形菜单的源代码。这个菜单允许用户在不刷新整个页面的情况下,动态加载和展示层级结构的数据,提供了一种高效的...

    ASP.NET-[其他类别]坏孩子无限级树型菜单.zip

    TreeView控件允许通过数据绑定将数据源(例如,数据库中的分类或用户角色)映射到树形结构。在这个例子中,"坏孩子"可能指的是这个菜单的非传统设计或实现方式。 为了创建无限级树,我们需要一个数据源来存储每个...

    MultitouchPS 1.0绿色版

    这款软件采用纯绿色设计,无需安装任何数据库,极大地降低了用户的使用门槛。用户只需将产品分类以文件夹的形式组织,而每个产品的信息则通过图片来呈现。这种简洁明了的设计使得即使是对技术不太熟悉的用户也能轻松...

    阿赛企业网站系统 17.rar

    内容集合储存,方便全局管理,设有频道、无限级分类方便归类各内容;已有开发频道产品、文章、商城、图片、多媒体(播放影音视频)、介绍、资质、照片、链接等,支持无限复制,并可自行拓展其他功能;加入点击访问数...

    Angel企业网站管理系统 v1.0 (蓝色风格).zip

    3、Angelcms实现了无限级板块分类,方便内容划分;无限级子栏目分类,清晰展现多级内容。采用符合 DIV CSS规范布局。 4、网站采用三种页面处理技术,可以生成纯静态网页模式、在不使用asp.net其余为静态插件的前提...

    Angel工作室(Angelcms!NT) 蓝色企业网系统V1.0

    3、Angelcms实现了无限级板块分类,方便内容划分;无限级子栏目分类,清晰展现多级内容。采用符合 DIV+CSS规范布局。 4、网站采用三种页面处理技术,可以生成纯静态网页模式、在不使用asp.net其余为静态插件的前提...

    阿赛企业网站系统 v19.zip

    内容集合储存,方便全局管理,设有频道、无限级分类方便归类各内容; 已有开发频道产品、文章、商城、图片、多媒体(播放影音视频)、介绍、资质、照片、链接等,支持无限复制,并可自行拓展其他功能; 加入点击...

    阿赛企业网站系统源码 v16

    实现您要求的所有常用功能,基于ASP+ACCESS或MSSQL动静(可生成HTML)双态自由切换的终极企业建站系统,提供文章、产品、商品交易、下载、图片、视频、介绍、资质证书、招聘、友情链接等模块可无限制增减频道、无限级...

    阿赛企业网站系统源码 v17

    实现您要求的所有常用功能,基于ASP+ACCESS或MSSQL动静(可生成HTML)双态自由切换的终极企业建站系统,提供文章、产品、商品交易、下载、图片、视频、介绍、资质证书、招聘、友情链接等模块可无限制增减频道、无限级...

Global site tag (gtag.js) - Google Analytics