权限系统
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/ |