去年这个时候也是8月份,离开了生活9年的福州来到厦门,已整整一年的时间。离开福州的原因,就是不想让自己在安逸中沉沦下去,需要重新寻找技术的激情。来到新公司后,也开始投入老板梦想中的那个伟大CMS的研发工作,至今仍在不断的忙碌。当时的我,对CMS的概念的并不是特别理解,时至今日,我仍然无法很清楚的定义什么才是CMS。CMS是Content Managment System的缩写,意为内容管理系统,但是从这一年以来的了解来说,在很多人眼里,内容管理系统其实就是网站的后台。只不过很多人会开发一个通用的网站开发平台,用于快速构建网站,这个开发平台就称之为内容管理系统。这一年来,也看过许多开源或不开源的内容管理平台,以DNN为例,它虽然号称为CMS,但它实际是一个二次开发平台,建一个一个网站仍然需要开发人员自己开发业务模块插入到平台运行,模块化开发和模块复用可能是DNN最大的亮点。

而我从一开始接手这个项目以来,多站点、多语言、内容通用化存储、可继承等内容管理和网站集群关系一直是我们在开发这个CMS的核心。在我们的CMS中,必须能创建,管理和维护多个网站。这些网站必须是可继承的,可继承的不仅包含内容,还包含网站的页面,程序,皮肤资源,导航关系等构成网站的所有要求。在这些可继承的元素里,必须多态性,保持高度的灵活,可能本地化一小部分元素,可以在不影响网站运行的情况针对子站点的实际情况对从父站点继承过来的数据进行本地化,以达到局部或全局自定义的目的。

做为一名开发人员,我更愿意将以上特点总结为OO特性。面向对象性网站,因为它完全符合面向对象的三个基本特点:封装性,继承性和多态性。首先是封装性,在一个站点内容,页面和模板使用的是本站点内的资源和内容,它并不受子站点或其它外部因素影响(除继承自父站点外);继承性,网站的继承和网站各种元素的继承本身就体身了它的继承性;多态性,是指在子站点继承父站点后,所有的元素在不改变的情况下都可以直接使用,但是当子站点需要对父站点继承过来的内容进行修改时,需要对它进行本地化,然后修改,这样同时可以覆盖父站点继承过来的内容,同时也可以重写新的行为,犹如虚方法的重写一般神奇。在网站间具备继承关系后,那我们在站点间的资源和程序共享就会变得那么理所当然,创建一组具有一定关系的网站会变得如些的轻松。比如:多语言站点,相似网站的快速复制,各种组织架构间的网站集群。

这就是LZ-CMS最核心的部分。在此基础上,我们需要统一规划组织网站将涉及到的各种资源,包含内容结构定义、内容通用化维护和存储、模板定义、页面定义、资源管理、站点皮肤等元素。我们将这些主要的元素划分为三种不同角色的用户来进行管理:开发人员负责整个网站功能的设计,内容结构的定义,页面的设计;前台设计人员,负责模板的设计,资源管理,站点皮肤管理;最终用户,负责进行内容的维护工作。整个系统的导航也是遵从这样的一套方法标准进行组织。除此之外,在LZ-CMS CMS中,集成了基于Lucene.net的全文检索;可定制计划任务的定时任务执行器;简单灵活的URL SEO设置;所见即所得的前台内容编辑(Inline editing);皮肤管理等等。

当然,做为CMS最重要的组成部分,扩展性是也是一个相当重要的指标。因为再通用化的网站,也会属于自己的特定需求。比如数据的提交,数据需要从异构系统中取得等;再有,有一些特定的模块可能需要进行特定的开发,再以一个完整模块做为网站页面中的一部分加入到网站中,比如订单模块。为此,在LZ-CMS中,提供了两种扩展,分别为页面扩展和模块扩展。页面扩展就是针对某个具体页面的功能扩展,如果提交评论数据;模块,就是一个具有完整链接结构的多个页面的组合,等同于DNN的Module。与DNN不同的是,LZ-CMS中开发这些扩展,不管在开发模式、开发效率、部署上都比DNN来的快速,简单,高效。开发LZ-CMS Module等同于开发标准的ASP.NET MVC网站。

LZ-CMS是一个功能强大的系统,单单凭这里的几百个文字远远无法完全,详细的进行介绍。幸好,LZ-CMS是一个开源的系统,并且也提供了比较全面详细的文档供开发人员了解。做为一个开源系统,而里面的大部分代码都是我完成,所以在这里也想从技术方面来谈谈LZ-CMS。

LZ-CMS尽管从代码的编写和架构设计上,并不是很令自己满意,很多代码都存在着各种问题。一方面,也是水平所限;另一方面也是资源和时间的关系。但从技术路线的选择上,在目前看来,还是比较满意的。首先,LZ-CMS是使用ASP.NET MVC架构之上的全新的ASP.NET架构形式,要知道,在去年的这个时候ASP.NET MVC仍然还处于CTP阶段,这对于一个企业开发具有重要意义的产品来说,是一个多么疯狂的决定,幸好老板也是技术出身,也是一位经验丰富的“老”WEB程序员,他对ASP.NET MVC持坚决支持的态度,并且在公司内部极力推广。其次,在LZ-CMS CMS中的使用的各种组件框架完全走的MS路线,ORM使用Entity Framework,还使用到了Unity,Enterprise Library。

在UI方面,使用了Extjs,完全解决了做为开发人员,在表单开发方面的不足,并且通过表单生成引擎,解决使用Extjs之后,需要编写Javascript(JSON)代码来设计表单的尴尬,要知道一个复杂的表单用JSON来表示,可完全不比通过直接写HTML和样式来的简单,而且一旦出错调试起来会让人马上疯掉。表单生成引擎部分,也许会单独提取出来作为一个独立的开源项目提供使用Extjs的使用者,绝对可以大大提高使用Extjs的效率。

整个系统架构以MVC和Extjs为基础之后,传统的WebForm开发和标准的ASP.NET MVC开发模型又全变了,开发人员所面对的就只一种对象JSON,所有的网络传输也全部变成了传输JSON数据。而开发人员也从原来的数据绑定和字段绑定的痛苦中解脱出来,这是我这一年开发中,最为快乐的事情。

在现有的LZ-CMS源码中,有两部分是最为不满意的:一部分就是测试,本来MVC的一个重要意义就是它的可测试性,在MVC项目中,可以很方便的做到测试驱动开发,这将会大大提高软件的质量,而LZ-CMS除了在早期的代码中有一小部分测试之外,后来连这一小部分也被删除了(没有及时同步);另一部分就是Controller的职责问题,在很多人的架构中,肯定会按功能不同进行分层,比如逻辑层。但是这里,如果没有特别必要,我并没有专门去抽取这一层出来。一方面,在很多地方,Controller都只是做数据的查询工作,而使用了Entity Framework后,查询会变得很简单;另一方面,由于序列化JSON的需要,我需要大量用户匿名对象,而如果单独提取一个独立层出来,我就是要额外定义很多相关的POCO实体来对应JSON序列化的需要。所以现在的很多Controller都是“胖”(fat)的Controller,当时在没有必须的情况下,我不认为它们应该被封装,在会被重用的情况下,我才会考虑重构封装。只是在没有足够测试支持的情况下,每次重构我都要承受着巨大的压力。:(

最后,附上LZ-CMS的相关资源:

官方站点:http://www.lz-cms.com/

lz-cms的更多相关文章

  1. java垃圾回收及gc全面解析(全面覆盖cms、g1、zgc、openj9)

    一般来说,gc的停顿时间和活跃对象的堆大小成比例,视gc线程的数量,每1GB可能会停顿1-3秒,且cpu数量通常和gc呈现阿姆达尔定律(Amdahl’s Law),而非我们直观计算的线性变化.如下: ...

  2. CMS模板应用调研问卷

    截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...

  3. Kooboo CMS技术文档之五:站点配置管理

    站点关系 管理站点间的关系,站点可以有子站点,子站点继承父站点的部分配置数据,同时子站点还可以根据需要,本地化由父站点继承而来的数据.通过继承和本地化,可以让子站点在用最小的改动代价,来完成一个与父站 ...

  4. Kooboo CMS技术文档之二:Kooboo CMS的安装步骤

    在IIS上安装Kooboo CMS Kooboo CMS安装之后 安装的常见问题 1. 在IIS上安装Kooboo CMS Kooboo CMS部署到正式环境相当简单,安装过程是一个普通MVC站点在I ...

  5. Kooboo CMS技术文档之一:Kooboo CMS技术背景

    语言平台 依赖注入方案 存储模型 1. 语言平台 Kooboo CMS基于.NET Framework 4.x,.NET Framework 4.x的一些技术特性成为站点开发人员使用Kooboo CM ...

  6. Kooboo CMS技术文档之四:Kooboo CMS的站点组成部分

    Kooboo CMS本着功能独立分离的原则,将站点分为三部分组成:用户管理,站点管理和内容数据库管理.各个功能之间既可独立使用,也可以容易组成在一起形成一个完整的系统. 用户管理 管理整个系统内的用户 ...

  7. Kooboo CMS技术文档之三:切换数据存储方式

    切换数据存储方式包括以下几种: 将文本内容存储在SqlServer.MySQL.MongoDB等数据库中 将站点配置信息存储在数据库中 将后台用户信息存储在数据库中 将会员信息存储在数据库中 将图片. ...

  8. zerojs! 造出最好的 CMS 轮子

    zerojs是一个基于nodejs.angularjs.git的CMS.在它之上可以继续开发出博客.论坛.wiki等类似的内容管理型系统. 拥抱开发者和社区 层次清晰,高度解耦.前后端即使分开也都是完 ...

  9. 一个小型的CMS后台管理平台发布啦~

    由于我不太懂怎么把博客园里我上传的文件共享,所以只好先放到百度网盘里了 数据库和发布的网站都放在这里 http://pan.baidu.com/s/1eQw3DOA 有问题请参考以下链接: http: ...

  10. 织梦cms常用标签

    dedecms简介:织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内知名的PHP开源网站管理系统,也是使用用户较多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是 ...

随机推荐

  1. mybatis关键查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  2. Kubernetes——滚动更新和数据管理

    k8s——滚动更新滚动更新就是一次只更新一小部分副本,更新成功之后再更新更多的副本,最终完成所有副本的更新.滚动更新最大的好处是零停机,整个更新的过程中始终有副本运行,从而保证了业务的连续性.kube ...

  3. 41和为S的连续正数序列+注意循环条件记一下这题特殊解法

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  4. jquery源码部分分析

    1.整体架构和如何辨别浏览器端和node端 自执行函数,判断在什么端,如果在浏览器端就执行factory函数 //(function(){a,b})(a,b) //jq大架构,闭包,自执行函数,传入函 ...

  5. 2017北京网络赛 J Pangu and Stones 区间DP(石子归并)

    #1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...

  6. Vue的7属性-8方法-7指令

    Vue的7属性: el属性 绑定id,用来指示vue编译器从什么地方开始解析 vue的语法,可以说是一个占位符 data属性 用来组织从view中抽象出来的属性,可以说将视图的数据抽象出来存放在dat ...

  7. Django 利用第三方平台实现用户注册02

    前言: 上篇博客我们已经对设置了图形验证码,短信验证码对用户信息进行了一些简单的验证,本篇博客我们会将上篇的一些验证方法进行结合,来进一步完成我们的注册工作 1. 创建视图类 在user中的view创 ...

  8. s2010编译C++ 链栈的使用

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  9. QT5安装

    Windows+Qt5.3.1+VS2013安装教程 https://blog.csdn.net/two_ye/article/details/96109876 (已成功)windows下,VS201 ...

  10. Redis详解(五)——主从复制

    Redis详解(五)--主从复制 面临问题 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的.而数据是最重要的,如果你不在乎,基本上也就不 ...