开发环境: Visual Studio 2010(MVC3+EF4.0) + SQL2005
运行环境: .net framework 4.0 + SQL2005
1.为什么有两套程序?
YQBlog之前已经发布了两个版本,现在是1.2版本,YQCMS则是首次发布的1.0版本。
目前很多流行的博客程序,除了用作博客网站外,很多人还会把它进行改造来做企业站。虽然实质上都是内容管理,但基于业务的偏差还是会有不少程序上的需求差异。企业站的需求千差万别,如果我们想要去适用这些需求,则会导致程序的不断增长而变得庞大。如果仅仅作为一个博客程序来说话,这显然是不恰当的,所以就有的这样的分离。
YQBlog更专注于个人博客系统的需求。
YQCMS更注重网站程序的通用性,以期最大化的适应更多类型网站的需求。
2.程序架构简述
网站-->types-->categories-->articles
articledetail(seo信息)
extend(扩展信息)
这两套程序在数据库建模部分比较大的特点就是没有根据业务功能的差异去建表,比如,这里没有专门的留言表,评论表,论坛帖子表,相册表,文章表等。只有ariticle表以及articledetail表(seo信息)。YQCMS多一个extend表(扩展信息)。好比我们硬盘上不管你是放的苍井空还是东方时空都是表现为0和1.这里数据库里的数据表存的也就只是看起来差不多的数据。这些数据通过categories得以区分,表示它属于哪个分类,categories在前台界面的表现相当于网站导航,categories信息以json格式保存在js文件里,categories再通过types予以区分,表示它是属于论坛,相册,文章还是留言板,进而对数据进行差异的处理以及呈现,从而构成了我们整个网站。
types部分是硬编码在程序里的。可以理解为程序提供了哪些功能模块,比如YQBlog提供了文章,单页,相册,留言板,首页自定义区域,全网自定义区域这几个功能模块。YQCMS在其基础上还增加了论坛模块。基本上这些就是你利用目前的程序能做的事。
扩展新的功能模块:假如我们还需要扩展商城,微博,问答等模块。则只需要再增加一个对应的type,同时编写对应的业务逻辑代码。如果需求没有大的差异的话,基本上在article,categories部分的程序是通用的,我们只需要重点处理界面层即可。
总的来说,目前的程序架构很好的保证了功能模块可扩展性以及程序代码的通用性。
对于使用者来说,你可以把网站做的很简单,比如我只做一个日记本,那么仅仅创建一个文章类型的分类就好了,也可以很复杂,这完全取决于你在后台创建的分类模块的多少以及你的前台表现层视图。
3.多语言与模板切换
MVC在这两方面提供了很好的解决方案。
拿到源码后,打开会发现除了注释就再不到一个中文字,是的,我们把所有的文字描述都集中在了Resource资源项目中。如图。
3个文件分别表示英文,中文,繁体,上图是根据程序模块以不同文件夹归类,如果需要扩展其它语言,对应新增其语言文件就好了。基本上就是简单的复制粘贴工作。
模板切换
MVC中的模板切换实质是即时的改变视图引擎路径。实现很简单:
ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new BlogViewEngine(theme)); /// /// 自定义视图路径 /// public class BlogViewEngine : RazorViewEngine { public BlogViewEngine(string key) { string path = string.IsNullOrWhiteSpace(key)||key=="default" ? "~/Views" : "~/Themes/" + key; ViewLocationFormats = new[] { path+"/{1}/{0}.cshtml", path+"/{1}/{0}.vbhtml", path+"/Shared/{0}.cshtml", path+"/Shared/{0}.vbhtml" }; PartialViewLocationFormats = ViewLocationFormats; } }
MVC的Razor视图引擎个人觉得相比其它流行程序的模板制作来得更加直观,容易且得心应手。Razor语法也很简单,稍微会一些就可以轻松驾驭模板定制了,不懂后台编程的人,它就相当于一个html页,你可以完全把它当做html页来操作。懂后台编程的,你也可以在其中写c#程序,非常灵活。
打开http://www.yqhome.net/,右上角分别是语言以及模板的切换链接,实现即时交替切换,你可以发现这是很灵活的。模板切换也并不只是换了一个css显示样式,而是更换了整个表现层视图路径,就是说,你可以在多个完全不同的视图之间实现切换,使得看起来他们是完全不同的网站。
目前提供了3种语言2个模板,相当于2*3=6个不同样式网站。假如后期我又扩展到了6个不同语言以及10个模板风格。那我就有了60个不同的网站了:)
YQBLOG默认模板以及多语言设置
YQCMS默认模板以及多语言设置
YQCMS不同的语言可以设定不同的模板,这样可以让你的网站在不同语言切换时候呈现出完全不同的表现风格。
多语言网站内容独立:除了不同语言界面的差异外,这个设置可以使得你的不同语言的网站内容也完全独立。你可以根据你的需求来予以设置或者变更。
如何操作不同语言下的数据? 切换到不同的语言,即可对当前语言的下的数据进行操作。非常方便。
4.静态化
静态化在后台的相关设置:
是否启用静态url:前台文章页面可以在动态与静态url之间实时切换。不启用的时候则表现为其动态url.
比如:
http://www.yqhome.net/archive/671
http://www.yqhome.net/static/2012/09/671.html
他们是同一个页面,前者是动态路径,后者是已经生成为html页面的静态路径。
这里也许你会有一个问题,静态化与多语言多模板之间的关系。前面说到假如你6个不同语言以及10个模板风格。那就相当于是60个不同的网站,静态化的时候也是一个页面生成60个版本的html页吗?
这里的处理是页面会依据你设置的默认模板,默认语言,以及勾选的多语言项来进行生成。6个不同语言以及10个模板风格,则会生成6个不同语言的静态页。
也就是,一个文章页会基于你的“默认模板”,生成你“勾选的多语言项”个数的不同语言静态页面,其中除默认语言外的其它语言静态页都会加入其语言关键字路径。如:
http://www.yqhome.net/static/en-us/2012/09/671.html
http://www.yqhome.net/static/zh-tw/2012/09/671.html
当切换到非默认模板的其它模板时候,页面会以动态url来呈现。
如果你中途更换默认模板或者默认语言,同时又需要启用静态url。那么你需要把之前的静态页再重新整体生成。
是否生成文章html页 :如果 是否启用静态url 是 yes,这里也必须是yes.
静态化目录(可用{year}{month}{day}表示当前年,月,日):
这个格式是约定好了的,然后你可以自定义路径名称以及层级。
页面批量生成:
5.扩展字段
YQCMS中加入了扩展字段功能,综合了很多方案,最后还是采用了最简单直接的预留字段的方法。原理很简单,新增一个extend表10个字段,用来应对可能的差异化需求。这个部分处理的重点主要在于后台相关功能的界面处理,让它对于用户来说会“很好用”。
在“网站-->types-->categories-->articles”结构层级下
扩展是表现于articles部分的扩展,但扩展的设置可以分别定义在types或者categories上,这里会遵循一个覆盖以及继承的关系。就是说你可以整体定义文章类型所需的扩展字段,同时也可以在下面某个具体分类下定义扩展。规则就是:下级没有时会继承,有的话则采用自身的定义。
6.提交到YQHome.net
如果你的网站上线了,可以通过后台首页的这个功能把你的网站信息提交到YQHome.net。分享的同时也提高网站的点击率。
这个过程原理上就是生成一个site.htm静态页,提交过程就是访问一下www.yqhome.net的指定页面,该页会负责采集你的site.htm数据予以入库。这里是生成一条"案例"文章记录以及在论坛"案例展示"的帖子下追加一条回帖。
eg:http://www.yqhome.net/forum/thread/664#f_1