朱勇,伏海旭
(南京工程學院計算機工程學院,南京 211167)
當前受移動互聯網發展的影響,越來越多的學生事務處理開始通過電子化的手段實現,但是通過對高校的調查以及筆者自身的體會發現,依然有許多高校采用傳統手段,一般流程為學生打印紙質假條,前往輔導員處簽字蓋章,將假條交給任課教師。該流程存在效率低,浪費時間等問題,對學生生活影響很大。
針對上述問題,開發App或Web應用也是一種解決手段,但此方案存在終端適應復雜,開發周期長,用戶使用成本高,擴展性差等問題。對此,本文討論并設計了一種基于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系統中的各個子系統可以獨自完成演化。
基于RESTful在線請假管理系統架構包含前端、后端和數據庫。前端分為三種角色(學生、輔導員、任課教師)三個模塊(主頁面、歷史記錄、個人信息及設置);后端使用Flask外暴露API響應前端HTTP請求并完成與數據庫交互和ORM(對象關系映射),通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中;數據庫中設三張表(請假表、學生表、教師表)。
用戶通過前端進行操作,前端JavaScript通過AJAX向后端發起請求,后端根據請求內容與數據庫交互,完成邏輯操作、ORM和數據持久化,返回JSON數據,前端解析JSON,異步刷新,呈現結果。
基于RESTful在線請假管理系統架構設計見圖1。

圖1 架構設計
根據請假系統需求和特點,基于RESTful的在線請假系統數據庫(leaveDB)設計有三張表,分別為請假表(leave)、教師表(teacher)、學生表(student)。通過登錄號碼長度來區分用戶角色,學生學號為9位,教師工號為6位。教師表通過Boolean類型的role字段來區分輔導員和任課教師角色。密碼通過Varchar類型passwd字段存儲經SHA256加密后的密碼。
基于RESTful的在線請假系統數據庫設計見圖2。

圖2 數據庫設計
根據前后端交互過程中數據的情況特點,基于RESTful的在線請假系統API設計主要如下:
(1)資源標識
REST中使用資源的特定名詞作為資源的URI,并設計相應的控制器和模型類。控制器用于處理邏輯,模型類用于和數據庫交互。根據交互過程中涉及的資源。
(2)參數設計
為了增加前后端交互的便攜性,對于不同功能返回不同的JSON鍵值對,前后端事先約定JSON格式,便于解析。參數設計詳見圖3。

圖3 參數設計
基于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。
本系統后端操作數據庫時,使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技術可以節約與數據庫交互的步驟,有效提高開發效率,并解決面向對象與關系數據庫存在的互不匹配的問題。
根據高校學生事務中“請假難”的痛點問題,主要表現在學生請假流程繁瑣,學校仍采用紙質假條不便于管理等方面。提出了基于RESTful的在線請假系統,旨在取代目前高校中采用傳統紙質假條請假的方式。本文對基于RESTful的在線請假系統進行了總體架構設計、數據庫設計、RESTful API設計,運用Python語言、ORM技術、Flask框架并以微信小程序的前端為例實現了該系統的主要功能。實際測試表明基于RESTful的在線請假系統速度快、功能完善、兼容性好、擴展性好、易于維護,達到了預期的效果。顯著提高了請假的效率,節約了教師和學生的時間,解決了“請假難”的問題。