一步步打造基于ASP.NET的CMS内容管理系统--Step1类别管理
2010-05-08 10:12
691 查看
CMS内容管理中,类别是很重要的一部,特别是多级分类的,理论上是可以建立无限级别的,当然实际使用中最多到3-4级也就很多了。本文主要从数据库的角度介绍类别的管理的核心算法,SQL有了,对SQL的执行还难吗?
先看演示 http://portal.dotnetcms.org/ep/portal/admin/Addeditcategory.aspx (如果需要登录,用户名是admin, 密码是123456)
(全站演示:http://portal.dotnetcms.org 登陆后即可看到管理中心)
代码
先看演示 http://portal.dotnetcms.org/ep/portal/admin/Addeditcategory.aspx (如果需要登录,用户名是admin, 密码是123456)
(全站演示:http://portal.dotnetcms.org 登陆后即可看到管理中心)
代码
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, http://portal.dotnetcms.org/ep/portal/admin/Mgrcategory.aspx" target=_blank> [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
[/code]
接下来就可以对类别进行增删读写,不在话下。
然而,类别的管理并不仅仅如此简单,
首先,介绍类别的移动(这里的移动是手动选择类别的子类别,不支持鼠标拖动),DEMO体验: [url=http://portal.dotnetcms.org/ep/portal/admin/Mgrcategory.aspx]http://portal.dotnetcms.org/ep/portal/admin/Mgrcategory.aspx
在实际使用中,当用户把一个类别移动到另外一个类别时,需要考虑如何更新子类别,因为一个类别可能还有子类别,移动后,除了新类别增加了子类,还需要删除旧类别的子类
为此,我们在photoes_category里增加了数据库的冗余字段path,这有两个好处,利用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<asp:TreeView runat="server" ShowLines="true" ID="TreeView1"></asp:TreeView>
这样,一个无限级类别的分类管理就完成了
----------------------------------------------------------------------------------------------------------------------------
以下是广告时间
Dotnetcms Portal集CMS与部分OA于一体,致力于企业内网建立,Dotnetcms Portal由一些列插件组成,Demo演示 [url=http://portal.dotnetcms.org]http://portal.dotnetcms.org
会议室预定系统插件:demo演示 http://demo.dotnetcms.org/dotnetcms 可以预定会议室
Survey调查插件: demo演示: http://demo.dotnetcms.org/survery/admin/step0.aspx 可以当不懂技术的员工制作问卷调查
...更多插件,您可以访问 http://www.dotnetcms.org/bbs/ 了解更多
相关文章推荐
- 一步步打造基于ASP.NET的CMS内容管理系统--Step4 权限设定(补充)
- 一步步打造基于ASP.NET的CMS内容管理系统--Step3 添加新闻页面
- 一步步打造基于ASP.NET的CMS内容管理系统--Step2 系统配置(附源代码)
- PlugNT CMS(自己开发的Asp.net内容管理系统)
- ASP.NET 内容管理系统 CMS 的体系结构
- OXite 微软一款基于asp.net mvc架构的blog内容管理系统
- 国内外一些知名asp.net CMS内容管理系统
- Umbraco一款开源的Asp.net CMS 内容管理系统
- Orchard 基于 ASP.NET MVC 技术的免费开源内容管理系统
- 采用ASP.NET开发的5个著名内容管理系统CMS
- ASP.NET 5个著名内容管理系统CMS
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之调整首页显示
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试
- TorCMS,基于Tornado的开源内容管理系统
- 北风网ASP.net版小孔子文章管理系统(CMS)2.0版本实战系列课程+通用OA系统全程开发
- 通用权限管理系统[基于asp.net(c# 4.0) + MVC 4 + extjs 4.2 + PetaPoco](一、搭架子 - 有源码)
- 基于ASP.NET MVC3+ADO.NET4+EF4.1+Jquery+插件等技术下的CRM企业客户管理系统
- DoraCMS 基于Nodejs+express+mongodb 内容管理系统
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之调整首页显示