# eecmp **Repository Path**: cmnong/eecmp ## Basic Information - **Project Name**: eecmp - **Description**: 一个基于Jakarta EE规范,建立在MicroProfile 6.0基础上的,基于JSF、Servlet、CDI、Restful、EJB、JPA、JSON基础规范基础上,在平台综合研发基础上,支持租户在本框架基础上的进行二开的高效,兼容的Web开发平台。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2024-04-25 - **Last Updated**: 2025-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 一、基本介绍(基于某些方面考虑,未上传代码,有兴趣可以交流) ##### 1.平台概述 :bowtie: 该平台是一个专为企业级应用设计的高性能、可扩展的开发框架。 :smile: 他充分利用了Java语言的强大功能和Jakarta EE规范的标准性,同时集成了Microprofile以支持轻量级、可移植和可扩展的微服务架构。该平台通过充分的封装,最大限度的脱离组件依赖,为大家提供了一套丰富的开发工具和组件,旨在加速应用开发、降低维护成本并提高应用质量。 :joy: 可让企业研发的业务资产具有继承性、集成性和持续根据资源消耗动态的扩容性,既可以小而美,又可以大而全。为公司提供一个开发迅速、代码量少、学习简单、功能强大、易扩展、多租户,推进自我演进和10年以上的技术迭代环境。 ##### 2.技术栈亮点 - **Jakarta EE规范** :平台基于Jakarta EE(前身为Java EE),这是一个广泛采用的、用于构建企业级应用的Java平台规范。它提供了一系列用于开发分布式、多层架构应用的API和服务,包括Web服务、事务管理、安全性等。 - **MicroProfile** :作为Jakarta EE的一个子集,MicroProfile专注于为微服务架构提供轻量级、可移植和可扩展的开发框架。平台集成了MicroProfile,使得开发人员能够更容易地构建和部署可伸缩的微服务应用程序,同时保持应用的高可用性和可维护性。 - **自有封装** :平台通过自有封装,提供了一套定制化的开发工具和组件,这些工具和组件基于Jakarta EE和MicroProfile规范进行扩展和优化,以满足特定业务场景的需求。封装内容包括但不限于ORM框架、安全框架、消息队列集成、分布式缓存解决方案等。 ##### 3.平台特性 - **简化开发** :平台提供了一套简化的API和规范,使得开发人员能够更快速地构建和部署应用。通过减少样板代码和配置工作,开发人员可以将更多精力集中在业务逻辑的实现上。 - **可移植性** :由于平台基于Jakarta EE和MicroProfile标准规范,因此开发的应用可以在不同的Java运行时环境中运行,提供了更高的可移植性。这有助于降低技术锁定风险,并促进应用在不同环境之间的迁移和部署。 - **可扩展性** :平台支持可扩展的微服务架构,允许开发人员根据业务需求动态地添加或删除微服务组件。这种灵活性有助于构建适应性强、易于维护的应用系统。 - **集成开发环境(IDE)支持** :平台提供了对主流IDE(如Eclipse、IntelliJ IDEA等)的良好支持,开发人员可以在这些IDE中方便地进行代码编写、调试和部署工作(本处推荐使用Eclipse,因为自研了一个Eclipse插件,来帮助生成Restful客户端类,以供客户端来标准化调用Restful服务)。 - **社区和生态系统** :平台积极融入Jakarta EE和MicroProfile社区,利用社区提供的丰富资源和最佳实践来推动平台的发展和完善。同时,平台也致力于构建一个活跃的生态系统,吸引更多的开发者、合作伙伴和用户加入其中。 ##### 4.应用场景 该平台适用于多种企业级应用场景。因其在设计上,是开放的,是支持企业数字生态的打造,给企业无限空间,去支撑企业业务目标的演进、企业战略的落地: **价值对象:** ![输入图片说明](resources/1.png) **生态关系:** ![输入图片说明](resources/output.png) ### 二、架构情况 ##### 1. 引言 本内容旨在详细描述eecmp的软件架构,包括其视图层、Web控制层、业务逻辑层、数据持久层以及架构模式等方面的设计。通过本文,帮助大家能够全面了解eecmp的技术栈和架构特点。 ##### 2、前端技术 - **技术选型** :默认采用JSF作为前端开发框架,应用Primefaces作为UI组件库(移动端可以根据需要帮扶进行设计封装)。 - **优势** :JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架,其在Jakarta EE规范内。它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器端应用程序的开发,加速开发过程(后续业务开发模式上,会给大家一个详细阐述)。 - **设计特点** : - ①解耦的业务研发和基础研发; - ②实现功能视图和逻辑分析,可进行单体、Restful、EJB分布式混合开发模式,可根据系统资源消耗情况,进行动态扩展; - ③在充分利用Primefaces 13对应UI基础上,更是根据业务研发特点,进行二次封装,进一步降低视图交互的开发成本; - ④研发租户使用基础研发包,开发功能,自然兼容,支持单独研发的发布及赋权功能的二开替代。 ##### 3、后端技术 后端技术,在设计上,也进行了四层解耦设计,视图层采用可独立部署JSF技术,Web控制层使用Restful、业务逻辑层使用EJB、持久层使用JPA。 - **基础框架** :采用Java技术栈,采用Jakarta EE 9以上标准,使用MicroProfile 6.1云原生规范,形成独立产权的,支持动态演进的混合框架。 - **ORM框架** :使用JPA规范作为基础,使用Hibernate作为ORM框架,并在EJB基础上,实现数据库操作和业务逻辑的分析。特别是实体对象的内存管理,有效提升数据处理效率。 - **API、网关及服务治理管理** :支持OpenAPI规范,网关采用Spring Cloud Gateway3.0,可综合利用K8S、对应的云原生治理体系,其简单,集成能力强特点进行路由,服务等方面的管理。 - **优点** (后续业务开发模式上,会给大家一个详细阐述) : - ①核心实现都采用Jakarta EE规范,脱离对供应商的依赖,有效保证企业的技术演进; - ②采用MicroProfile作为云原生规范基础,充分利用社区开放性,规范先行; - ③实现了Web、EJB基础研发的封装,让功能开发人员只用专注业务本身; - ④充分利用Restful和EJB的JNDI特点,让系统可根据业务进行南北、东西向的集成和扩展。 ##### 4、数据库与存储技术 - **主数据库** :采用MySQL作为主数据库,存储结构化数据。并实现系统与业务数据的分析,支持根据业务特征的分库分表设计,根据JPA特点,可以对所有数据库具有集成性。 - **文件存储** :基于minio,进行二开,支持文件管理 - **全文检索** :后续支持 ##### 5、架构模式与特点 - **混合架构** :eecmp采用混合架构模式,支持微服务、EJB的分布式、单体模式的开发,根据业务特点,拆分模块或服务,提高系统的可用性和可扩展性( :mahjong: **如果有团队支持,可以做到单体开发,部署应用的时候,可以实现分布式,微服务式部署** :mahjong: )。 - **分布式存储** :通过minio结合Restful特点,可根据文件划分,进行分布式存储,保证数据的可靠性和可扩展性。 - **多层安全机制** :包括IP配置、防火墙、SSL传输、JWT授权、功能赋权、验证码、RBAC、ABAC、自研权限验证中间件及MD5防撞实现、自动分库路由等多种安全手段,保证用户数据的安全性。 ##### 6、接口与应用 - **接口** :提供Restful API,提升与异构系统的兼容,并提供JWT认证,实现鉴权共享。 - **应用** :分离核心逻辑,实现web控制和业务逻辑分析,实现存储于接口的交互。 ### 三、开发示例 **针对开发平台的讲解,后续会补充上视频** ##### 1、视图层:JSF+PrimeFaces开发 这一层的开发,我用的Netbeans,引起对JSF开发友好度,比Eclipse更舒服,如果个人爱好用其他IDE也可以。因前端界面的多样性,我这里选用了使用70%以上后台功能的方式做了个基础案例,在这个实现里面,已做了两个独立工程包: ![输入图片说明](resources/jsf_primefaces.png) ![输入图片说明](resources/tebieshuoming1.png) **登录-加载后台-操作功能:** ![输入图片说明](resources/output%20(1).png) **创建托管Bean:** ``` @Named(value = "enterpriseInfoMB") @ViewScoped public class EnterpriseInfoMB implements Serializable { private EnterpriseModel addEM; private EnterpriseModel updateEM; private List selectEMList; private EnterpriseQueryModel eqm; private List createDate; private String createDateOne; @Inject private EECMPLazyDataModel emListLazy; /** * Creates a new instance of EnterpriseInfoMB */ public EnterpriseInfoMB() { } @PostConstruct public void init() { this.emListLazy.setKeyFieldName("enterpriseID"); this.emListLazy.setTypeRef(EnterpriseModel.class); } //新增企业 public void addEnterprise() { } //修改企业 public void updateEnterpriseInfo() { } //删除企业 public void deleteEnterprise() { } //查询企业forTable public void queryEnterpriseLazy() { resetQueryCodi(); if (createDate != null && createDate.size() == 2) { eqm.setStartDate(createDate.get(0)); eqm.setEndDate(createDate.get(1)); } else if (!StringUtils.isBlank(createDateOne)) { try { eqm.setStartDate(DataUtils.parseDate(createDateOne, "yyyy/MM/dd")); eqm.setEndDate(DataUtils.parseDate(createDateOne, "yyyy/MM/dd")); } catch (ParseException e) { e.printStackTrace(); } } GlobalDto globalDto = new GlobalDto.Builder() .withBody(eqm) .build(); emListLazy.setFullUrl(EnterpriseControllerClient.getEnterpriseInfoStr1); emListLazy.setGlobalDto(globalDto); } //查询重置 public void resetQueryCodi() { this.setSelectEMList(null); this.setAddEM(null); this.setUpdateEM(null); this.getEqm(); this.setCreateDate(null); this.setCreateDateOne(null); } //启用或停用企业 public void updateEnterpriseIsEnabled() { } //更新企业坐标 public void updateEnterpriseCoordinate() { } //更新企业logo public void updateEnterpriseLogo() { } //变更企业类型 public void updateEnterpriseType() { } public EnterpriseModel getAddEM() { return addEM; } public void setAddEM(EnterpriseModel addEM) { this.addEM = addEM; } public EnterpriseModel getUpdateEM() { return updateEM; } public void setUpdateEM(EnterpriseModel updateEM) { this.updateEM = updateEM; } public List getSelectEMList() { return selectEMList; } public void setSelectEMList(List selectEMList) { this.selectEMList = selectEMList; } public EnterpriseQueryModel getEqm() { eqm = new EnterpriseQueryModel(); return eqm; } public EECMPLazyDataModel getEmListLazy() { return emListLazy; } public List getCreateDate() { return createDate; } public void setCreateDate(List createDate) { this.createDate = createDate; } public String getCreateDateOne() { return createDateOne; } public void setCreateDateOne(String createDateOne) { this.createDateOne = createDateOne; } } ``` **选用对应模版,开发视图界面:** ``` ``` ##### 2、Web控制层:Restful开发 ![输入图片说明](resources/restful1.png) **创建一个Restful服务类:** ![输入图片说明](resources/output%20(2).png) **通过Eclipse插件,生成Restful客户端类** 这是一个插件组,后续可以根据需要,追加新的功能,来最大的减少“样板代码”开发量。 ![输入图片说明](resources/eclipseplus.png) ##### 3、业务逻辑层:EJB ![输入图片说明](resources/ejb11.png) ![输入图片说明](resources/ejb1121.png) ##### 4、持久层:JPA 创建JPA工程,实现持久化单元的独立性,为后续EJB自动分布式路由提供支持,只需简单四步(并且这个过程,基本都是IDE去完成,开发很少做什么): ![输入图片说明](resources/jpa11.png) **自动生成的持久化单元:** ![输入图片说明](resources/jpa_entitys1.png) **自动生成的实体类:** ![输入图片说明](resources/jpa121.png) ![输入图片说明](resources/image212.png) ##### 5、基础研发包:eecmp-framework 基础研发包,这里总计有7个,后续可根据设计,继续扩展,下面给出基本用途: ![输入图片说明](resources/image21313.png) ![输入图片说明](resources/image21321.png) ### 四、总体说明 ![输入图片说明](resources/imageqwqe.png)