[2009/04/16]发布《Drupal项目实战-公司订餐系统(四)》本博客内容均为原创(Original),如有雷同,纯属巧合。转载请注明出处。同时欢迎学术探讨与批评。

2008年12月11日星期四

Drupal项目实战:公司员工订餐系统 (一)

简单的需求
我们要做的是一个公司内部的员工订餐网站,它的主要功能是:
  1. 员工可以浏览各种菜的信息:为了简单,我们先假设可以浏览的是“套餐”
  2. 员工在选择好菜后,就可以下订单:订单中可以选择订菜的数量
  3. 饭店可以查看员工所下订单 :并根据订单进行送餐,订单的有效期是当日上午10:00 (假设我们订的是午餐)
  4. 菜单的主要属性:标题、说明、照片、价格
OK. 非常简单易懂,基本上三个需求 。这个系统中,主要的角色是:
  • 公司员工
  • 饭店
  • 订餐管理员
我们要做的就是实现这样一个系统。首先快速做出原型,然后逐步迭代,即采用敏捷开发[1]方法。可以发挥同学的想像力,逐步完善。
图1 员工午饭订餐系统结构图(用户视角)

客户
在了解了需求后,我们可以对系统的功能进行分析,以便进行技术架构的分析,进而估计出,要实现这样一个系统,大概要多少成本。这是一个很现实的问题。在实际的项目中,客户一般只关心花多少钱来完成这样一个项目,至于用哪种技术,用不用Drupal,其实他们并不关心。因此,某些开发者有时过多的向客户介绍Drupal的优势,其实是完全没有必要的。只需要让客户了解我们采用了“先进的”、“高效的”、“便于扩展”的技术架构就可以了。但是,对于开发者来说,技术框架是非常重要的,因为这样我们才能准确的估计出是否能顺利完成项目,以及其开发成本。

UML
我个人是比较主张使用UML的。因为UML的用例图,状态图和时序图等,可以很好很方便的对系统进行建模,而且便于和世界各地的用户交流。这一点很重要,因为如果我们的客户和我们使用的不是同一种语言时,这种图型就成为了很好的交流媒介。

分析
我们力求简化开发过程,不必要的就直接省略。对于这个项目,我认为接下来应该分析如何用Drupal来实现。
首先,要找出系统中的“元数据”。因为Drupal是CMS,且核心就是Node。那么分析系统时,首先就是找出系统中的“Node”,即“元数据”。从面向对像的角度看,就是“类”。我认为这是面向数据和面向对像分析的综合运用。
菜单应该是系统中的“元数据”,因为所有的行为都是围绕这个进行的。菜的主要属性已经在需求中说明了,那么我们可以马上联想到,“菜单”即是Node的子类,是Node的继承,扩展Node的属性(因为Node只有标题和内容两个内容属性),就可以完成“菜单”的管理。我们把“菜单”类称为Food。

除了Food,还有一个类是“订单(Order)”。订单用于记录员工的订餐情况。它也是一个“元数据(meta-data)”。那么它是否也可以继承Node类呢?我们知道,使用Drupal的一个原则,就是尽可能使用Drupal本身的模块功能来完成业务需求。简单的讲,能少使用模块就少使用模块。现在有两个第三方模块可以实现电子商务的功能:e-CommerceUbercart
前者历史比较悠久,在Drupal 5时代非常流行,不过进入Drupal 6时代就暂停开发了。听说最近又重新开始开发了,估计作者前一段时间持观望态度。Ubercart是后起之秀,它也是以“商品”为主的电子商务网站的解决方案。而且Ubercart也于最近推出了Drupal 6的beta版本。我没有对这两个插件作过横向对比,刚好我们借这个实战项目,也可以进行一下实验。不过,在使用这两个模块之前,我想先使用“纯Drupal”来实现我们的功能(尝试),如果能实现,那么效率应该是比较高的,而且更简单。

预计要使用的模块
有人说,Drupal开发就是“拼模块”,此话有一定道理。而且大多数人在用Drupal开发时,马上头脑中就无数个模块翻腾。其实这不是一个很好的现象,很容易在还没真正弄清楚需求前就陷入了技术误区。当然,我们还是需要在开始前设想一下需要使用哪些模块,因为这样可以提前下载下来,做下尝试。不过我更倾向于:边做边找的模式。也许这不是最佳实践,不过对于比较小的项目还是很有效率的。
  • CCK、Views、Panels:这三个模块基本没什么悬念,任何一个网站几乎都会用到。Panels可能会损伤性能,不过它可以让我们避免陷入枯燥的CSS定位调试中。
  • Image Field:用于添加Image的CCK Field
  • Date:Date模块主要是一些日期相关的功能,也用于添加Date类型的CCK Field
  • Vote API: 这个模块是用于评论时投票的,与FiveStar等模块连用,可以实现“小星星评分”,可爱又实用。
  • Webform:在“下订单”时,我们有可能会用到,先列于此。
  • 自定义模块:如果自己开发模块能够高效的解决问题,那么自定义模块也必不可少。
主题模板
Drupal中的主题模板(Theme)是表示层的术语,除了样式、色彩等,我们还要对内容的显示布局。默认的节点显示页面只适合简单的内容类型,如果我们使用了CCK扩展节点字段的话,那么就需要自定义模板文件了。本项目对网站风格的要求是简洁,同时为了开发方便考虑,先使用Garland(Drupal默认模板)主题,然后再进行定制。

工具
我喜欢使用EditPlus作为开发PHP的工具,然后配以Firefox+Firebug和IE+Developer Tools(或IE8)进行调试。在工具方面,仁者见仁,智者见智,没有好坏之分,只有熟练与否。Choose whatever you like.
同时,我发现微软的Visual Web Developer Express是一个非常不错的编辑器,尤其是网页开发,可用于页面设计,有兴趣的朋友们也可以试一试。

小结
本文叙述了项目的需求,并进行了分析和设计。采用Drupal的开发与普通的软件开发还是有区别的,因为我们是“站在Drupal的肩膀”上,因此对软件开发过程可以做一定的“剪裁”。至于我的方法是不是“Best Practice“,那还需要大家一起共同探讨了。

详细的开发流程从第二篇开始。

参考资料
  • [1] 敏捷开发:http://www.agilemanifesto.org/ :敏捷开发是RUP的一个扩展或精简,它有几个关键的实践用于指导软件开发过程。不过任何一种过程方法,都不可能适用于所有的项目,都需要经过我们自身的理解,并结合实际的项目情况而运用,要“以人为本”、“从群众中来、到群众中去”。
  • [2] Best Practice:指最佳实践。

3 条评论:

  1. 两个问题像方医生请教。
    1.请问视图是用什么软件作的?
    2.请问您惯用的UML工具是什么?

    谢谢

    回复删除
  2. 视图是用Freemind做的。UML一般我用Visio画,不过感觉IBM的UML工具更好用些。

    回复删除
  3. 明白了,谢谢您。
    利用实例来进行学习确实是一个很好的主意。

    回复删除