基于Sinatra的选课系统设计与实现

2016-05-19 14:09刘振源韩笑章伟
电脑知识与技术 2016年8期

刘振源+韩笑+章伟

摘要:为了使学生能够通过在线的方式选择学校开设的兴趣课程,该文设计并实现了基于Sinatra的选课系统。该文详细论述了选课系统设计与实现的相关技术,对关键技术进行剖析,对重要的业务逻辑进行分析,并在最后对该系统提出改进意见。

关键词:选课系统;Sinatra框架;Web开发

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)08-0076-03

1 概述

随着“小学生减负”教育政策的推广和实施,越来越多的小学针对学生的爱好开设兴趣课程。由于课程资源的有限性,学校不能保证每个学生都能选上自己最想上的课,但学校必须保证选课的公平性。教育信息化的普及使得越来越多的学校领导选择通过在线选课的方式解决学生选课问题,不仅保证了学生选课的公平性,还减轻了相关负责人的工作量。

学校针对小学一、二年级的学生,开设了科技小制作、英语配音等十几门兴趣课程,想让学生和家长通过在线的方式进行选课。学校现有的课程系统还并不支持学生选课,因此,基于Sinatra设计和开发了一个选课系统,帮助学校解决在线选课问题。

2 系统需求分析及系统技术选型

2.1 系统需求分析

我校针对一二年级学生总共开设了13门兴趣课程,每门课程限制20人报名参与;参与选课的学生共有158人,每人选课数量没有限制,每人只有一次选课机会。系统要支持多种终端设备访问,最终生成一份记录学生选课结果信息的Excel文件。

2.2 系统技术选型

由于服务器限制,系统选择使用文本来存储所有应用数据,使用XML文件存储课程信息,使用CSV文件存储参与选课的学生信息和学生选课结果信息;为了支持多种终端设备访问,系统选择采用移动优先设计思想的Bootstrap前端框架实现用户界面;系统后台使用基于Ruby的Sinatra框架实现。

XML即可扩展标记语言(Extensible Markup Language),是一种基于纯文本的数据交换格式,适用于表现树形结构的数据,其解析工具不依赖于特定的语言[1];CSV即逗号分割值文件(Comma Separated value),是一种用来存储数据的纯文本文件格式,可以和Excel文件相互转换[2];Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的WEB项目[3];Sinatra是一个基于Ruby语言的DSL(领域专属语言),可以轻松、快速地创建web应用[4];Ruby是一种令人快乐的编程语言。

3 系统页面流程设计

3.1 系统页面

系统选课须知页面,显示选课注意事项,是系统的入口;系统登录页面,让合法的用户登录到选课页面;系统选课页面,显示可以供学生选择的课程;系统选课结果页面,显示学生选择的课程;其他页面,包括告知学生登录信息不合法、告知学生已经选课、告知学生系统出错等页面。

3.2 系统页面流程

用户访问网址,进入选课须知页面,仔细阅读选课注意事项;单击“我已知晓须知”按钮,进入登录页面,如图1所示。

选择所在班级,并输入姓名;单击“登录”按钮,进入选课页面,如图2所示,选择合适自己的课程;单击“确认提交”按钮,进入选课结果页面,保存选课截图,直接退出浏览器即可。

4系统实现

4.1 系统文件结构

项目目录下共有15个文件。config.ru是rack 服务器配置文件;course.xml 存储了课程信息;Gemfile是Ruby包依赖配置文件;index.rb是项目文件,包含了所有接口的处理方法;result.csv中存储了选课结果信息;student.csv中存储了学生信息,views目录下都是视图文件。

4.2 关键技术

4.2.1 XML文档的处理

使用XML文件存储课程信息,course.xml 文件:course表示课程,name表示课程名称,limit表示课程限制人数,初始值为20,count表示选择该课程的人数,初始值为0。

使用Ruby的REXML模块来处理XML文件:使用REXML::Document类的new方法来加载XML文档;使用REXML::Element类的each方法并结合XPath来遍历符合条件的XML元素;使用REXML::Document类的write方法更新XML文档[5]。

4.2.2 CSV文档的处理

使用CSV文件存储学生信息和学生选课结果信息,使用Excel软件将包含学生信息的excel文件打开,选择导出格式为CSV,导出student.csv 文件;在项目目录下,创建result.csv文件,录入一下文字并保存,用以存储选课结果信息:

班级,姓名,周二所报课程,周三所报课程,周四所报课程

使用Ruby内置的CSV模块来处理CSV文件:使用CSV模块的foreach方法读取csv文件的每一行数据;使用CSV的<<方法向csv文件末尾追加一行数据。

4.2.3 Sinatra框架的使用

路由和视图是Sinatra框架的两个核心构件。路由的作用是一个HTTP请求指定给特定的代码块来处理,视图的作用是向用户呈现界面。

在Sinatra中,一个路由分为两部分:HTTP方法(GET, POST等)和URL匹配范式。 每个路由都有一个要执行的代码块,路由按照它们被定义的顺序进行匹配。 第一个与请求匹配的路由会被调用。路由范式可以包括具名参数,可通过params哈希表获得。

在Sinatra中使用erb方法在应用中引入erb模板。

4.3 主要应用逻辑实现

4.3.1 用户登录验证

从Sinatra的params中获取用户输入的班级和姓名,使用Ruby的CSV模块提供的foreach方法在student.csv中逐行查找,匹配相应的学生信息,如果存在就可以跳转到选课页面。

4.3.2 课程信息显示

5 总结

基于Sinatra的选课系统上线5分钟左右的时间,课程被全部选完。笔者查看生成的CSV文件,发现有两条数据写错,有两门课程超出选课人数限制,总体上解决实际需求。

经笔者分析,问题是由并发访问造成的,这是系统有待完善的地方,文件应该采用异步操作,并要在写入数据时加锁。如果条件允许,系统应该使用数据库,来提高并发访问量。

本文对于数据驱动的小型网站具有一定的参考价值,同时,也为使用Sinatra建站的Ruby初级开发者提供借鉴。

参考文献:

[1] 松本行弘,松本行弘的程序世界[M].柳德燕,译. 北京:人民邮电出版社,2011:328-333 .

[2] 维基百科.逗号分隔值[EB/OL]. https://zh.wikipedia.org/wiki/%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E5%80%BC.

[3] Bootstrap. Bootstrap编码规范 [EB/OL]. http://www.bootcss.com/.

[4] Sinatra. Sinatra README[EB/OL]. http://www.sinatrarb.com/intro-zh.html.

[5] Rexml.Rexml Home[EB/OL]. http://www.germane-software.com/software/rexml/.