当前位置: 首页 > 后端技术 > PHP

悟空CRM(基于Jfinal+vue+ElementUI)核心代码讲解

时间:2023-03-29 15:31:17 PHP

代码仓库地址https://gitee.com/wukongcrm/7...悟空CRM采用全新的前后端分离模式,并且前端已经集成在这个仓库代码中,vue打包后,可以省略打包操作。如需调整前端代码,请单独下载前端代码。前端代码在根目录ux文件夹主要技术栈核心框架:jfinal3.8缓存:rediscaffeine数据库连接池:Druid工具:hutool、fastjson、poi-ooxml定时任务:jfinal-cron项目构建工具:mavenWeb容器:tomcat,undertow(默认)前端MVVM框架:Vue.JS2.5.x路由:Vue-Router3.x数据交互:AxiosUI框架:Element-UI2.6.3悟空CRM是一个开源的crm系统基于jfinal,采用前后端分离的开发模式,提供Aop、查询缓存、数据库连接池、定时器、excel导入导出等功能。项目主要包括CRM、OA、项目管理、BI等模块。通过角色、部门、菜单实现按钮级功能权限控制和数据权限控制。通过将用户登录信息保存到redis,可以支持项目热重启和分布式部署。该项目还有以下特点:项目使用了jfinal强大的AOP,将权限判断从代码中提取出来,用户无需手动判断登录角色是否有权限。下面是在拦截器中通过权限注解判断用户是否有访问权限@Overridepublicvoidintercept(Invocationinvocation){//TODO权限函数后台拦截Permissionspermissions=invocation.getMethod().getAnnotation(Permissions.class);if(permissions!=null&&permissions.value().length>0){JSONObjectjsonObject=Aop.get(AdminRoleService.class).auth(BaseUtil.getUserId());//组装权限列表Listarr=queryAuth(jsonObject,"");布尔isRelease=false;for(Stringkey:permissions.value()){if(!isRelease){if(arr.contains(key)){isRelease=true;}}}if(!isRelease){invocation.getController().renderJson(R.error("无权限"));返回;}}invocation.invoke();}通过AOP和注释,检查数据的非空性。没有必要一一判断参数是否为空。Data对象,在controller方法中添加参数BasePageRequest,T是对象类型,然后是参数它将自动组装成页面参数和定义的对象类。下面是实现代码:}@OverrideprotectedBasePageRequestto(Strings){returnnull;}@Override@SuppressWarnings("unchecked")publicBasePageRequestget(Actionaction,Controllercontroller){Parameter[]parameters=action.getMethod().getParameters();类clazz=null;for(Parameterparameter:parameters){if(BasePageRequest.class.isAssignableFrom(parameter.getType())){类型parameterizedType=parameter.getParameterizedType();if(parameterizedTypeinstanceofParameterizedType){Type[]params=((ParameterizedType)parameterizedType).getActualTypeArguments();clazz=TypeUtils.getClass(参数[0]);}休息;}}布尔值isJson=controller.getHeader("Content-Type")!=null&&controller.getHeader("Content-Type").toLowerCase().contains("application/json");returnisJson?newBasePageRequest(controller.getRawData(),clazz):newBasePageRequest(controller.getKv(),clazz);}自定义json工厂,实现数据的个性化解析返回,比如实现规则转换返回数据时将数据打成驼峰,自定义某类对象的返回格式等。您可以自定义错误处理模板。在出现错误或其他异常时,可以给用户一个明确的提示,避免用户看到一些无用的错误信息。功能文件可以上传到项目目录外,避免重新打包项目文件丢失后@OverridepublicvoidconfigConstant(Constantsme){me.setDevMode(prop.getBoolean("jfinal.devMode",true));我.setInjectDependency(真);//设置上传文件到哪个目录me.setBaseUploadPath(BaseConstant.UPLOAD_PATH);me.setBaseDownloadPath(BaseConstant.UPLOAD_PATH);//自定义json工厂me.setJsonFactory(newErpJsonFactory());//限制上传到100Mme.setMaxPostSize(104857600);}采用项目分层设计,明确职责分工,降低代码耦合Hander->捕获指定规则的url还是放心Interceptor->wrap-aroundAOP拦截,检查accessrights,datarights,parameters等,可以全局配置,singleroute,singlecontroller,singlemethod等,可以自定义处理数据Router->分发不同规则的数据,不同urls进入不同路由和controllerController->组装参数,将数据传给service处理后渲染返回Service->处理业务代码,将数据传给Db处理或缓存Db->操作数据库Render->将服务返回的数据返回给控制器,出错后通过SQL模板函数,将sql写入xx.sql文件。如果sql文件发生变化,不需要重新编译打包。直接改sql文件中的sql即可。下面是自动扫描指定路径下sql文件的代码:privatevoidgetSqlTemplate(Stringpath,ActiveRecordPluginarp){File文件=新文件(路径);如果(file.exists()){文件[]文件=file.listFiles();if(files!=null&&files.length>0){for(FilechildFile:files){if(childFile.isDirectory()){getSqlTemplate(childFile.getAbsolutePath(),arp);}else{if(childFile.getName().toLowerCase().endsWith(".sql")){arp.addSqlTemplate(childFile.getAbsolutePath().replace(PathKit.getRootClassPath(),"").replace("\\","/"));}}}}}}以下为部分系统截图:以下为悟空CRM9.0JAVA版部分功能系统截图