# gress
**Repository Path**: XYJXUST/gress
## Basic Information
- **Project Name**: gress
- **Description**: Gress 是一个现代化的企业级插件系统平台:宿主应用(gress-web + gress-fronted)提供统一的插件运行时与扩展机制,业务以**插件包(JAR + 前端 UMD)**形式安装、启动与卸载,无需改动宿主核心代码。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-26
- **Last Updated**: 2026-06-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Gress - 企业级微内核插件系统平台

[](LICENSE)
[](https://openjdk.org/)
[](https://spring.io/projects/spring-boot)
[](https://vuejs.org/)
[](https://pf4j.org/)
**基于 PF4J 包加载 + Gress 扩展生命周期的企业级插件系统平台**
[English](README_EN.md) | 简体中文
[在线演示](#-在线演示) • [界面示例](#-界面示例) • [快速开始](#-快速开始) • [文档](#-文档) • [插件开发](#-插件开发) • [贡献](#-贡献)
---
## 🌐 在线演示
| 项目 | 说明 |
|------|----------------------------------------------------|
| **地址** | [http://gress.keqi.life/](http://gress.keqi.life/) |
| **默认账号** | `test` |
| **默认密码** | `36mpbEW18fX0` |
演示环境为已部署的宿主实例,可直接体验插件安装、应用切换与业务插件能力(具体已装插件以线上为准)。
---
## 📷 界面示例
以下截图来自线上演示环境 [http://gress.keqi.life/](http://gress.keqi.life/)(`test` / `36mpbEW18fX0`),展示宿主与典型插件的管理界面。
### 应用管理(宿主)
集中查看已安装插件包:版本、运行状态、配置/重启等运维操作。

### 插件面板注入(devpanel 示例)
除路由、菜单外,插件可在前端 `PluginManifest.extensions.panels` 中声明**可停靠面板**,由宿主 `PanelManager` 统一挂载到布局的 **底部**、**右侧**、**左侧** 或 **模态** 区域;用户通过边缘触发条打开/切换,不占用主内容路由区域。
| 挂载位置 | `position` | 典型用途 |
|----------|------------|----------|
| 底部 | `bottom` | 日志流、终端、调试输出(如「服务日志」) |
| 右侧 | `right` | 辅助工具、测试面板、上下文信息(可注册多个面板,右侧图标切换) |
| 左侧 | `left` | 导航辅助、筛选器等 |
| 模态 | `modal` | 临时弹层类面板 |
参考实现见 [`gress-plugin-devpanel`](../gress-plugin-devpanel) 前端工厂中的 `extensions.panels`(`ServerLogPanel` → `bottom`,`RightTestPanel` → `right`)。
**底部面板**:在应用管理页底部展开「服务日志」,实时查看宿主/插件输出(SSE)。

**右侧面板**:右侧边缘显示面板入口图标,点击后滑出插件注入的测试面板(多面板时可在右侧切换)。

插件侧声明示例:
```typescript
extensions: {
panels: [
{
id: 'server-log',
title: '服务日志',
component: ServerLogPanel,
position: 'bottom', // bottom | right | left | modal
icon: 'Terminal',
defaultOpen: false,
order: 10
},
{
id: 'right-test',
title: '右侧测试',
component: RightTestPanel,
position: 'right',
icon: 'FlaskOutline',
order: 20
}
]
}
```
安装 devpanel 等声明了 `plugin.ui.hasPanel: true` 的插件后,在宿主布局中即可使用上述面板能力。详见 [`gress-fronted/src/services/PanelManager.ts`](gress-fronted/src/services/PanelManager.ts)。
### 应用配置(宿主)
单插件运维配置:路由、会话(并发登录、存储、超时、同端策略等)、安全(超级管理员)等,保存后由宿主与插件协同生效。

### 应用详情 · 操作日志(宿主)
查看插件安装/升级/重启等运维记录:操作人、耗时、结果与说明,便于审计与排障。

### 宿主 · 界面配置
全局外观与侧栏:浅色/深色主题、经典侧栏 / OA 顶栏布局、侧栏快捷应用数量等。

### IAM · 认证配置(iam 插件)
注册/登录策略:按渠道(互联网注册、邀请、管理员创建等)配置自助注册与多种登录方式。

### IAM · MFA 策略
全局 MFA:强制模式、已绑定用户登录是否需 MFA、Step-up 有效期等。

### IAM · 权限管理
按角色为应用分配权限树,支持保存变更与权限反查。

### 配置中心 · 维护公告(config-center 插件)
维护模式开关、公告文案、时间窗、访问白名单及登录/匿名访问限制等。

---
## 📖 简介
Gress 是一个现代化的**企业级插件系统平台**:宿主应用(`gress-web` + `gress-fronted`)提供统一的插件运行时与扩展机制,业务以**插件包(JAR + 前端 UMD)**形式安装、启动与卸载,无需改动宿主核心代码。
典型场景包括:IAM、应用商店等**应用插件**,可插拔的**中间件**,以及可选的**触发器/任务节点**(用于工作流编排类扩展,而非平台本体定位)。
### ✨ 核心特性
#### 🔌 插件包与扩展体系
- **四类插件类型**:`APPLICATION`(应用)、`TRIGGER`(触发器)、`TASK`(任务节点)、`MIDDLEWARE`(中间件)
- **PF4J 负责 JAR 加载**:`DefaultPluginManager` + `Pf4jPackageAdapter` 管理类加载与启停
- **Gress 负责编排**:`PluginPackageLifecycleManager` + `PluginExtensionManager` 驱动安装/启动/停止/卸载及扩展链
- **包级清单 `plugin.yml`**:定义插件 id、入口类、依赖、UI、配置、治理信息;构建期生成 `plugin.properties`
- **扩展点 `@PluginSpec`**:标注 PF4J 扩展类(工作流节点、前端 `jsPath` 等),由 `PluginSpecScannerExtension` 扫描入 `PluginRepository`
#### 🧩 插件内 DI(非嵌套 Spring Boot)
- 每个插件包拥有独立 **`PluginContainer`**(`gress-core` 自定义 DI)
- 支持 `@Service`、`@Inject`、`@ConfigurationProperties`、`@Value` 等(语义类似 Spring,运行在插件 ClassLoader 内)
- 配置来自 **`PluginEnvironment`**:`plugin.yml` 的 `config` 段 + 数据库覆盖(`PluginConfigLoader` / `PluginConfigLoaderExtension`)
#### 🎨 前端插件运行时
- **生产环境**:加载插件构建产物 **IIFE/UMD**(`window.__GRESS_PLUGIN__`),工厂函数 `createPlugin(bridge, properties) → PluginManifest`
- **开发环境**:Vite 动态 `import()` + `plugin-dev-server` 热更新
- **`GressBridge`**:HTTP、路由、Pinia、权限、UI 插槽等宿主能力(`@keqi.gress/plugin-bridge`)
- **`extensions.panels`**:插件可向宿主布局注入底部/右侧等可停靠面板(`PanelManager`),见 [界面示例 · 插件面板注入](#插件面板注入devpanel-示例)
- 生命周期词汇为 **`activate` / `deactivate` / `uninstall`**(仅前端 manifest,与后端 PF4J 阶段不同)
#### 🚀 可选能力:工作流编排扩展
- 平台核心是**插件加载、生命周期、配置与 UI 扩展**;工作流是宿主上的一类可选场景
- `TRIGGER` / `TASK` 插件类型、Vue Flow 设计器、`TriggerLifecycleManager`、`WorkflowExecutor` 等
- 使用工作流能力时,SSE 可推送执行状态与日志
#### 🏢 企业级能力
- 多租户、RBAC、应用商店(独立插件仓库 `gress-plugin-appstore` 等)
- 插件 Flyway 迁移(`DatabaseMigrationExtension`)
- 可选 Redis 分布式锁、RocketMQ、文件存储(x-file-storage)
---
## 🏗️ 架构设计
### 模块与仓库布局
```
Maven 反应堆(根 pom.xml)
├── gress-common # 公共类型、@PluginSpec、PluginType、触发器/任务接口
├── gress-core # 插件生命周期、PF4J 适配、PluginContainer、工作流、启动编排
├── gress-plugin-api # PluginLifecycleHook、管理 API 等插件侧契约
├── gress-bootstrap # 首次安装向导(中间件配置、overlay 配置)
├── gress-plugin-build # 插件工程构建工具
├── gress-plugin-parent # 外部插件 Maven 父 POM
└── gress-web # Spring Boot 宿主(API、SSE、安全、静态资源)
仓库内非 Maven 模块
├── gress-fronted/ # Vue 3 宿主前端(构建后由 gress-web 打入静态资源)
└── gress-plugin-packages/# 共享 npm 包:plugin-bridge、plugin-ui、shared-utils、plugin-dev-server
业务插件(通常独立 Git 仓库,安装为 JAR)
├── gress-plugin-iam/ # 权限 / 登录等
├── gress-plugin-appstore/
└── …
```
### 后端分层
```
┌─────────────────────────────────────────────────────────────┐
│ gress-web(Spring Boot 宿主,单进程) │
│ REST / SSE / 安全 / 多租户 / 插件管理 API │
│ context-path 默认 /gress,端口默认 8082 │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────┐
│ gress-core │
│ PluginPackageLifecycleManager install / start / stop / … │
│ PluginExtensionManager BEFORE/AFTER 扩展链 │
│ PluginPackageStartupService 按 plugin.startup.package-ids 启动 │
│ Pf4jPackageAdapterImpl PF4J 加载 JAR │
│ PluginContainer + DI 注解 插件内 Bean │
│ PluginConfigLoader plugin.yml + DB 配置合并 │
│ 可选工作流:TriggerLifecycleManager、WorkflowExecutor 等 │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────┐
│ 已安装插件 JAR(PF4J pluginsDir,默认 plugins/) │
│ 每包:plugin.yml、扩展类、Flyway、Controller(经宿主路由暴露) │
└─────────────────────────────────────────────────────────────┘
```
### 插件包生命周期(后端)
与前端 manifest 的 `activate` **不是同一套概念**。后端主路径:
| 阶段 | 说明 | 关键类 |
|------|------|--------|
| **INSTALL** | 加载 JAR、PF4J start、扩展链 AFTER:扫描 `@PluginSpec`、合并配置、启动 `PluginContainer`、Flyway | `PluginPackageLifecycleManager` |
| **START** | 重启/加载后再次启动容器与服务 | 同上 + `PluginConfigLoaderExtension` |
| **STOP** | 停止容器、反注册服务 | `DIContainerScannerExtension` 等 |
| **UNINSTALL** | PF4J stop/unload、清理仓库与资源 | `PluginPackageLifecycleManager` |
| **UPGRADE / RELOAD** | 升级与热重载场景 | `LifecycleContext` / `UpgradeContext` |
每个阶段还有 **BEFORE / AFTER**,由 `PluginLifecycleEventType` + `LifecyclePhase` 分发给各 `PluginExtension`。
插件入口类可实现 **`PluginLifecycleHook`**(`BEFORE_INSTALL`、`AFTER_START` 等),由 `PluginLifecycleHookDispatcher` 调用。
### 前端加载流程(概要)
```
initializePluginFramework()
→ createPluginBridge() // window.GressBridge
→ createPluginRuntime() // window.__GRESS_PLUGIN_RUNTIME__
生产:plugin-loader 插入