梁天鴻 聶佳偉 呂偉豪南京郵電大學通達學院
由于學院正方系統空教室查詢功能不向學生開放,許多學生在日常學習、期末復習或考研準備中,難以知曉學校教學樓是否有空教室以供自習。同時,存在單人占據一個自習室,后來者因擔心產生誤解和影響而放棄同教室自習,既造成校園自習室資源的浪費,也耽誤了學生寶貴自習時間。通達自習通以二維碼為媒介,配合后臺云數據庫管理,為學院有效管理自習教室提供了科學依據。
通達自習通是一款基于微信平臺,能實現對自習室進行科學管理與查詢的微信小程序,通過小程序的云開發功能,實現對自習室數據的記錄、修改、查詢。使用者在給予該小程序登錄接口的授權并調用權限后,對自習室已布置的靜態二維碼標簽掃描簽到,微信后臺會調用云函數自動記錄最新的數據,在云數據庫中對信息進行修改。使用者也可以查詢各個教室的使用情況及用戶的最近自習時間記錄,從而選擇合適的教室進行學習,采用定位計算距離并判斷的函數,限制只有在教室200 m內才能簽到,有效防止有人惡意掃碼占位。
在本程序的前端界面實現中,采用了適配微信小程序的語言wxml、wxss、js進行編譯。微信小程序的框架包含兩部分:View視圖層、App Service邏輯層。View層用來渲染頁面結構,AppService層用來邏輯處理、數據請求、接口調用,在兩個線程里運行。其中,視圖層使用WebView渲染,邏輯層使用JSCore運行,通過在app.json里創建各頁面Page的配置文件,以wxml和wxss編寫視圖層,由組件來進行展示;邏輯層中的動態數據均來自對應Page的data,可以通過setData方法修改數據,從而將數據進行處理后發送給視圖層。最后,基于系統層的JSBridage為視圖層與邏輯層間提供了數據傳輸和事件系統,可以讓開發者更方便地聚焦于數據與邏輯上。
2.2.1 云開發環境配置

圖1 云開發流程
云開發是一套解決小程序前后端開發的云端工具,如圖1所示,提供了一整套云服務及簡單、易用的API和管理界面,以盡可能降低后端開發成本,讓開發者能夠專注于核心業務邏輯的開發,盡可能輕松地完成后端的操作和管理。
(1)云函數。是一段運行在云端的代碼,無需管理服務器,在開發工具內編寫、一鍵上傳部署即可運行后端代碼。完全使用Node.js編寫,可以操作云端數據庫和存儲空間。小程序提供了專門用于云函數調用的API,開發者可以在云函數內使用wx-server-sdk提供的getWXContext方法獲取到每次調用的上下文(appid、openid等),無需維護復雜的鑒權機制,即可獲取天然可信任的用戶登錄態(openid)。
(2)云數據庫。云開發提供了一個既可在小程序前端操作,也能在云函數中讀寫的MongoDB數據庫,可提供每日5萬次的數據庫讀取請求,滿足絕大部分小程序應用。另外,一個數據庫可以有多個集合(相當于關系型數據中的表),集合可看作一個JSON數組,數組中的每個對象就是一條記錄,記錄的格式是 JSON對象。通過對創建的數據庫進行修改,可以使用云函數來操作數據庫的讀寫。
(3)云存儲。云開發提供了一塊存儲空間,在小程序前端直接上傳/下載云端文件,在云開發控制臺可視化管理。微信平臺推出基于“無服務開發小程序”,即Serveless。基于Servelss架構的小程序依賴云平臺提供的后臺服務,使得在小程序端可以分別調用wx.cloude.uploadfile和wx.cloude.downloadfile完成上傳和下載云文件操作。
2.2.2 云數據庫設計
在數據庫的使用中,直接使用云數據庫功能,建立了一個class的云數據庫來存儲各個教室的使用情況。這個數據庫包含的字段有:教室人數、教室名、在該教室的簽到/簽退時間;每次簽到或者簽退,都會通過調用自己定義的qiandao云函數,來記錄教室的人數、時間與教室的變化。
鑒于實現整個系統功能的需要,設計出了系統實現流程。
首先,在小程序文件夾中建立cloud和miniprogram兩個目錄,并在package文件中配置,通過編寫數據庫函數cloud.database().collection(class),在小程序云端創建教室數據庫。由于要充分利用每個自習教室,所以要將大量自習教室納入規劃,為每個空閑教室生成有唯一標識性的二維碼。其次,創建自習教室的同時,可以設置自習教室的正常使用時間和最大容量人數,若不在正常使用時間范圍內,或超過自習教室課容納人數,則不允許簽到或簽退操作。
為了防止自習教室的靜態二維碼被故意保存后,在非自習教室區域外進行掃碼簽到、干擾正常使用,本團隊在程序中添加了distance∶function與wx.getLocation函數,對簽到進行距離限制。distance∶function函數是對使用者與簽到教室之間的距離進行計算,wx.getLocation函數是獲取簽到者經緯度,再調用distance∶function函數與設定好的經緯度進行計算,得到距離。通過條件語句進行判定,若簽到距離在200 m之內,就會跳轉簽到按鈕,否則將無法跳轉,不能進行簽到。
掃碼簽到是通達自習通的核心功能。首先,小程序中編有wx.scanCode函數,允許從相機和相冊中調取圖片進行掃碼。用戶在掃描相應自習教室的二維碼后,微信服務器向系統跳轉用戶的信息,系統判斷用戶的唯一性和自習教室否處于正常狀態(使用時間范圍內和可容納人數范圍內),將二維碼攜帶的信息及掃描用戶的微信openid發送到業務服務器,在簽到/簽退成功后,調用_getYMDTime與_getcurrentTime函數獲取此時刻時間,并將其存入定義的times數組中。其次,再將class數據庫與times數組中的數據渲染到界面上,顯示在哪個時刻在哪個教室簽到/簽退,并且簽到/簽退的同時都會調取qiandao云函數對數據庫中教室的人數進行實時修改,保證數據的準確。
本設計項目可以基本解決自習教室資源和學生自習時間浪費的問題,實現自主簽到循環過程,有利于合理分配空閑教室,方便學生找到適合自己學習的教室。通達自習通現可在學院自習教室投入使用,運行狀況良好,但也存在不足之處,例如:定位簽到存在一定偏差,短距離內不能保證二維碼不會被學生誤掃,簽退功能對于人為因素敏感性高。當然,只要學生積極學習,并誠信使用通達自習通,所有問題都將迎刃而解。