本專案是使用SpringBoot2構建的一套基於RBAC許可權模型的後臺管理系統,前端是微信小程式。
專案地址:
專案的緣由
最近接了個外包,主要是針對於駕校開發一個代理小程式。目的是為了方便駕校的管理來招攬學員,同時方便維護學員和代理資訊。
專案介紹
專案業務功能介紹
本專案的業務需求比較少,是一個傳統專案,核心的業務點是許可權管理,這裡我就採用比較規範的RBAC許可權模型來開發。由於專案比較小,這裡我就沒有采用Shiro或SpringSecurity等許可權管理框架,而是自己使用過濾器開發了一套。我認為這可以算是許可權管理的雛形,如果有更復雜的許可權管理需求,可以很方便的基於此擴充套件。
- 管理員角色為最高許可權,賬戶為admin,初始密碼為123456。
- 管理員可以建立一級代理、新增學員。
- 一級代理可以建立二級代理、新增學員。但是一級代理建立的代理和學員初始為未稽核狀態,只有超管才能稽核
- 二級代理只有在稽核通過後才能新增學員且二級代理不能建立代理。
- 針對每個代理獲取其下的所有學員,如果是超管或一級代理獲取其新增學員的同時獲取其下子代理的學員。
- 排行榜系統。根據每個代理所新增的代理或學員數(包括子代理的學員數)來確定代理的業績。獲得日業績排行和總業績排行
- 針對排行榜中的代理進行點贊和評論。
技術實現
-
首先認證方面,我這裡仍然採用jwt token的認證方式。這裡我預設實現了記住密碼的功能。即使用者第一次登陸成功之後返回一個token在response header中,該token的有效期為2小時,伺服器端我儲存一個有效期為1周的refresh token。使用者在2個小時之內登入不會返回token,2個小時和一週之內第一次攜帶過期token我會返回新的token在response header。一週之外refresh token失效,這裡需要使用者重新登入。 這裡我也是借鑑了別人的思路:segmentfault.com/a/119000001…
-
許可權管理方面,我這裡共用了4張表,其實基準的RBAC許可權模型最少要5張表。這裡比較簡單,所以我主要是使用者表、角色表、許可權表以及許可權角色表。使用者和角色是一對一的關聯關係、角色和許可權是一對多的關係。表結構如下:
- Filter實現許可權過濾。這裡比較簡單,但是記錄一個比較雞肋的事。就是在SpringBoot中使用Filter時,SpringBoot提供了
@ServletComponentScan(basePackages = "com.beautifulsoup.driving")
和@WebFilter
及@Order
註解,但是這裡的@Order
並不能實現多個Filter的順序性,無奈我只能採用FilterRegistrationBean
來注入Filter,同時請求第一步進入的是Filter且其不被Spring管理,故而不能通過@Autowired
註解只能構造方法注入。Filter內部用ThreadLocal儲存使用者資訊,校驗使用者的許可權,ThreadLocal作為執行緒級別物件,對於SpringSecurity中的使用者資訊儲存也是基於此的。 - 資料訪問層,這裡我使用的Spring Data。包括Spring Data Jpa和Spring Data Mongodb。傳統專案沒必要針對SQL做太多優化,這裡我就純ORM。
- 排行榜系統,仍然是記錄使用者新增代理和學員之後記錄入Redis。ZSET記錄使用者的日業績和總業績,然後將前10名從Hash中返回,提升效率。
- 點贊仍然使用Redis維護代理的點贊數、評論資料入Redis。
- 匯出Excel,方便管理員維護代理和學員資料,這裡採用Apache POI
小程式介面展示:
介面文件:
文件地址:
例子:
技術包括
-
Spring Boot 2.1.3
-
Spring Data Jpa
-
Spring Data Redis
-
Spring Data Mongodb
-
Spring Boot Mail
-
Swagger
-
Quartz
-
JWT Token
-
FastDFS
-
apache poi
要點
- 熱點資料入Redis,提高SQL的查詢效能
- 認證採用Jwt Token+Refresh Token+黑名單策略,提高使用者體驗
- 許可權管理採用規範的RBAC許可權模型
- 點贊、排行等資料入Redis,每天進行一次Quartz任務排程,Redis中資料落庫
- 評論、釋出公告等資訊入Mongodb,便於儲存、操作