# 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.应用场景
该平台适用于多种企业级应用场景。因其在设计上,是开放的,是支持企业数字生态的打造,给企业无限空间,去支撑企业业务目标的演进、企业战略的落地:
**价值对象:**

**生态关系:**

### 二、架构情况
##### 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%以上后台功能的方式做了个基础案例,在这个实现里面,已做了两个独立工程包:


**登录-加载后台-操作功能:**
.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开发

**创建一个Restful服务类:**
.png)
**通过Eclipse插件,生成Restful客户端类**
这是一个插件组,后续可以根据需要,追加新的功能,来最大的减少“样板代码”开发量。

##### 3、业务逻辑层:EJB


##### 4、持久层:JPA
创建JPA工程,实现持久化单元的独立性,为后续EJB自动分布式路由提供支持,只需简单四步(并且这个过程,基本都是IDE去完成,开发很少做什么):

**自动生成的持久化单元:**

**自动生成的实体类:**


##### 5、基础研发包:eecmp-framework
基础研发包,这里总计有7个,后续可根据设计,继续扩展,下面给出基本用途:


### 四、总体说明
