基于RESTful的在线请假管理系统设计与实现
2019-01-23朱勇伏海旭
朱勇,伏海旭
(南京工程学院计算机工程学院,南京 211167)
0 引言
当前受移动互联网发展的影响,越来越多的学生事务处理开始通过电子化的手段实现,但是通过对高校的调查以及笔者自身的体会发现,依然有许多高校采用传统手段,一般流程为学生打印纸质假条,前往辅导员处签字盖章,将假条交给任课教师。该流程存在效率低,浪费时间等问题,对学生生活影响很大。
针对上述问题,开发App或Web应用也是一种解决手段,但此方案存在终端适应复杂,开发周期长,用户使用成本高,扩展性差等问题。对此,本文讨论并设计了一种基于RESTful的在线请假系统,旨在解决目前高校存在的“请假难”痛点问题,基于借助微信小程序易用入口解决多终端适配和扩展性等问题,令用户获得良好体验。
1 RESTful概述
REST(Representational State Transfer),中文意思是表述性状态转移,它将任何有被引用必要的事物定义为资源,包含实体和抽象概念,资源在网络中以某种表现形式进行状态转移。Resource:资源,即数据,例如newsfeed、friends等;Representational:某种表现形式,例如用 JSON、XML、JPEG 等;State Transfer:状态变化。通过HTTP动词实现。每一个URI代表一种资源;客户端和服务器之间,传递这种资源的某种表现层;客户端通过四个HTTP方法(GET/POST/PUT/DELETE)对服务器端资源进行操作,其目标是创建具有良好扩展性的分布式系统。RESTful是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
REST是设计风格而不是标准。REST通常基于使用HTTP、URI和XML(标准通用标记语言下的一个子集),以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。作为一种架构,其提出了以下架构级约束:
(1)使用客户/服务器模型。客户和服务器之间通过一个统一的接口来互相通讯。
(2)层次化的系统。在一个REST系统中,客户端并不会固定地与一个服务器打交道。
(3)无状态。在一个REST系统中,服务端并不会保存有关客户的任何状态,客户端自身负责用户状态的维持,并在每次发送请求时提供足够的信息。
(4)统一的接口。一个REST系统需要使用一个统一的接口来完成子系统之间以及服务与用户之间的交互,这使得REST系统中的各个子系统可以独自完成演化。
2 系统设计
2.1 系统架构
基于RESTful在线请假管理系统架构包含前端、后端和数据库。前端分为三种角色(学生、辅导员、任课教师)三个模块(主页面、历史记录、个人信息及设置);后端使用Flask外暴露API响应前端HTTP请求并完成与数据库交互和ORM(对象关系映射),通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中;数据库中设三张表(请假表、学生表、教师表)。
用户通过前端进行操作,前端JavaScript通过AJAX向后端发起请求,后端根据请求内容与数据库交互,完成逻辑操作、ORM和数据持久化,返回JSON数据,前端解析JSON,异步刷新,呈现结果。
基于RESTful在线请假管理系统架构设计见图1。
图1 架构设计
2.2 数据库设计
根据请假系统需求和特点,基于RESTful的在线请假系统数据库(leaveDB)设计有三张表,分别为请假表(leave)、教师表(teacher)、学生表(student)。通过登录号码长度来区分用户角色,学生学号为9位,教师工号为6位。教师表通过Boolean类型的role字段来区分辅导员和任课教师角色。密码通过Varchar类型passwd字段存储经SHA256加密后的密码。
基于RESTful的在线请假系统数据库设计见图2。
图2 数据库设计
2.3 API设计
根据前后端交互过程中数据的情况特点,基于RESTful的在线请假系统API设计主要如下:
(1)资源标识
REST中使用资源的特定名词作为资源的URI,并设计相应的控制器和模型类。控制器用于处理逻辑,模型类用于和数据库交互。根据交互过程中涉及的资源。
(2)参数设计
为了增加前后端交互的便携性,对于不同功能返回不同的JSON键值对,前后端事先约定JSON格式,便于解析。参数设计详见图3。
图3 参数设计
3 系统实现
3.1 微信小程序
基于RESTful的在线请假系统前端采用微信小程序实现,相对于传统的App应用,小程序可以在线热更新,方便版本迭代和敏捷开发,同时降低了用户使用成本。“用完即走”提供了优质的用户体验。
微信小程序分登录功能、学生用户功能和教师用户功能,根据功能点包含不同数量的page,page由WXML、WXSS、JS和JSON构建。WXML构建页面DOM,WXSS构建页面样式,JS负责获取全局应用程序实例对象并创建页面实例对象,同时内含生命周期函数用于监听页面加载、页面初次渲染完成、页面显示、页面隐藏、页面卸载及页面相关事件处理函数,包含用户下拉动作和自定义点击事件。程序启动后,login页面与用户交互,将数据使用AJAX与后端并根据后端返回JSON解析提取后的结果跳转用户对应的page,异步刷新、渲染页面,不需要整页面重新刷新,减少了资源占用和用户等待时间,提高了用户体验。
在图片凭证保存的功能点上,目前业界通用做法一是使用存入后端文件系统并保存路径至数据库对应字段,加载时根据文件路径下载;二是直接将图片Base64转码后以JSON数据包格式传入数据库longtext或binary类型字段中。做法一需要单独构建文件系统或使用在线图床并从外链加载,提高了成本且降低了安全性;做法二占用资源过多且上传时间过长,用户体验非常差。在这里本文使用微信官方提供的小程序云开发功能,在微信官方服务器上构建相互隔离的云环境,每个环境都包含独立的数据库实例、存储空间等资源。通过对将环境构建单独的内置云函数,处理上传逻辑。上传图片时,调用该内置函数将图片上传至云环境储存空间中,获得唯一文件ID并将该ID存入数据库leave表中ensure字段,读取时根据RESTful后端返回JSON中ensure字段通过内置函数直接调用图片,对上传、下载文件明显起到简化加速作用,使用微信官方云开发环境,稳定性高,文件加载速度快,与小程序耦合程度高,调用简单,开发迅速。
(1)学生请假功能
学生登录后在“请假”界面选择请假类别、时间等,提交请假请求,在“消息”界面查看请假历史记录,在“我”界面查看个人信息和修改密码。学生请假功能见图4。
(2)辅导员审批功能
辅导员登录系统后,在“消息”界面查看今日待审批假条,选择通过或不通过,在“批假”界面可查看已批假历史记录并可按学生姓名查找假条。辅导员审批功能见图5。
图4 请假功能
图5 审批功能
(3)任课教师查看假条功能
任课教师在“消息”查看自己班级内学生的假条和状态(待批准/已批准/不通过);在“我”界面查看个人信息和修改密码。
基于RESTful的在线请假系统功能流程见图6。
3.2 ORM 实现
本系统后端操作数据库时,使SQLAlchemy作为ORM框架[3],创建 SQLAlchemy对象并定义 student、teacher、leave 对象,分别对应数据库中 student、teacher、leave表。使用sessionmaker定义会话类,操作该会话类实例对象的操作方法进行数据库操作,操作方法为add()、delete()、update()、query()。
图6 功能流程
以“修改密码”功能为例,部分代码如下:
class teacher(db.Model):
#定义Model,用于ORM绑定数据
__tablename__='teacher'
teacher_id=db.Column(db.DECIMAL(65),primary_key=True)
#数据类型与数据库中类型对应
name=db.Column(db.VARCHAR(255))
passwd=db.Column(db.VARCHAR(255))
role=db.Column(db.VARCHAR(2))
school=db.Column(db.VARCHAR(255))
def to_dict(self):
#转字典方法用于方便与json交互
return{c.name:getattr(self,c.name,None)for c in self.__table__.columns}
@app.route("/change_pwd",methods=['GET','POST'])
#Flask对外暴露URL供前端JS调用
def change_pwd():
#处理json并与Controller交互
if(request.method=='POST'):
if not(request.json):
return jsonify('not json')
else:
data=request.get_json()
rec_id=data['userId']
rec_pwd=data['userPwd']
if(change_passwd(rec_id,rec_pwd)==True):
#调用Controller修改密码
return jsonify("True")
else:
return jsonify("Flase")
else:
return jsonify('not POST method')
def change_pwd(userId,userPwd):
#Controller用于与数据库和Model交互
print("用户"+userId+"修改密码")
data=db.session.query(teacher).filter_by(
teacher_id=userId).first()
#新建ORM实例查询数据库中对应的行
data.passwd=generate_password_hash(str(userPwd))
#对明文SHA256加密
db.session.commit()
#提交数据库
db.session.close()
#关闭实例
print("用户"+userId+"密码修改成功")
return(True)
使用ORM技术可以节约与数据库交互的步骤,有效提高开发效率,并解决面向对象与关系数据库存在的互不匹配的问题。
4 结语
根据高校学生事务中“请假难”的痛点问题,主要表现在学生请假流程繁琐,学校仍采用纸质假条不便于管理等方面。提出了基于RESTful的在线请假系统,旨在取代目前高校中采用传统纸质假条请假的方式。本文对基于RESTful的在线请假系统进行了总体架构设计、数据库设计、RESTful API设计,运用Python语言、ORM技术、Flask框架并以微信小程序的前端为例实现了该系统的主要功能。实际测试表明基于RESTful的在线请假系统速度快、功能完善、兼容性好、扩展性好、易于维护,达到了预期的效果。显著提高了请假的效率,节约了教师和学生的时间,解决了“请假难”的问题。