1. 程式人生 > >jfinalQ開發教程02-許可權系統和一對多的處理

jfinalQ開發教程02-許可權系統和一對多的處理

security_icons.png

許可權系統

1.說明

基於jfinal的全域性Interceptor做的許可權系統,

分為兩塊,一是公開可以訪問的地址,二是簡單的RBAC許可權管理


2.公開訪問地址

需要配置專案中的jfinal-auth.xml檔案,如下:

4.png

其中外層可以自己起名字,只要最後的一層是以url命名即可,

一旦在這裡配置了路徑,任何使用者以及使用者是否登入都可以訪問。


RBAC

1.說明

RBAC,即role based access control,基於角色的訪問控制


2.表結構

5.png
t_ucenter_menu表記錄了各個訪問地址,也就是選單

t_ucenter_user表記錄了使用者資訊

t_ucenter_role表記錄了角色資訊

t_ucenter_role_r_user表記錄了角色-使用者關係

t_ucenter_role_r_menu表記錄了角色-選單關係


3.許可權控制

如果使用者A,屬於角色A,且角色A有選單1-5的許可權,那麼使用者A即可訪問選單1-5


程式碼生成後設置許可權

1.程式碼生成的最後一步

上文說了程式碼生成,將生成的程式碼複製到專案中,功能還是不能訪問的,需要手動進行許可權設定


2.admin登入

以admin登入jfinalQ,登入後auth選單下有選單管理,使用者管理,角色管理,如下

6.png


3.新增選單

點選選單管理,以t_blog_type生成的程式碼為例,需要新增如下選單:

7.png

其中blog(--)是功能級選單,沒有實際意義,blog選單下有部落格型別管理,部落格文章管理,部落格評論管理,

每一個表對應需要新增五個選單,

父選單,部落格型別管理(/blog/type)

搜尋選單,/blog/type/search

編輯選單,/blog/type/savep

儲存選單,/blog/type/save

刪除選單,/blog/type/del


4.為角色新增選單

點選角色管理,以超級管理員admin為例,如下:

8.png

點選最後一個按鈕,管理角色對應的選單,如下:

9.png

將之前新增的部落格型別的五個選單勾選,並點選儲存。

若是其他角色,則勾選該角色需要訪問的選單即可。


5.重新登入

退出系統並重新登入,即可看到之前新增的選單,如下:

10.png

點選部落格型別管理,即可進行增刪改查,如下:

11.png


6.程式碼生成完結

至此,程式碼生成並分配許可權全部完成,

按表規範設計表,生成程式碼,拷貝程式碼,設定許可權,使用功能,

普通的增刪改查的實現,估計不超過5分鐘。


一對多

1.說明

基本上所有的系統都會涉及到一對多和多對多,而多對多又可以轉換為一對多,這裡說下一對多的相關操作


2.弱外來鍵

個人認為弱外來鍵是比較好的習慣,即在子表中記錄父表id,而不做外來鍵關聯。

需要注意的是,採用弱外來鍵後需要在程式碼層級做控制。


父表

生成程式碼後需要做一些修改,包括後臺程式碼和前臺程式碼,以t_blog_type和t_blog_article為例

1.後臺-Model

BlogTypeModel需要獲取對應的所有的BlogArticleModel,所以需要新增:

/**
	 * get articles
	 * @return
	 */
	public List<BlogArticleModel> articles(){
		return BlogArticleModel.dao.find("select * from t_blog_article where blog_type_id=? order by blog_article_title", get("id"));
	}

也就是通過t_blog_type的id來獲取所有t_blog_article中blog_type_id相對應的值


2.後臺-Controller

在程式碼級別做控制,那麼當刪除t_blog_type的一條記錄時,會預設刪除所有相關的t_blog_article記錄,如下:

/**
	 * 刪除一條或多條
	 */
	public void del(){
		QJson json = del(BlogTypeModel.class, BlogArticleModel.class, "blog_type_id");
		if(QJsonUtil.TYPE_BS_SUCC.equals(json.getType())){
			QCacheUtil.putToEHCache("blogTypes", BlogTypeModel.dao.findAll());
		}
		
		renderJson(json);
	}

3.前臺頁面

無需修改


子表

1.後臺-Model

無需修改


2.後臺-Controller

顯示子表列表的時候需要關聯父表,例如需要顯示blog_type_name,所以index方法需要修改為:

/**
	 * 跳轉到首頁 
	 */
	public void index(){
		setAttr("qpage", listBySql(getParaMap(), " (select ba.*,bt.blog_type_name tname from t_blog_article ba, t_blog_type bt where ba.blog_type_id=bt.id ) as tba ", "tba"));
		render("/WEB-INF/view/manage/blog/blog-article-index.html");
	}

同樣進行新增修改搜尋的時候需要顯示父表列表,所以相關方法需要新增父表列表,

/**
	 * 跳轉到搜尋頁面
	 */
	public void search(){
		setAttr("blogTypes", BlogTypeModel.dao.findAll());
		
		render("/WEB-INF/view/manage/blog/blog-article-search.html");
	}


3.前臺-index.html

列表頁面要顯示blog_type_name,和index方法中的tname對應,如下:

12.png


4.前臺-input.html,search.html

新增修改搜尋的時候需要顯示父表列表,和後臺方法中的blogTypes對應,如下:

13.png


jfinalQ2.0

官網:http://uikoo9.com/jfinalQ

原始碼:https://github.com/uikoo9/jfinalQ


更多精彩內容:http://uikoo9.com/


求打賞(長按圖片即可識別)~
微信 捐助列表:http://uikoo9.com/donate/