悟空 CRM 9.0 发布,高品质 JFinal 开源项目
悟空CRM采用全新的前后端分离模式,本仓库代码中已集成前端vue打包后文件,可免去打包操作
如需调整前端代码,请单独下载前端代码,前端代码在根目录的ux文件夹中
主要技术栈
核心框架:jfinal3.8
缓存:redis caffeine
数据库连接池:Druid
工具类:hutool,fastjson,poi-ooxml
定时任务:jfinal-cron
项目构建工具:maven
Web容器:tomcat,undertow(默认)
前端MVVM框架:Vue.JS 2.5.x
路由:Vue-Router 3.x
数据交互:Axios
UI框架:Element-UI 2.6.3
悟空CRM是一个基于jfinal的开源crm系统,采用前后端分离的开发模式,提供了Aop,查询缓存,数据库连接池,定时器,excel导入导出等功能。
项目中主要有CRM,OA,项目管理,BI等模块,通过角色,部门,菜单实现了按钮级的功能权限控制和数据权限控制,通过将用户登录信息保存至redis来实现支持项目的热重启和分布式部署。
项目还拥有如下特性:
项目通过jfinal强大的AOP将权限判断从代码中抽离出来,用户无需手动判断登陆角色是否拥有权限,以下为通过权限注解在拦截器判断用户是否拥有访问权限
@Override public void intercept(Invocation invocation) { //TODO 权限功能后台拦截 Permissions permissions=invocation.getMethod().getAnnotation(Permissions.class); if(permissions!=null&&permissions.value().length>0){ JSONObject jsonObject= Aop.get(AdminRoleService.class).auth(BaseUtil.getUserId()); //组装应有权限列表 List<String> arr=queryAuth(jsonObject, ""); boolean isRelease=false; for (String key : permissions.value()) { if(!isRelease){ if(arr.contains(key)){ isRelease=true; } } } if(!isRelease){ invocation.getController().renderJson(R.error("无权访问")); return; } } invocation.invoke(); }
通过AOP和注解对数据进行非空校验,无需一个个判断参数是否为空,数据为空直接返回
自定义分页数据接收,自动处理分页参数和数据对象,给controller方法加上参数
BasePageRequest,T为对象类型,然后参数就会自动组装成分页参数和定义的对象类,以下为实现代码:
public class PageParaGetter extends ParaGetter<BasePageRequest> { public PageParaGetter(String parameterName, String defaultValue) { super(parameterName, defaultValue); } @Override protected BasePageRequest to(String s) { return null; }
@Override @SuppressWarnings("unchecked") public BasePageRequest get(Action action, Controller controller) { Parameter[] parameters=action.getMethod().getParameters(); Class clazz=null; for (Parameter parameter:parameters){ if(BasePageRequest.class.isAssignableFrom(parameter.getType())){ Type parameterizedType=parameter.getParameterizedType(); if (parameterizedType instanceof ParameterizedType) { Type[] params = ((ParameterizedType) parameterizedType).getActualTypeArguments(); clazz= TypeUtils.getClass(params[0]); } break; } } boolean isJson=controller.getHeader("Content-Type")!=null&&controller.getHeader("Content-Type").toLowerCase().contains("application/json"); return isJson?new BasePageRequest(controller.getRawData(),clazz):new BasePageRequest(controller.getKv(),clazz); }
}
自定义json工厂,实现对数据的个性化解析返回,如实现将数据返回时将数据转成驼峰规则,自定义某种类型的对象的返回格式等。
可以自定义错误处理模板,在出现错误或者其他异常的情况下,可以给予用户一个清晰的提示,避免用户看到一些无用的错误信息等功能
文件可以上传到项目目录之外,避免了重新打包项目后文件的丢失
@Override public void configConstant(Constants me) { me.setDevMode(prop.getBoolean("jfinal.devMode", true)); me.setInjectDependency(true); //设置上传文件到哪个目录 me.setBaseUploadPath(BaseConstant.UPLOAD_PATH); me.setBaseDownloadPath(BaseConstant.UPLOAD_PATH); //自定义json工厂 me.setJsonFactory(new ErpJsonFactory()); //限制上传100M me.setMaxPostSize(104857600); }
采用项目分层化的设计,职责分工明确,降低代码的耦合性Hander->对指定规则的url进行捕获或者放心Interceptor->环绕式AOP拦截,对访问权限,数据权限,参数等进行校验,可以配置在全局,单个路由,单个controller,单个方法等上面,可进行自定义实现,对数据进行处理
Router->对不同规则的数据进行分发,不同url进入不同路由和controller
Controller->对参数进行组装,将数据传入到service处理后进行render返回
Service->对业务代码进行处理,并将数据转入Db处理或缓存
Db->对数据库进行操作
Render->将service返回的数据在controller进行返回,以及出错后通过
SQL模板功能,将sql写入到xx.sql文件中,如果sql文件有变动,无需重新编译打包,直接改动sql文件中的sql即可,以下为自动扫描指定路径下sql文件的代码:
private void getSqlTemplate(String path, ActiveRecordPlugin arp) { File file = new File(path); if (file.exists()) { File[] files = file.listFiles(); if (files != null && files.length > 0) { for (File childFile : files) { if (childFile.isDirectory()) { getSqlTemplate(childFile.getAbsolutePath(), arp); } else { if (childFile.getName().toLowerCase().endsWith(".sql")) { arp.addSqlTemplate(childFile.getAbsolutePath().replace(PathKit.getRootClassPath(), "").replace("\\", "/")); } } } } } }
以下是系统的部分截图:
以下为悟空CRM9.0 JAVA版部分功能系统截图
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SpringCloud组件之Hystrix
在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性 一、Hystrix宗旨和工作原理 Hystrix的宗旨: 防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程 在任何可行的地方提供回退,以保护用户不受失败的影响 使用隔离技术(如隔离板、泳道和断路器模式)来限制任何一个依赖项的影响 通过近实时的度量、监视和警报来优化发现时间 通过配置的低延迟传播来优化恢复时间 避免在整个依赖客户端执行中出现故障,而不仅仅是在网络流量中 Hystrix工作原理 当需要完成某项任务时,通过 Hystrix 将任务包裹起来,交由 Hystrix 来完成任务,从而享受 H
- 下一篇
Java基础学习路线送给零基础的朋友
动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! 在我们迈进一个领域的时候,总会有一些疑问,如何能很快的适应?如何能进步快点?如何能掌握?学Java也是一样,尤其是零基础,更想知道如何学好Java,如何能熟练掌握这门技术呢?下面小编就来总结下针对Java零基础学员的学习路线: 第一:多看书,看一些Java视频教程:多下载一些Java相关的资料,多看多打代码,然后思考总结,书读百遍,其义自现。 第二:多交流:建议大家多加相关学习交流群,与里面的同学多交流互动,勤于回答问题,无论是群里的、论坛里、知道里的,你在帮助人的时候自己也是一个温习知识的过程,更能加深自己的印象,还能积累人际关系。 第三:多实践:(这点非常之重要)对于一个新手,最重要的莫过于动手了。如果没有真实的Java项目案例来动手,那么可以先通过Java项目源码来学习,这里会碰到英文的问题,大家不要害怕,现在很多的翻译工具,而且英文看多了后自然就看的明白了。 第四:不急躁:学习Java的热情往往可能是三分钟热度,每当遇到任何问题不要心烦气躁,而这时候就务必细心、耐心地去解决问题。 第五:数据...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7