.net网站内容管理系统(构建无限级别菜单,SQL有了,对SQL的执行还难吗?)

优采云 发布时间: 2021-10-18 04:00

  .net网站内容管理系统(构建无限级别菜单,SQL有了,对SQL的执行还难吗?)

  cms 在内容管理中,类别是一个非常重要的部分,尤其是多级分类。理论上,可以建立无限的级别。当然,在实际使用中,最多3-4级就很多了。本文主要从数据库的角度介绍品类管理的核心算法。有了SQL,执行SQL难吗?

  cms 在内容管理中,类别是一个非常重要的部分,尤其是多级分类。理论上,可以建立无限的级别。当然,在实际使用中,最多3-4级就很多了。本文主要从数据库的角度介绍品类管理的核心算法。有了SQL,执行SQL难吗?

  先看demo(如果需要登录,用户名admin,密码123456)

  (全站演示:登录后即可看到管理中心)

  

  构建一个无限级菜单,需要有两个核心ID,一个是类别的ID,一个是ID的父ID——parentID。此外,您可以添加有关类别的附加信息,例如名称、显示顺序等。

  为此,在Dotnetcms中建立了一个portal_category表(注:这里的分类是指博主在博客园中的文章,但找了半天也没找到是谁写的)

  

  

  代码

  

CREATE TABLE [dbo].[portal_category](

[id] [int] IDENTITY(1,1) NOT NULL,

[catname] [nvarchar](50) NULL,

[parentid] [int] NULL,

[orderid] [int] NULL,

[depth] [int] NULL,

[fullpathname] [nvarchar](300) NULL,

[fullids] [nvarchar](150) NULL,

[url] [nvarchar](200) NULL,

[haschild] [int] NULL,

[path] [nvarchar](1000) NULL,

[target] [nvarchar](50) NULL,

CONSTRAINT [PK_portal_category] PRIMARY KEY CLUSTERED

(

[id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

  接下来,您可以添加,删除,读取和写入类别,更不用说了。

  然而,品类的管理并不是那么简单。

  首先介绍一下分类的移动(这里的移​​动是手动选择分类的子分类,不支持鼠标拖动),DEMO体验:

  在实际使用中,当用户将一个类别移动到另一个类别时,需要考虑如何更新子类别,因为一个类别可能有子类别。移动后,除了在新的类别中添加子类别外,还需要删除旧的类别。子类

  为此,我们在 photoes_category 中添加了数据库的冗余字段路径。这有两个优点。path 字段用于存储类别的级别。Path存储类别的值类似于A、AB、ABC;B、BC、BCD等与此信息类似,所以如果需要获取某个类别下的词类别,只需使用

  ALTER Proc [dbo].[sp_portal_GetSubCategory](

@path nvarchar(20)

)

as

Begin

select * from Catalog where path like @path+'%'

End

  也就是说,另一个好处是它将提高访问系统的性能。毕竟,执行最后一条 SQL 语句比递归计算一个节点的子节点要快。

  接下来就可以写SQL语句来更新分类了

  

/****** Object: StoredProcedure [dbo].[sp_portal_movecategory] Script Date: 05/08/2010 09:36:17 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER PROCEDURE [dbo].[sp_portal_movecategory]

(

@ParentID int,--新父节点

@CataID int,--要移动的节点编号

@CataPath varchar(20) output,--新移动后的节点路径

@orderid int,

@catname nvarchar(200),

@url nvarchar(500)

)

AS

if not exists(select 1 from portal_category where ID = @ParentID)

begin

update portal_category set orderid=@orderid , catname=@catname, url=@url where id=@cataid

set @CataPath = '' -- 如果新父节点不存在,

end

else

begin

declare @oldParentID int -- 原来的父节点

select @oldParentID = ParentID from portal_category where ID = @CataID

if @oldParentID = @ParentID -- 没有移动

begin

update portal_category set orderid=@orderid , catname=@catname, url=@url where id=@cataid

select @CataPath = path from portal_category where ID = @CataID

end

else

begin

declare @pathLength int

declare @path varchar(20)

select @path = max(Path) from portal_category where parentID =@parentId --order by Path desc

select @pathLength = len(@path)

print @pathLength

declare @newpath varchar(20)-- 计算移动到新分类后的节点路径

if @pathLength > 0 -- 已经存在该父类

select @newpath = substring(@path,1,@pathLength -1)+CHAR(ASCII(REVERSE(@path))+1)

else

select @newpath = path + 'A' from portal_category where ID = @parentID

if len(@newpath) > 0

begin

declare @oldPath varchar(20)-- 记录原来的节点路径

select @oldPath = Path from portal_category where ID = @CataID

set @CataPath = @newpath;

update portal_category set orderid=@orderid, catname=@catname, url=@url, ParentID = @ParentID,Path = @newpath where ID = @CataID

-- 替换子类的Path

update portal_category set Path = stuff(path,1,len(@oldPath),@CataPath) where Path like @oldPath+'%'

end

else

set @CataPath = ''

end

end

  随着类别的添加和更新(包括类别移动),接下来会显示类别。对于无限排序的列表,唯一合适的控件应该是 Treeview。

  TreeView 空间使用起来比较简单。首先需要获取数据源,所以我们建立递归方法

  

public static void CreateTreeViewRecursive(TreeNodeCollection nodes, DataTable dataSource, int parentid)

{

string filter;

filter = string.Format("parentid={0}", parentid); //从0开始,可以自设

DataRow[] drarr = dataSource.Select(filter);

TreeNode node;

foreach (DataRow dr in drarr)

{

node = new TreeNode();

node.Text = (string)dr["catname"];

node.Value = dr["id"].ToString();

node.NavigateUrl = "addeditcategory.aspx?id="+dr["id"].ToString();

node.Target = "_blank";

nodes.Add(node);

CreateTreeViewRecursive(node.ChildNodes, dataSource, int.Parse(node.Value));

}

}

  从数据库中读取类别信息

  接下来在PageLoad中绑定数据源

  

if (!Page.IsPostBack)

{

DataSet ds = 执行 select * from portal_category order by orderid 语句返回DataSet

CreateTreeViewRecursive(TreeView1.Nodes, ds.Tables[0], 0);

}

  页面前台很简单,一句话就OK

  这样就完成了一个不限级别的分类管理

  -------------------------------------------------- -------------------------------------------------- ------------------------

  以下是广告时间

  Dotnetcms Portal 将cms与部分OA集成,致力于企业内网的建设。Dotnetcms Portal 由一系列插件组成,demo demo

  会议室预订系统插件:Demo可以预订会议室

  调查插件:demo demo:可以对不懂技术的员工进行问卷调查

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线