軟件工程個人總結-社團管理系統
組號:第一組
一、引言
1.1 項目介紹——社團管理系統
1.1.1 項目背景
在當代大學生的日常生活中,社團是必不可少的一個部分。如果僅僅是通過紙質文檔進行管理的話,不但需要耗費大量的人力和資源,也會給管理造成不便。為了提升社團組織者對社團管理的便利性,我們小組選擇社團管理這一主題,開發一款便於社團管理的系統。
1.1.2 系統簡介
社團管理系統的操作角色分為游客、學生、管理員三種類型,集成了社團瀏覽、活動瀏覽、社團申請、活動創建、活動審批、入社申請審批、社團內部事務管理等功能模塊,為社團管理者與學生提供一個方便的數字化管理平台。
1.2 相關文檔匯總
二、項目制作過程——個人分工
2.1 起步
2.1.1 需求分析
參與組內討論,根據學生、普通社員、社長、管理員4種角色來提出需求
2.1.2 墨刀原型
兩項簡易墨刀原型
2.2 設計圖
詳見 設計圖文檔
2.2.1 用例圖
全部用例圖
2.2.2 順序圖
僅參與確認
2.2.3 類圖
整個類圖的繪制與類圖說明
2.3 技術選型
2.3.1 查閱與學習
由於組內成員沒有相關項目開發經驗,如前端框架、路由、接口信息接受發送,后端框架、信息接受與發送。因此學習、試錯花費大量時間。
查找資料,並最終選定的技術選型如下:
-
前端
- Vue 2.0 前端框架,優點:數據動態綁定、將模塊封裝成組件以便重復使用、利於分工
- Element UI 提供大量實用性組件
- Vue-admin-template 集成了路由、本地存儲、Token攜帶、Api發送接收等功能,使項目開發更高效
- Easy-mock 接口未完善前,提供前端隨機生成的mock數據
-
后端
-
Java 編程語言選擇
-
JWT 服務器生成Token令牌,客戶端將其存儲在RequstHeader中自動發送,便於用戶認證
-
MD5 密碼二次加密
-
Shiro 安全框架,用於角色及權限判斷,並提供過濾器
-
Redis 利用redis自帶的生命周期功能,做token緩存
-
Maven 模塊化管理
-
Mongodb 嘗試NoSql數據庫
-
SpringBoot SOA服務核心框架、使用其封裝的annotation,便於request請求接收與自定義異常信息
-
-
開發工具
-
Webstorm WEB端開發工具
-
Idea Java后端開發工具,自帶SFTP上傳服務器功能,共享后端代碼
-
Postman 團隊分享型接口數據測試工具。優點:可保存、可共享、分類清晰、reques請求選項充沛等
-
Mongodb Compass 連接Mongodb的GUI。缺點:自動斷開連接后必須重啟
-
2.3.2 准備工作
編碼前做的工作如下
-
前端:
- 提前用過vue和部分模版,為前端組員解釋部分框架使用方法,及分析模版的部分設計思路與實現。
-
后端:
- Redis服務器環境搭建、部分Java框架搭建
- 接口異常控制類、Jedis測試類、自定義Realm類、JWTFilter類
- 登錄注冊等接口測試成功
2.3.3 分工策略
前后端各兩人。
我負責后端接口、權限認證,另一名后端組員搭建Spring和數據庫環境、提供數據庫調用、邏輯操作方法及數據庫維護。由我進行與前端的溝通,並向另一名后端組員提出方法邏輯與參數,有種分層不干擾的感覺。
2.4 后端接口
2.4.1 權限驗證
- 利用JWT包將用戶登錄id與登錄期限時間進行HMAC256加密獲得Token
- 運用Shiro框架,當客戶訪問接口時先驗證token,角色權限符合則通過,否則過濾
了解機制:Shiro整合JWT實現無狀態鑒權機制(Token)
參考代碼: shiro 框架的構建以及與 JWT 的整合
2.4.2 Redis緩存
- 利用Redis自帶的Expire為token添加生命周期
- 當token未過期時,如果再次進行操作則自動延長Redis中的生命周期,jedis.set中的參數創建狀態為 “XX”
2.4.3 接口
-
Java接口類匯總
- ActivityController 活動管理接口
- AnnouncementController 通知管理接口
- AssociationController 社團管理接口
- AwardController 獎項管理接口
- ExceptionController 異常類
- JoinFormController 社團申請表管理接口
- UserController 用戶管理接口
-
接口使用說明
- 接口具體細節可查看我編寫的接口文檔
-
遇到的困難(網上沒找到的)
-
前端 Request Payload 和 RequestBody 的數據如何獲取?
- 解決: 在Controller中前者通過 @RequestBody捕獲,后者是 @Valid
-
Jedist 連接時 出現protected mode錯誤
- 解決: 為redis設置auth,即在redis.conf中添加requirepassword
-
@RestControllerAdvice 和@ExceptionHandler 不能處理Shiro Realm中拋出的異常AuthenticationException,在網上找不到可行的方法。。。
理想:
現實:
-
解決: 建立一個捕獲/unauthorized 的Controller類
代碼:
結果返回:
-
-
2.4.4 部署
與前端組員測試所有接口,與后端另一位組員修復已知bug,非常重要且花時間的環節。
基本測試結束之后,將后端程序打包部署到服務器。
2.5 不足
- 僅通過角色分配權限,沒有另外的權限表
- 后端的二次加密沒能理解MD5的加鹽,僅在前端加密基礎上再次進行MD5加密
- 初次使用Java各類框架,沒有查看過相關文檔,理解淺薄,比如某些annotation的作用范圍只在一個包內。
- ·········
三、項目總結
做的時候砍了很多一開始想到的東西,組內針對某些需求如何實現進行了許多爭論。分析原因,是當初需求分析不夠具體。
例如一開始想到有活動通知、社團通知,前端人員在編寫頁面時本打算在創建活動時一並發送該活動的創建通知,如果這樣做考慮到活動需要審批,那么通知也需要設置狀態,顯然不合理,其實只要在活動申請通過后系統自動生成通知即可。
在項目進行中必然存在關鍵路徑,其中某個人的延誤(例如bug、技術難點、摸魚等)會導致整個項目的停滯。但仔細一想,如果需求分析做的足夠具體那其他人至少可以做好應接工作,當然也不能只埋頭干自己的。
另外,社團管理作為我的第一個小組作業,讓我受益良多,比如:
- 分工要明確,如WEB前端可以細分到每張頁面、模塊,角色權限路由管理等
- 借鑒別的組,加入懲罰制度(防止個別人基本沒有進度)
- 周報告中每個人完成了什么要仔細記錄,對比工作量
- 每周進行一次組內匯報,記錄好進度、規划好計划
從我做后端接口的角度來看,盲目的堆砌代碼對項目沒有太大幫助,而與前端和數據庫的溝通、對接口需要提前約定、及時解決對接問題、按時完成任務才是對團隊最大的幫助。其次,團隊氣氛非常重要,假設某人一周只做了5分鍾的工作量,不僅加重相同模塊其他組員的負擔,還影響團隊氛圍,匯報時尷尬的不行。
四、課程建議
上啥課都發呆型選手。。。上課風格與理論知識沒啥建議
-
需求分析很重要,但我們一開始寫的東西完全像是介紹有什么功能,而不是具體如何實現,后來看了老師給的參考才恍然大悟。可能提前給出參考會更好
-
在大三之前基本沒有需要合作的大作業,對於下一屆計科,或許可以讓他們在暑假短學期做一些預備。例如:
- 團隊類型的項目(選做),提前熟悉團隊工作模式,讓大家熟悉一下彼此的能力與耐力(誰比較水)
- 積累一些前后端的經驗
-
在原型檢查階段,經老師提醒目前市場APP開發經驗的重要性。那么在公布大作業的時候可以順帶做一下說明,引起學生注意。