本項目是使用SpringBoot2構建的一套基于RBAC權限模型的后臺管理系統,前端是微信小程序。
項目地址:
github.com/fuyunwang/D…
項目的緣由
最近接了個外包,主要是針對于駕校開發一個代理小程序。目的是為了方便駕校的管理來招攬學員,同時方便維護學員和代理信息。
項目介紹
項目業務功能介紹
本項目的業務需求比較少,是一個傳統項目,核心的業務點是權限管理,這里我就采用比較規范的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
小程序界面展示:
接口文檔:
文檔地址:
github.com/fuyunwang/D…
例子:
技術包括
-
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,便于存儲、操作