lz-cms
去年这个时候也是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的相关资源:
lz-cms的更多相关文章
- java垃圾回收及gc全面解析(全面覆盖cms、g1、zgc、openj9)
一般来说,gc的停顿时间和活跃对象的堆大小成比例,视gc线程的数量,每1GB可能会停顿1-3秒,且cpu数量通常和gc呈现阿姆达尔定律(Amdahl’s Law),而非我们直观计算的线性变化.如下: ...
- CMS模板应用调研问卷
截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...
- Kooboo CMS技术文档之五:站点配置管理
站点关系 管理站点间的关系,站点可以有子站点,子站点继承父站点的部分配置数据,同时子站点还可以根据需要,本地化由父站点继承而来的数据.通过继承和本地化,可以让子站点在用最小的改动代价,来完成一个与父站 ...
- Kooboo CMS技术文档之二:Kooboo CMS的安装步骤
在IIS上安装Kooboo CMS Kooboo CMS安装之后 安装的常见问题 1. 在IIS上安装Kooboo CMS Kooboo CMS部署到正式环境相当简单,安装过程是一个普通MVC站点在I ...
- Kooboo CMS技术文档之一:Kooboo CMS技术背景
语言平台 依赖注入方案 存储模型 1. 语言平台 Kooboo CMS基于.NET Framework 4.x,.NET Framework 4.x的一些技术特性成为站点开发人员使用Kooboo CM ...
- Kooboo CMS技术文档之四:Kooboo CMS的站点组成部分
Kooboo CMS本着功能独立分离的原则,将站点分为三部分组成:用户管理,站点管理和内容数据库管理.各个功能之间既可独立使用,也可以容易组成在一起形成一个完整的系统. 用户管理 管理整个系统内的用户 ...
- Kooboo CMS技术文档之三:切换数据存储方式
切换数据存储方式包括以下几种: 将文本内容存储在SqlServer.MySQL.MongoDB等数据库中 将站点配置信息存储在数据库中 将后台用户信息存储在数据库中 将会员信息存储在数据库中 将图片. ...
- zerojs! 造出最好的 CMS 轮子
zerojs是一个基于nodejs.angularjs.git的CMS.在它之上可以继续开发出博客.论坛.wiki等类似的内容管理型系统. 拥抱开发者和社区 层次清晰,高度解耦.前后端即使分开也都是完 ...
- 一个小型的CMS后台管理平台发布啦~
由于我不太懂怎么把博客园里我上传的文件共享,所以只好先放到百度网盘里了 数据库和发布的网站都放在这里 http://pan.baidu.com/s/1eQw3DOA 有问题请参考以下链接: http: ...
- 织梦cms常用标签
dedecms简介:织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内知名的PHP开源网站管理系统,也是使用用户较多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是 ...
随机推荐
- 暑假周进度报告(三)-------版本过高后续问题处理,eclipse编译运行MapReduce以及Hadoop学习
问题一:Hadoop版本太高 卸载Hadoop3.2.0 我改安装了Hadoop 2.7.7 如果没有权限下载.可以采用如下方式: 卸载完成以后返回原目录即可 后面的jdk卸载也可以采用这种方式. 按 ...
- 洛谷 P2891 [USACO07OPEN]吃饭Dining
裸的最大流. #include <cstdio> #include <cstring> #include <queue> const int MAXN = 4e3 ...
- idea增删改查
idea应用mybatis写增删改查 entity层 private Integer id;private String userCode;private String userName;privat ...
- 新闻网大数据实时分析可视化系统项目——5、Hadoop2.X HA架构与部署
1.HDFS-HA架构原理介绍 hadoop2.x之后,Clouera提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA方案,它给出了一种较好的解 ...
- 被动信息收集-其他收集目标信息的途径:cupp、 recon-ng
除了google等搜索收集,还有其他途径进行信息收集,其中就包括用命令行或集成的软件.框架进行搜集信息. 1.先举例几个简单的命令: 其实也会是调用搜索引擎,如谷歌必应等,需要翻墙,可以用proxyc ...
- HDU-1312题解(DFS)
HDU-1312-DFS Written by Void-Walker 2020-02-01 09:09:25 1.题目传送门:http://acm.hdu.edu.cn/showproblem ...
- Python爬虫连载5-Proxy、Cookie解析
一.ProxyHandler处理(代理服务器) 1.使用代理IP,是爬虫的常用手段 2.获取代理服务器的地址: www.xicidaili.com www.goubanjia.com 3.代理用来隐藏 ...
- Nginx配置详解 http://www.cnblogs.com/knowledgesea/p/5175711.html
Nginx配置详解 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作 ...
- 吴裕雄--天生自然Hadoop学习笔记:Hadoop简介
Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop实现了一个分布式文件系统(H ...
- MQTT 协议学习:000-有关概念入门
背景 从本章开始,在没有特殊说明的情况下,文章中的MQTT版本均为 3.1.1. MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议",MQTT同HTTP属于第七层 ...