通用學生考勤管理系統(基於人臉識別)

本項目名稱為Kitty SignIn,意為如同hello kitty壹般容易讓人接受且便捷的簽到考勤管理應用。項目基於Android Stduio開發(使用了以butterknife為代表的開源第三方插件,大大提升了開發效率),使用了LeanCloud這個國內出色的Baas平臺作為後臺(壹定程度上的確很方便,免去了很多後臺很瑣碎的工作)強力驅動數據存儲等業務,使用FacePlusPlus這個國內領先的面部識別服務供應商進行基礎的面部檢測,而前臺UI參考了Google Material Design 的設計理念,盡量做到簡單,明白,最大程度地方便閱讀和使用者信息的獲取,同時不失美觀簡潔便捷等優點。

參與者以及其職能

本項目作為壹個管理學生考勤的APP,共有老師,學生,服務端三個參與者共同協調進行工作。老師端進行簽到權限和會話的控制,直接操作服務端的數據,並且擁有查詢簽到統計結果等權限,而服務端對學生進行驗證並且限制管理,而學生端則可以進行簽到,查詢個人簽到等功能。


工作流程

下面請參考三個視頻對本應用有壹個基本的了解。

註冊

簽到

登錄


設計難點說明

  • 本項目實現整體按照軟件工程的設計理念,花費了很大的精力去獲取需求,設計整個項目的結構,邏輯,交互等,而使用較少的時間來進行編碼測試。項目整體設計符合面向對象的設計理念,並且設定了很多預留功能方便後續的模塊的集成或是添加,例如設定了SplashActivity這個活動進行基礎的判斷,後續可以加入版本驗證並進行升級,驗證用戶是否首次登錄或是某個版本首次登錄來進行更加精細的版本控制或是限制。當然也有需要改善的地方,例如首頁加入了雙擊退出程序的功能,但是卻沒和APP的生命周期結合起來使用,所以活動的返回棧沒有進行統壹的管理,這點上做的並不是很完善。

  • 因為設計之初就規定老師和學生的功能,在整個流程上來講功能非常地單壹而且簡單,所以在編碼實現的時候就選擇了老師端和學生端不分離,也就是說不做成常規的兩個應用,老師學生各壹個,這樣的設計我覺得很糟糕很冗余,所以直接在程序的入口處進行判定,是什麽角色再根據角色進行繪制不同的功能界面和圖形,實現不同的功能。但是這樣做也有問題就是會進壹步加劇程序邏輯的復雜性,很多地方都得寫分支查詢。

  • 數據庫的設計是最復雜的,雖然考勤功能這個模塊非常簡單,邏輯也很清晰,但是當涉及到學生,班級,老師,課程,專業,學院等信息的時候就會變得很復雜。就類似註冊頁面時需要分支判定用戶的角色,在考勤時需要考慮到壹個老師可能擔任多門課的講師,這些課程可能只是上課時間和地點不同,上課的時間可能只是整個學期的某幾周,那麽如何定位當前課程就是壹個很大的問題,數據庫中采用了壹個20位的字符串每個位僅為0或者1代表對應第幾周有本課程,然後使用了壹個自定義的文法規則的字符串例如[2:1,3:5](代表了本課程安排在周壹的第壹節課和周二的第五節課開始),然後當簽到流程開始的時候會獲取當前的教學周(從服務端獲取,本基礎信息由服務端進行維護和更新)和當前的星期天數,從而自動獲取本學生當日可能要上的課程然後給學生展示並進行選擇進行簽到。而課程設計也是壹個復雜的點,因為壹個學生對應了多門課程,這邊采用了指針類型的存儲方式將每個學生和課程表關聯,使用指針進行指向學生的關聯課程。

  • 因為使用了在線的文件存儲,例如加載頭像已經圖片的上傳和識別等,這使得業務的實現難度加倍了,會出現各種各樣的問題需要借助線程通訊等高級的設計技術才能解決,所以花費了很大的精力。

  • 概要設計以及數據庫,業務流程等設計參見提交文檔。


目前存在問題

  • 本項目因開發周期限制比較倉促,開發的功能非常有限,目前僅實現了學生端的簽到(還沒有將數據存儲到服務器,僅僅可以判定是否簽到成功),老師端的控制還沒有實現(目前通過直接更改服務器的數據)。但是老師是整個業務流程最重要的壹環(控制業務的數據流是否能夠繼續流動),例如老師端進行簽到課程,時間段的控制,那麽沒有老師那邊進行操作服務器是沒法打開驗證的,那麽即便學生通過了考勤驗證數據也是會被丟棄的,不會存入數據庫的。所以後續開發會進壹步進行完善,等期末結束之後完整地開發完這個項目。

  • 學生端和老師端都沒有完成數據的統計,邏輯已經有了只是差了統計的具體實現了。

  • 幾乎沒有寫註釋,也沒有寫異常處理。這是個非常糟糕的結果。

  • 設計初期的UI設計還有兩個沒有實現集成進APP中。這個比較遺憾,因為UI的設計也花了很大的功夫,例如Android 5.0特有的觸摸的波紋效果等。還有個效果利用了貝塞爾三階曲線,模仿了qq空間的禮花特效,也非常期待將之實現集成。

  • 其他各種各樣的問題。


代碼功能介紹

enter image description here

enter image description here

  1. app包中包含了Login和Register,分別控制登錄和註冊邏輯。
  2. Bean包中包含了Course,Student,User三個用戶,目前暫時沒有使用,準備後續開發的時候使用來存儲實體類,使用MVC的開發模式進行優化。
  3. Constant包中包含了最基本的常量,例如ServiceConstants則存儲了Leancloud和Facepp的AppID和AppKey,方便後續的移植,只需壹次更改。而DefaultConstants中則存儲了包括界面加載延遲,正則表達式,文件存儲名等,最多的是線程或是活動通信時的消息代碼。
  4. 因為本項目使用了CoordinateLayout做了個壹個側滑菜單,使用了Fragment,所以所有的界面都是基於Fragment的,而Navigation包中則是所有菜單欄中對應的頁面,包括簽到頁面 NavigationMain,開源頁面 GithubFragment,和設置頁面 SettingFragment 等,從文件名就可以看出。
  5. Utils包中包含了基本的工具類,UIUtils中包含了px、pt互相轉化,顯示Snackbar和Toast,根據Context和view進行查詢控件;而DevUtils中則包含了基本的開發中經常使用的函數,例如得到當前的星期數,反序列化上述定義的課程安排的語法,以及處理圖像等等。而LogicUtils中則包含了業務流程中經常使用的函數,例如得到當前的用戶。
  6. view包中則包含了基本的視圖布局,例如loadingdialogfragment則是第壹次上傳圖片時的loading界面,下面的webview則是用於內嵌的導航至開源以及博客介紹頁面的網頁瀏覽器。
  7. BubbleView則是基於貝塞爾三階曲線的動畫特效,CheersFragment則是對其的實例化,LeancloudService則是雲對接的類,MainActivity則是項目主頁的實現,ServiceCheckSplash則是基礎信息的校驗和控制的類。

具體的布局和樣式信息則不再進行贅述,詳情參見代碼。



後話

因為功能非常單壹,所以整個項目還是缺胳膊斷腿,我將在後來繼續進行開發維護直至我覺得相對完善。

項目可以在此進行下載:KittysignIn