张盛天 郭文俊
(山西大同大学计算机与网络工程学院 山西省大同市 037009)
本文以山西省大同大学复学为背景,在学校公寓缺乏智能硬件门禁设备的情况下,提出了基于敏捷开发和Django 技术框架的学生公寓门禁软件开发方案,并在一个月的时间内完成了软件的构建和部署,成为了学校防疫的重要工具。
文章第2 节对敏捷开发思想和Django 框架技术进行了阐述,指出了其对本次系统开发的重要性;第3 节系统地介绍了敏捷开发下的软件设计方案;第4 节是软件的具体实现及相关功能的展示;第5 节提出了对系统的完善计划;最后总结了该学生公寓门禁系统在疫情期间所起到的作用。
由于留给项目实施的时间紧迫,传统的基于文档沟通的瀑布模型无法满足项目快速开发部署的需求,更高效的开发模式在此应用场景下被需要。敏捷开发是一种轻量级的开发模式,其强调与用户面对面的沟通,通过迭代的方式,来尽快响应用户的需求[1]。同时,敏捷开发提倡使用轻量级软件架构,降低项目开发过程中的技术难度[2]。此外,敏捷开发支持项目小批量持续发布,在交付周期内,软件只需做到“刚刚好”的程度[3]。敏捷开发的迭代流程如图1所示。敏捷开发的这些特点使其适合交付时间紧迫、需求不稳定的小规模软件项目,非常符合山西大同大学学生公寓门禁系统的开发场景。
Django 是Python语言下的一个开源、轻量级的Web 框架,采用了基于模型(Model)、视图(View)和模板(Template)的MVT 软件设计模式。其中,模型主要负责网站后台数据层的相关处理;模板对应后台业务逻辑处理;视图实现了表现层的相关功能,其通过代码逻辑控制网页前端与后台的交互[4]。MVT 软件设计模式使得Django 具有高内聚低耦合的特性,提升了软件框架的稳定性及处理效率[5]。除此之外,Django 采用ORM 对象关系映射,提高了数据模型设计与交互的效率,增强了数据库的可选择性[6]。鉴于Django框架所呈现的以上诸多优点,其可作为本次项目开发的核心代码框架,结合敏捷开发的软件开发模式,使短期内交付较高可用性的软件项目成为可能。
由于学校防疫策略的不断变化,该系统的需求存在着不稳定、变化快等特点,采用敏捷开发方式来周期性的收集需求成为更可靠的选择。敏捷开发强调程序员团队与业务人员进行紧密的协作、高频率的面对面沟通,将人的交流作用发挥到最大,使得系统开发能够快速适应需求的变化[7]。整个系统开发期间,与学校相关负责人进行了三次周期性面对面沟通及多次电话交流,得到了系统所需的功能要求,如表1所示。
图1:敏捷开发的迭代流程
图2:系统的迭代式架构设计
与传统软件开发不同的是,基于敏捷开发的软件架构设计不是一成不变的,其随着需求的周期性变化而不断改变。在第一次迭代周期里,借助Django 的MVT 软件设计模式及软件重构思想,设计出轻量级、强拓展的系统初始架构。结合学校所提供的需求,在后续的两次迭代周期里,拓展系统功能,不断完善系统的架构。系统的迭代式架构设计如图2所示。
经过三次迭代周期后,最终的表现层模块主要由身份识别入口页面及学生信息页组成。为了让学生借助手机快速访问到页面,可将页面网址转化成二维码,学生只需使用微信的扫码功能,便可在微信内置浏览器中打开相应页面。同时,为了避免其它浏览器所带来的信息泄露问题,系统加入了浏览器userAgent 信息判断,如果得到的userAgent 与微信信息不符,则禁止网页打开,从而限制了页面只能在微信内置浏览器中打开。对于身份识别入口页面,不同楼宇采用了不同的进入接口,即不同的二维码。学生在第一次扫码进入对应楼宇页面后,需提供自己的学号,系统通过与后台数据库中数据进行比对,来判断该生是否属于所要进入楼宇。如果识别通过,系统使用Cookie 机制将学号存于键值对中,并保存在微信的内置浏览器里。借助Cookie 机制,以后学生进公寓扫码时,内置浏览器会在发送给服务端的请求中附加对应键值对信息,服务端通过读取键值对的信息来实现自动身份识别[8]。身份识别通过后,页面从身份识别入口页跳转至学生信息页。学生信息页展示了学生的姓名、学院、班级、宿舍号、头像照片等内容,以供宿舍管理人员察看。同时,在学生信息页中可输入体温值,通过提交按钮,将体温值写入到学生的基本信息中。如果身份识别不通过,页面反馈提示信息,并停留在身份识别入口页。
业务逻辑层模块主要实现了身份识别判断逻辑、数据访问读取逻辑、体温数据写入逻辑及时间记录逻辑。
数据处理层模块采用Django 的ORM 对象关系映射,实现了与MYSQL 数据库的交互。MYSQL 数据库是开源免费的关系型数据库管理系统,适用于小型数据库的管理[9]。由于本次软件项目所需数据规模仅有两万余条,采用MYSQL 数据库足以实现相应的数据存储与处理。
虽然学校采用了分年级、分批次的开学策略,但是在开学初期,学生便已分布于大多数学生公寓中,因此软件系统需要部署于二十二个学生公寓中,系统的访问量较大。为了保证系统的高并发性能,部署时可采用Nginx 和uWSGI 技术。uWSGI 作为系统部署的Web 服务器,可使系统运行更加稳定;Nginx 作为反向代理服务器实现了负载均衡,大幅度提升了系统的并发性能[10]。
表1:系统功能列表
基于敏捷开发思想,系统的开发也是经过多次迭代周期后完成的。在第一次迭代周期中,由架构师和开发人员搭建好系统的初始架构,实现当前迭代要完成的功能。在后续的迭代周期中,根据需求和架构设计的变化,架构师需对架构进行升级维护,并由开发人员完成剩余功能代码的编写。除此之外,在敏捷开发中,系统的开发与测试没有严格的边界划分,所以开发与测试工作可交叉同步进行,以此进一步加快系统实施的速率。
该系统的页面采用了HTML5、CSS3、Javascript、JQuery 等主流前端技术。HTML5 具有离线存储功能,如:Web Storage、Indexed DB、Application Cache 等,这些功能使得网页拥有更短的响应时间[11]。CSS3 提供了丰富的样式属性和动画效果,使得页面的交互性、自适应性得到大幅度提高[12]。前端与后台的交互通过Javascript、Jquery 以及Ajax 来完成。Ajax 采用异步交互方式,使得用户无需等待响应,继续其他的Web 交互,从而提高了页面的交互能力[13]。以初次进入页面的身份识别前端逻辑为例,实现的代码如下:
系统后台以Django 框架为基础,借助MVT 软件设计模式,实现了页面、业务处理逻辑以及数据库之间的交互。系统部分运行效果如图3所示。
图3(a)是学生用微信扫码后,初次进入身份识别页面的效果。
图3(b)为学生身份识别成功后,系统进入的学生基本信息页。该页面除了体温值可进行重新编辑外,其余信息借助HTML 标签属性限制,不可修改。
系统投入使用后,所存在的最大问题是沉重的运维工作。基于敏捷开发思想,该系统需要持续集成持续交付,其中所带来的集成部署过程较为烦琐,影响了整个系统开发的实施进度。为了提高运维效率,项目可引入DevOps 技术。DevOps 集成了许多自动化测试、自动化部署以及项目管理工具,可很好的支持系统的持续集成持续交付[14]。DevOps 能实现系统的开发环境、测试环境以及生产实践环境高相似度,以此适应系统的高变动性、高可用性、高可靠性要求[15]。鉴于DevOps 所提供的诸多好处,计划将在该系统开发的第四次迭代周期中引入DevOps。
本文基于敏捷开发和Django 技术,设计并开发了适用于山西省大同大学复学场景的学生公寓防疫门禁系统。该系统操作简单、页面交互性良好,有效地减少了学生公寓管理人员的工作量,为学校防疫工作做出了贡献。在后续的系统完善中,可将DevOps 技术引入到项目中,以此进一步提升系统的可用性、可靠性。