jfinalQ開發教程02-許可權系統和一對多的處理
許可權系統
1.說明
基於jfinal的全域性Interceptor做的許可權系統,
分為兩塊,一是公開可以訪問的地址,二是簡單的RBAC許可權管理
2.公開訪問地址
需要配置專案中的jfinal-auth.xml檔案,如下:
其中外層可以自己起名字,只要最後的一層是以url命名即可,
一旦在這裡配置了路徑,任何使用者以及使用者是否登入都可以訪問。
RBAC
1.說明
RBAC,即role based access control,基於角色的訪問控制
2.表結構
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選單下有選單管理,使用者管理,角色管理,如下
3.新增選單
點選選單管理,以t_blog_type生成的程式碼為例,需要新增如下選單:
其中blog(--)是功能級選單,沒有實際意義,blog選單下有部落格型別管理,部落格文章管理,部落格評論管理,
每一個表對應需要新增五個選單,
父選單,部落格型別管理(/blog/type)
搜尋選單,/blog/type/search
編輯選單,/blog/type/savep
儲存選單,/blog/type/save
刪除選單,/blog/type/del
4.為角色新增選單
點選角色管理,以超級管理員admin為例,如下:
點選最後一個按鈕,管理角色對應的選單,如下:
將之前新增的部落格型別的五個選單勾選,並點選儲存。
若是其他角色,則勾選該角色需要訪問的選單即可。
5.重新登入
退出系統並重新登入,即可看到之前新增的選單,如下:
點選部落格型別管理,即可進行增刪改查,如下:
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對應,如下:
4.前臺-input.html,search.html
新增修改搜尋的時候需要顯示父表列表,和後臺方法中的blogTypes對應,如下:
jfinalQ2.0
原始碼:https://github.com/uikoo9/jfinalQ
更多精彩內容:http://uikoo9.com/
求打賞(長按圖片即可識別)~ |
捐助列表:http://uikoo9.com/donate/ |