最近在學習Spring Boot,以前看有人說學習編程最好的方法就是本身動手寫程序,有個前輩推薦本身作一個模擬在線票務系統的服務。我便本身動手作了一個。前端
該項目的實現採用了Spring Boot + MyBatis,集成Spring Security和JWT實現用戶的認證和受權。git
項目結構以下:github
主要有三個對象:用戶、票和訂單。數據庫
用戶有ID、用戶名、密碼、頭像在服務器地址URL等我的信息。用戶的方法有:註冊(/customer/register)、登陸(/customer/login)、查看用戶資料(/customer/myProfile)、上傳頭像(/customer/uploadAvatar)。編程
票有ID、車次、始發站、目的地、出發時間、到達時間、座位類型、座位號、價格、是否被預約及用戶ID的屬性。方法有:根據始發站、目的地和出發日查找可購買的車次信息(/ticket/search)。這裏使用了MyBatis插件PageHelper來作分頁查詢。後端
訂單的屬性有:ID、用戶、票。訂單的方法有:購票(/order/new)、退票(/order/roll)、查看「個人訂單」(/order/myOrder)。購票和退票的過程要使用數據庫事務來處理。服務器
GitHub上Release版本 0.9主要實現了以上的功能。1.0集成了Spring Security,使用JWT實現用戶的認證和受權。微信
認證的過程以下:向/login地址發送POST請求,提交包含用戶名密碼的表單,程序進入JWTLoginFilter的attemptAuthentication方法,接收並解析用戶憑證。 而後進入CustomerAuthenticationProvider的authenticate方法將接受到的用戶信息與數據庫中信息作比較, 若是一致,生成令牌並進入JWTLoginFilter的successfulAuthentication方法,在該方法中生成JWT並將JWT做爲response的header返回至前端。併發
在以後的請求中只要將JWT設置爲request header的「Authorization」字段傳給後端,後端就能夠解析該header獲取用戶信息。分佈式
數據庫名爲ticketmanagement,有三張表:customer、ticket、orderform(這裏由於order是SQL關鍵字,表名爲order會產生運行時錯誤)。
customer:
ticket:
orderform:
1.SQL優化,數據庫操做處理作的還比較粗糙,在高併發操做數據庫的狀況下可能產生響應時間較長等問題。後續能夠經過優化SQL來提升性能。SQL優化這裏博主仍是掌握的還不是很好,但願有思路和建議的朋友能夠在下面留言或者和我聯繫來幫助我。
2.將用戶認證、受權和票務管理服務拆分,作成微服務形式。微服務是當下的熱點,有解耦和分佈式等優勢。也是對本身技術棧的積累。
3.添加郵件服務功能,實現註冊成功向註冊郵箱發送郵件。