通过一个简单的CMS文章系统,来学习MVC3+LINQ网站搭建。
第一篇: 数据库建模
文章分类信息Category存储为json文本。一个article文章表,一个users用户表。一个文章信息视图varticle
(1)文章分类信息:
很多网站分类信息的改动其实很少,所以这里索性存储为文本的格式。分类信息通常不会有太多数据,修改也很直观。
数据格式:
[
{"Cateid":1,"CateName":"Item01","IsList":0,"OrderId":1,"ReplyPermit":0,"ParentId":0,"Status":1},
{"Cateid":2,"CateName":"Item02","IsList":1,"OrderId":2,"ReplyPermit":1,"ParentId":0,"Status":1},
{"Cateid":3,"CateName":"Item03","IsList":1,"OrderId":3,"ReplyPermit":0,"ParentId":0,"Status":1},
{"Cateid":4,"CateName":"Item03_1","IsList":1,"OrderId":1,"ReplyPermit":0,"ParentId":3,"Status":1},
{"Cateid":5,"CateName":"Item03_2","IsList":1,"OrderId":2,"ReplyPermit":0,"ParentId":3,"Status":1},
{"Cateid":6,"CateName":"Item06","IsList":0,"OrderId":4,"ReplyPermit":0,"ParentId":0,"Status":1}
]
字段分别表示
Cateid:分类Id
CateName:分类名称
IsList:是否显示为列表,1为列表,0表示单页,比如新闻中心为1,联系我们为0
OrderId:排序id
ReplyPermit:是否可评论
ParentId:父id
Status:状态Id
(2)创建数据库表/视图
-- 新建数据库
create database YqCms
use YqCms
--文章表
create table article
(
id
int identity(
1,
1)
primary key,
cateid
int not null constraint df_article_cateid
default(
0),
--类别id
catepath
nvarchar(
200)
not null constraint df_article_catepath
default(
'0'),
--基于类别的纵深路径 ,eg.0,1,124
articleid
int not null constraint df_article_articleid
default(
0),
--文章id 值为某id
parentid
int not null constraint df_article_parentid
default(
0),
--父id 值为某id
layer
int not null constraint df_article_layer
default(
0),
--层,eg.文章值为0,文章回复1,回复再回复2
subcount
int not null constraint df_article_subcount
default(
0),
--子数据统计数
catename
nvarchar(
200)
not null constraint df_article_catename
default(
'0'),
-- 这里方便读取数据记入类别名称
userid
int not null constraint df_article_userid
default(
0),
--用户ID
username
nchar(
20)
not null constraint df_article_username
default(
''),
--用户名
title
nvarchar(
200)
not null constraint df_article_title
default(
''),
--标题
summary
nvarchar(
500)
not null constraint df_article_summary
default(
''),
--摘要
content
ntext not null constraint df_article_content
default(
''),
--内容
viewcount
int not null constraint df_article_viewcount
default(
0),
--浏览统计
orderid
int not null constraint df_article_orderid
default(
1),
--排序
replypermit
tinyint not null constraint df_article_replypermit
default(
1),
--是否可回复,1-可,0-不可
status
tinyint not null constraint df_article_status
default(
0),
--状态,应付可能的删除,屏蔽等操作
ip
nvarchar(
20)
not null constraint df_article_ip
default(
''),
--ip
createdate
datetime not null constraint df_article_createdate
default(
getdate())
--创建时间
)
--Seo表
create table seo
(
articleid
int not null constraint df_seo_articleid
default(
0),
seotitle
nvarchar(
500)
not null constraint df_seo_title
default(
''),
seodescription
nvarchar(
1000)
not null constraint df_seo_description
default(
''),
seokeywords
nvarchar(
500)
not null constraint df_seo_keywords
default(
''),
seometas
nvarchar(
1000)
not null constraint df_seo_metas
default(
'')
)
--用户表
create table users
(
userid
int identity(
1,
1)
primary key,
username
nchar(
20)
not null constraint df_users_username
default(
''),
password
char(
32)
not null constraint df_users_password
default(
''),
typeid
tinyint not null constraint df_users_typeid
default(
0),
--用户类别
status
tinyint not null constraint df_users_status
default(
0),
--用户状态
createdate
datetime not null constraint df_users_createdate
default(
getdate())
)
--创建文章视图
create view varticle
asselect article.
*,
isnull(seotitle,
'')
as seotitle,
isnull(seodescription,
'')
as seodescription,
isnull(seokeywords,
'')
as seokeywords,
isnull(seometas,
'')
as seometas
from article
left join seo
on article.id
=seo.articleid
where article.layer
=0select * from article
select * from seo
select * from users
select * from varticle
(3)数据操作sql
--插入测试数据
declare @i intset @i=1while(
@i<100)
begininsert into article(cateid,catename,title,summary,content)
values(
3,
'分类名称',
'title '+cast(
@i as varchar),
'summary '+cast(
@i as varchar),
'content '+cast(
@i as varchar))
set @i=@i+1endupdate article
set articleid
=id
--文章录入存储过程
create procedure sp_createarticle
@cateid int,
@catepath nvarchar(
100),
@articleid int,
@parentid int,
@layer int,
@catename nvarchar(
100),
@userid int,
@username nchar(
20),
@title nvarchar(
200),
@summary nvarchar(
500),
@content ntext,
@replypermit tinyint,
@status tinyint,
@ip nvarchar(
20),
@seotitle nvarchar(
500),
@seodescription nvarchar(
1000),
@seokeywords nvarchar(
500),
@seometas nvarchar(
1000)
asdeclare @aid intinsert into article(cateid ,catepath ,articleid ,parentid ,layer ,catename ,userid ,username ,title ,summary ,
[content], replypermit,
[status], ip ,createdate)
values(
@cateid ,
@catepath ,
@articleid ,
@parentid ,
@layer ,
@catename ,
@userid ,
@username ,
@title ,
@summary ,
@content,
@replypermit,
@status ,
@ip ,
getdate() )
set @aid=SCOPE_IDENTITY()
if @@ERROR=0begin if @layer=0 begin update article
set articleid
=@aid WHERE id
=@aid if(
LTRIM(
@seotitle+@seodescription+@seokeywords+@seometas)
<>'')
begin insert into seo(articleid,seotitle,seodescription,seokeywords,seometas)
VALUES(
@aid,
@seotitle,
@seodescription,
@seokeywords,
@seometas)
end end else begin update article
set subcount
=subcount
+1 where id
=@parentid endendSELECT @aid as articleid
--测试插入
exec sp_createarticle
1,
'0',
0,
0,
0,
'category01',
0,
'',
'test_title',
'test_summary',
'test_content',
0,
0,
'192.168.1.1',
'test_seotitle',
'test_desc',
'test_keys',
'test_meta'
--文章修改存储过程
create procedure sp_updatearticle
@aid int,
@parentid int,
@title nvarchar(
200),
@summary nvarchar(
500),
@content ntext,
@replypermit tinyint,
@status tinyint,
@seotitle nvarchar(
500),
@seodescription nvarchar(
1000),
@seokeywords nvarchar(
500),
@seometas nvarchar(
1000)
asbegin --修改文章基础信息
update article
set title
=@title,summary
=@summary,
[content]=@content,replypermit
=@replypermit,
[status]=@status where id
=@aid --修改seo部分
if @parentid=0 begin delete from seo
where articleid
=@aid insert into seo(articleid,seotitle,seodescription,seokeywords,seometas)
VALUES(
@aid,
@seotitle,
@seodescription,
@seokeywords,
@seometas)
end select @@ERRORend--文章删除存储过程
create procedure sp_deletearticle
@aid int,
@parentid intasbegin if @parentid=0 begin --删除文章基础信息以及其子记录
delete from article
where articleid
=@aid --删除seo部分
delete from seo
where articleid
=@aid end else begin --删除文章基础信息
delete from article
where id
=@aid --删除可能有的子记录
while((
select count(
1)
from article
where parentid
<>0 and parentid
not in (
select id
from article))
>0)
begin delete from article
where parentid
<>0 and not exists(
select 1 from article b
where b.id
=article.parentid)
end end select @@ERRORend