Java学习日志day02——jfinal cms
jfinal cms简介
jfinal cms,采用了简洁强大的JFinal作为web框架,模板引擎用使用的是非常方便的beetl,数据库采用mysql,前端bootstrap框架。 支持多站点、oauth2认证、帐号注册、密码加密、评论及回复,消息提示,网站访问量统计,文章评论数和浏览量统计,回复管理,支持权限管理。
后台模块包含:栏目管理,栏目公告,栏目滚动图片,文章管理,回复管理,意见反馈,我的相册,相册管理,图片管理,专辑管理、视频管理、缓存更新,友情链接,访问统计,联系人管理,模板管理,组织机构管理,用户管理,角色管理,菜单管理,数据字典管理,参数配置,站点管理。
java框架jfinal架构图
java模板beetl
- 变量引用
变量引用与其他模板相同,可以通过 n a m e 调 用 。 这 里 要 特 殊 说 明 的 是 b e e t l 支 持 获 取 m a p 属 性 , 即 调 用 g e t ( O b j e c t k e y ) 。 如 果 对 象 既 有 具 体 属 性 g e t N a m e ( ) , 又 有 g e t ( O b j e c t k e y ) , 则 以 具 体 属 性 优 先 级 高 。 如 {name}调用。 这里要特殊说明的是beetl支持获取map属性,即调用get(Object key)。如果对象既有具体属性getName(),又有get(Object key),则以具体属性优先级高。如 name调用。这里要特殊说明的是beetl支持获取map属性,即调用get(Objectkey)。如果对象既有具体属性getName(),又有get(Objectkey),则以具体属性优先级高。如{user.name}先进行调用getName()方法如果没有再调用get(Object key)方法。 - list循环
- 函数调用
- 可以直接调用registerFunctionPackage(namespace,yourJavaObject),这时候yourJavaObject里的所有public方法都将注册为Beetl方法,方法名是namespace+"."+方法名
jfinal cms中有许多方法和前台接口都是用了这种方式。
jfinal cms技术
项目结构
后台开发模块
首先后台代码主要分为Controller,Model和Service。Controller负责参数传递和页面跳转;Model负责数据承载;Service负责复杂业务处理。
- controller首先需要继承BaseProjectController类,这样方便项目统一扩展,页面跳转主要包含list(列表页)、add(添加页)、view(查看页)、delete(删除数据)、edit(编辑页)和save(保存方法)。这几个是基本操作,常规增删改查均以此规范进行编写。Controller遵循jfinal设置规则,并加入了注解功能。以下列表访问地址就是/admin/contact/list;编辑页面地址就是/admin/contact/edit/${id}。
- Model需要继承BaseProjectModel,方便业务扩展。jfinal
Model可以不添加get、set方法。Model遵循jfinal设置规则,并加入了注解功能。通过ModelBind可以直接设置对应的表和主键,主键默认是ID。
get、set方法可以通过作者的AutoCreate组件自动生成。 - Service集成BaseService,主要是Controller中复杂业务处理,将Controller中大量代码或者重复代码进行封装,统一调用。
页面代码
后台模板主要是增删改查,jfinal cms使用beetl模板。
页面主要以${module}_名开头,包含add(添加)、edit(编辑)、list(列表)、view(查看)几个页面。
- add页面代码添加页面可以与edit页面公用~只是传递参数均为空。
- edit页面采用了beetl安全模式,保证参数为空不报异常,这样能够让add很好的引用。其次后端页面都采用了公共的头部标签head.html,列表和查看页面也是如此。
- 列表页方法调用以oper对象调用形式封装。增加、修改、查看页面以弹框形式展示,这样可以很好的保存列表页查询条件。查看页面关闭不会刷新列表,添加和修改页面关闭后均会刷新列表,均已封装为Iframe方法。
paginator属性为列表分页查询调用方法。 showMenu方法为菜单选中展现,具体参数在菜单管理进行配置。
menu.html为菜单栏,各页面直接引用即可。paginator.html为分页栏,固定获取page参数进行处理。
列表头部设置设置class="sorting"为支持排序功能,name字段为传到后台的参数值。 - view页面相对简单,只是一个数据展示
前台模版开发
java代码
- 前台CommonController为整个项目默认入口,项目根目录、登陆、登出等。
TemplateService为前台模板接口,这里的TemplateService通过beetl方法注册实现接口调用。再config中进行注册,代码如下groupTemplate.registerFunctionPackage(“temp”,
TemplateService.class);这个不明白可以看下beetl文档,这样就实现了页面调用temp.article(1)返回文章对象。 - 后台service封装实现具体方法,template进行service调用提供接口。这样前台页面直接访问template接口,很好的实现了代码前后端代码分离。当然前台的java还进行了公共Controller的封装以及公共参数的传递。
如文章、评论、消息、个人信息、注册、标签等公共Controller以及统一前台参数传递拦截器FrontInterceptor。
前台模版接口
前台默认入口
FrontInterceptor前台拦截器会传递友情链接、关于我们、推荐文章和栏目信息数据。然后根目录会默认访问当前站点设置的栏目,如果未设置那么展示TbFolder.ROOT栏目,如果url传递了目录Id或者目录urlKey那么会访问对应的栏目。跳转规则是优先处理跳转jumpUrl,其次是配置的模板路径,如果都没有按照默认home/${urlKey}.html的规则跳转。从这里可以看出,简单的栏目规则就是每个站点下面栏目是和urlKey一一对应的。
如我们添加一条栏目,id:101 urlKey:jflyfox那么我们可以通过“项目地址/101.html”访问,也可以通过“项目地址/jflyfox.html”访问。但是默认的栏目菜单生成规则是优先使用urlKey。
其次是FrontAlbumImageController和FrontAlbumVideoController分别是图片和视频模块统一入口
前台接口
前台接口主要是TemplateService这个类,提供方式是利用beetl函数注册方式,如groupTemplate.registerFunctionPackage(“temp”, TemplateService.class);代码,这样我们就可以通过temp.${method}进行调用了。
例如通过temp.countView(100),我们就能获取到文章id为100的浏览量,temp. articlePage(23,1,20)我们就能够获取到栏目id为23下面的前20条文章。
接口主要提供了文章列表、文章内容、浏览量、评论量,栏目标签,栏目、滚屏图片列表和提醒列表等信息。