一、总体说明
先看一下文章管理设想要实现的功能:
再看一下类图
这里Category是栏目;CommonModel是公共模型;Article是文章;Attachment是附件;
CommonModel是内容管理这块抽取出来的公共部分,像文章,咨询甚至产品都有一些共同的内容这里把它单独提取出来作为一个类。CommonModel可能包含一片文章,包含一组附件,包含一系列评论,他们之间的关系类图中已经表示出来。
模型
1、栏目模型—Category类
public class Category
{
[Key]
[Display(Name = "栏目ID")]
public int CategoryId { get; set; }
/// <summary>
/// 栏目名称
/// </summary>
[Display(Name = "栏目名称", Description = "2-20个字符")]
[Required(ErrorMessage = "×")]
[StringLength(20, MinimumLength = 2, ErrorMessage = "×")]
public string Name { get; set; }
/// <summary>
/// 父栏目编号
/// </summary>
[Display(Name = "父栏目")]
[Required(ErrorMessage = "×")]
public int ParentId { get; set; }
/// <summary>
/// 父栏目路径【根节点的值为0,子节点的值为:0,1,6,76】
/// </summary>
[Display(Name = "父栏目地址", Description = "最多255个字符。")]
[StringLength(255, ErrorMessage = "×")]
public string ParentPath { get; set; }
/// <summary>
/// 栏目类型【0-常规栏目;1-单页栏目;2-外部链接】
/// </summary>
[Display(Name = "栏目类型")]
[Required(ErrorMessage = "×")]
public int Type { get; set; }
/// <summary>
/// 内容模型【仅在栏目为普通栏目时有效】
/// </summary>
[Display(Name = "内容模型")]
public string Model { get; set; }
/// <summary>
/// 栏目视图
/// </summary>
[Display(Name = "栏目视图", Description = "栏目页的视图,最多255个字符。。")]
[StringLength(255, ErrorMessage = "×")]
public string CategoryView { get; set; }
/// <summary>
/// 内容排序
/// </summary>
[Display(Name = "内容排序", Description = "栏目所属内容的排序方式。")]
public int ContentOrder { get; set; }
/// <summary>
/// 内容页视图
/// </summary>
[Display(Name = "内容视图", Description = "内容页视图,最多255个字符。。")]
[StringLength(255, ErrorMessage = "×")]
public string ContentView { get; set; }
/// <summary>
/// 栏目排序
/// </summary>
[Display(Name = "栏目排序", Description = "数字越小顺序越靠前。")]
public int Order { get; set; }
/// <summary>
/// 链接地址
/// </summary>
[Display(Name = "链接地址", Description = "点击栏目时跳转到的链接地址,最多255个字符。")]
[StringLength(255, ErrorMessage = "×")]
public string LinkUrl { get; set; }
/// <summary>
/// 记录名称
/// </summary>
[Display(Name = "记录名称", Description = "记录的名称。如“文章”、“新闻”、“教程”等。")]
[StringLength(255, ErrorMessage = "×")]
public string RecordName { get; set; }
/// <summary>
/// 记录单位
/// </summary>
[Display(Name = "记录单位", Description = "记录的数量单位。如文章为“篇”;新闻为“条”。")]
[StringLength(50, ErrorMessage = "×")]
public string RecordUnit { get; set; }
/// <summary>
/// 栏目说明
/// </summary>
[Display(Name = "栏目描述")]
[Required(ErrorMessage = "×")]
public string Description { get; set; }
/// <summary>
/// 栏目关键字
/// </summary>
[Display(Name = "栏目关键字", Description = "最多255个字符。")]
[StringLength(255, ErrorMessage = "×")]
public string MetaKeywords { get; set; }
/// <summary>
/// 栏目描述
/// </summary>
[Display(Name = "栏目描述", Description = "最多500个字符。")]
[StringLength(500, ErrorMessage = "×")]
public string MetaDescription { get; set; }
/// <summary>
/// 每页记录数
/// </summary>
[Display(Name = "每页记录数")]
[Required(ErrorMessage = "×")]
public int PageSize { get; set; }
public Category()
{
ParentPath = "0";
Type = 0;
CategoryView = "Index";
ContentView = "Index";
Order = 0;
ContentOrder = 1;
PageSize = 20;
RecordUnit = "条";
RecordName = "篇";
}
}
2、文章模型—Article类
public partial class Article
{
[Key]
public int ArticleID { get; set; }
/// <summary>
/// 作者
/// </summary>
[Display(Name = "作者")]
[StringLength(50, ErrorMessage = "必填少于{0}个字")]
public string Author { get; set; }
/// <summary>
/// 摘要
/// </summary>
[Display(Name = "摘要")]
[StringLength(255, ErrorMessage = "必填少于{0}个字")]
public string Intro { get; set; }
/// <summary>
/// 内容
/// </summary>
[Display(Name = "内容")]
[Required(ErrorMessage = "必填")]
[DataType(DataType.Html)]
public string Content { get; set; }
/// <summary>
/// 模型id
/// </summary>
[Display(Name = "公共模型编号")]
[Required(ErrorMessage = "×")]
public int ModelID { get; set; }
/// <summary>
/// 来源
/// </summary>
[Display(Name = "来源")]
[StringLength(50, ErrorMessage = "必填少于{0}个字")]
public string Source { get; set; }
/// <summary>
/// 公共模型
/// </summary>
public virtual CommonModel CommonModel { get; set; }
}
3.公共字段模型,CommonModel类
public class CommonModel
{
[Key]
public int ModelID { get; set; }
/// <summary>
/// 栏目Id
/// </summary>
[Display(Name = "栏目")]
[Required(ErrorMessage = "×")]
public int CategoryID { get; set; }
/// <summary>
/// 录入者
/// </summary>
[Display(Name = "录入者")]
[Required(ErrorMessage = "×")]
[StringLength(255, ErrorMessage = "×")]
public string Inputer { get; set; }
/// <summary>
/// 模型名称
/// </summary>
[Display(Name = "模型名称")]
[Required()]
[StringLength(50)]
public string Model { get; set; }
/// <summary>
/// 标题
/// </summary>
[Display(Name = "标题")]
[Required(ErrorMessage = "×")]
[StringLength(255, ErrorMessage = "×")]
public string Title { get; set; }
/// <summary>
/// 点击
/// </summary>
[Display(Name = "点击")]
[Required(ErrorMessage = "×")]
public int Hits { get; set; }
/// <summary>
/// 发布日期
/// </summary>
[Display(Name = "发布日期")]
[Required(ErrorMessage = "×")]
public DateTime ReleaseDate { get; set; }
/// <summary>
/// 状态【0-待审核;1-正常】
/// </summary>
[Display(Name = "状态")]
[Required(ErrorMessage = "×")]
public int Status { get; set; }
/// <summary>
/// 首页图片
/// </summary>
[Display(Name = "首页图片")]
[StringLength(255, ErrorMessage = "×")]
public string DefaultPicUrl { get; set; }
/// <summary>
/// 评论状态
/// </summary>
[Display(Name = "评论状态")]
[Required(ErrorMessage = "×")]
public bool CommentStatus { get; set; }
public CommonModel()
{
ReleaseDate = System.DateTime.Now;
}
/// <summary>
/// 栏目
/// </summary>
public virtual Category Category { get; set; }
/// <summary>
/// 文章
/// </summary>
// public virtual Article Article { get; set; }
/// <summary>
/// 咨询
/// </summary>
public virtual Consultation Consultation { get; set; }
public virtual ICollection<Attachment> Attachment { get; set; }
/// <summary>
/// 状态列表,只读静态变量
/// </summary>
public static Dictionary<int, string> StatusList
{
get
{
return new Dictionary<int, string>() {
{ -3, "删除" },
{ -2, "退稿" },
{ -1, "草稿" },
{0,"未审核"},
{99,"正常"}
};
}
}
}
4.附件模型 -- Attachment类
public class Attachment
{
[Key]
public int AttachmentID { get; set; }
/// <summary>
/// 扩展名
/// </summary>
[Display(Name = "扩展名")]
[Required(ErrorMessage = "×")]
[StringLength(50, ErrorMessage = "×")]
public string Extension { get; set; }
/// <summary>
/// 文件路径
/// </summary>
[Display(Name = "文件路径")]
[Required(ErrorMessage = "×")]
[StringLength(255, ErrorMessage = "×")]
public string FileParth { get; set; }
/// <summary>
/// 模型ID
/// </summary>
[Display(Name = "模型ID")]
[Required(ErrorMessage = "×")]
public int ModelID { get; set; }
/// <summary>
/// 拥有者
/// </summary>
[Display(Name = "拥有者", Description = "最多100个字符。")]
[StringLength(100,ErrorMessage ="×")]
public string Owner { set; get; }
/// <summary>
/// 附件类型 image,flash,media,file 四种类型
/// </summary>
[Display(Name = "附件类型")]
[Required(ErrorMessage = "×")]
[StringLength(100, ErrorMessage = "×")]
public string Type { get; set; }
/// <summary>
/// 上传日期
/// </summary>
[Display(Name = "上传日期")]
[Required(ErrorMessage = "×")]
[DataType(DataType.DateTime)]
public DateTime UploadDate { get; set; }
}
二、搭建架构
这个顺序根以前一样
1、IDAL
在IDAL添加接口InterfaceCommonModelRepository,其实只是继承自InterfaceBaseRepository,没有添加任何其他内容。
namespace Ninesky.IDAL
{
/// <summary>
/// 公共模型接口
/// <remarks>
/// 创建:2014.02.23
/// 修改:2014.02.28
/// </remarks>
/// </summary>
public interface InterfaceCommonModelRepository:InterfaceBaseRepository<Models.CommonModel> {
}
}
再依次添加InterfaceCategory,InterfaceArticle,InterfaceAttachment,方式和公共模型接口相同。
2、DAL
DAL中是对IDAL接口的实现,还是从CommonModel开始,先添加CommonModelRepository,也是跟原来一样直接继承没有什么代码。
namespace Ninesky.DAL
{
/// <summary>
/// 公共模型仓储
/// <remarks>
/// 创建:2014.02.23
/// </remarks>
/// </summary>
public class CommonModelRepository:BaseRepository<Models.CommonModel>, IDAL.InterfaceCommonModel
{
}
}
然后依次添加CategoryRepository,ArticleRepository,AttachmentRepository。
3.IBLL
这次先从InterfaceCategoryService开始,InterfaceArticleService,InterfaceCommentService,InterfaceAttachmentService。InterfaceCommonModelService内容较多放在最后。
InterfaceCategoryService
具体功能会在做栏目的时候再写,这里暂时空着。
namespace Ninesky.IBLL
{
/// <summary>
/// 栏目服务接口
/// <remarks>
/// 创建:2014.02.23
/// </remarks>
/// </summary>
public class InterfaceCategoryService:InterfaceBaseService<Models.Category>
{
}
}
4.BLL
同样先从CategoryService开始,然后依次添加ArticleService,AttachmentService。CommonModelService。
using Ninesky.DAL;
using Ninesky.IBLL;
using Ninesky.Models;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Ninesky.BLL
{
/// <summary>
/// 栏目服务
/// <remarks>
/// 创建:2014.02.27
/// </remarks>
/// </summary>
public class CategoryService:BaseService<Category>,InterfaceCategoryService
{
public CategoryService() : base(RepositoryFactory.CategoryRepository) { }
}
}
5、Web
在web项目的Member区域下添加三个空控制器。
栏目控制器CategoryController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Ninesky.IBLL;
using Ninesky.BLL;
using Ninesky.Models;
namespace Ninesky.Web.Areas.Member.Controllers
{
[Authorize]
public class CategoryController : Controller
{
private InterfaceCategoryService categoryRepository;
public CategoryController() { categoryRepository = new CategoryService(); }
}
}
文章控制器ArticleController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Ninesky.Models;
using Ninesky.IBLL;
using Ninesky.BLL;
namespace Ninesky.Web.Areas.Member.Controllers
{
public class ArticleController : Controller
{
private InterfaceArticleService articleService;
private InterfaceCommonModelService commonModelService;
public ArticleController() { articleService = new ArticleService(); commonModelService = new CommonModelService(); }
}
}
附件控制器AttachmentController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
using System.Web;
using System.Web.Mvc;
using System.IO;
using Ninesky.IBLL;
using Ninesky.BLL;
using Ninesky.Models;
namespace Ninesky.Web.Areas.Member.Controllers
{
/// <summary>
/// 附件控制器
/// <remarks>
/// 创建:2014.03.05
/// </remarks>
/// </summary>
[Authorize]
public class AttachmentController : Controller
{
}
}