2017-06-17 12:37
@netwild 关于第二点,指令参数必须是表达式,则不能是指令,所以你可以使用表达式作为自定义指令的参数
而指令间的嵌套是指这样的形式:
#dirAaa(...)
#dirBbb(...)
#end
#end
这样的嵌套 jfinal 必然是支持的,用自定义指令扩展是绝对可以实现你的需求的,有不少人已经是这样做的了,注意看下面的用法:
#hasPermission("menu:add")
。。。。。
#end
项目链接在下面:
http://git.oschina.net/jfinal/LMS/blob/master/lms-web/src/main/webapp/WEB-INF/views/admin/menu/menuManage.html?dir=0&filepath=lms-web%2Fsrc%2Fmain%2Fwebapp%2FWEB-INF%2Fviews%2Fadmin%2Fmenu%2FmenuManage.html&oid=da7ebdfd43636a17cc62c8ebe08d187f63befece&sha=0ad0fa183a3e90af4593f6bf6793377bbcb362cf
2017-06-17 11:40
@netwild 这个设计非常简洁,已点赞 + 收藏
有几个小建议:
1:#if(user.checkPerm("addUser")??false) 可以改为:#if(user.checkPerm("addUser")??),因为 ?? 表达式右侧没有任何表达式时与 expr ?? null 是完全等价的,而 null 值的 boolean 求值为 false
2:建议用 jfinal template engine 的指令级扩展实现界面的权限控制,类似于这样的用法:
#roles("role1", "role2")
### 显示某某菜单的 html 内容
#end
#permission(...)
### 显示某某操作按钮的 html 内容
#end
3:EInterceptorAuth 这个拦截器有线程安全问题,因为 jfinal 拦截器是全局共享的,所以 authCode、authId、authIds 这三个属性在多线程并发时会出问题
改进的办法是将继承 Interceptor 改为继承 PrototypeInteceptor。最好的办法是让那三个属性变为方法内的临时变量,这样性能最好
2017-06-16 11:54
@rocker18 日志写数据库要用一个独立的库,不要与业务使用同一个库,写日志入库的时候先写到内存的缓存队列之中,然后用独立的线程定时批量写入库