# wujies-platform
**Repository Path**: wujies/wujies-platform
## Basic Information
- **Project Name**: wujies-platform
- **Description**: 无界平台JAVA端,面向B端用户
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: feature/app-market
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-30
- **Last Updated**: 2026-10-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# Wujies 无界平台
**多租户后台管理平台 · 可插拔应用架构**
[](LICENSE)
[]()
[]()
[]()
[]()
官网:[wujies.cn](https://wujies.cn)
---
## 平台简介
**Wujies 无界平台**是一套 Spring Boot 3 + Vue 3 的多租户后台管理平台。
它和常见的后台框架最大的不同是:**业务能力不以「模块」形式编进主程序,而是以「应用」为单位安装、升级、卸载** —— 新增一个业务模块(商城、考试、图床、IM…)不需要重新构建宿主、不需要重启服务。
平台自己只提供基础设施:多租户、用户/部门/角色/菜单、字典、对象存储、消息、工作流,以及一整套**应用市场**(应用的打包、签名、分发、安装、生命周期管理)。
### 核心特性
| 特性 | 说明 |
|---|---|
| **可插拔应用** | 应用在运行期安装 / 升级 / 停用 / 卸载,**都不需要重启** |
| **应用市场** | 应用的目录、上架、分发与安装一体化;目录就在本部署自己的库里 |
| **包签名校验** | 应用包(后端 jar + 前端 ESM)分离式签名,防篡改;产物白名单挡结构性风险 |
| **版本化迁移** | 表结构 / 种子数据随应用包走,安装与升级自动执行、幂等可重试 |
| **菜单归属保护** | 应用装的菜单在后台不可被误改误删,重装可恢复 |
| **前端远程加载** | 应用前端产物在运行期按清单加载,与宿主共用同一份 Vue/依赖实例 |
| **多租户** | 完整的多租户数据隔离,租户套餐与菜单权限绑定 |
| **契约化解耦** | 插件通过 **插件 SDK** 取用宿主能力,不依赖宿主业务模块(详见下方) |
### 技术栈
- **后端**:Spring Boot 3.5 · Sa-Token · MyBatis-Plus · Redisson · SnailJob · Warm-Flow · MySQL 8
- **前端**:Vue 3 · TypeScript · Element Plus · Vite · Pinia · UnoCSS
- **移动端**:uni-app(App / 小程序 / H5)
---
## 仓库一览
平台由**多个独立仓库**组成,各自分支、各自发布:
| 仓库 | 内容 | 技术栈 |
|---|---|---|
| **wujies-platform** | 后端 + 应用市场 + 各应用的**契约模块** | Java / Spring Boot |
| **wujies-plugins** | 全部业务应用(插件)本体 + 本地开发沙箱 | Java / Vite |
| **wujies-ui** | 管理端前端 + 远程应用前端工程 | Vue 3 / Vite |
| **wujies-c** | C 端(用户端)Web 前端 | Vue 3 / Vite |
| **wujies-uniapp** | 移动端 | uni-app |
> 其中 **wujies-plugins** 的插件通过 `wujies-common-plugin-sdk` 的契约取用宿主能力,
> 对宿主业务模块的依赖为 **0** —— 也就是说,插件可以脱离平台单独构建与调试。
---
## 软件架构
```
┌──────────────────────────── 前端(运行期远程加载) ────────────────────────────┐
│ wujies-ui / wujies-c / wujies-uniapp │
│ └── /remote-apps//index.js ← 由后端清单驱动,按需加载 │
└───────────────────────────────────┬─────────────────────────────────────────┘
│ HTTP
┌───────────────────────────────────▼─────────────────────────────────────────┐
│ wujies-platform(宿主) │
│ │
│ wujies-admin 启动模块(Spring 之前先挂载插件 classpath) │
│ │
│ wujies-common 基础设施 │
│ ├── common-core 通用工具 / SPI 契约 │
│ ├── common-web 统一异常出口 / 请求链路 │
│ ├── common-mybatis 数据访问 / 多租户 / 数据权限 │
│ ├── common-oss 对象存储 │
│ ├── common-satoken 认证鉴权 │
│ └── common-plugin-sdk ★ 插件 SDK:宿主向插件暴露的稳定能力契约 │
│ │
│ wujies-modules 平台模块 + 各应用契约 │
│ ├── wujies-system 系统管理(用户/部门/角色/菜单/字典/OSS/消息) │
│ ├── wujies-workflow 工作流 │
│ │ │
│ │ ⚠️ 定时任务(13 个 @JobExecutor)已随各应用搬进插件,不再有 wujies-job; │
│ │ 代码生成与示例模块已移除。 │
│ ├── wujies-app-market ★ 应用市场:目录 + 安装 + 插件运行时 │
│ │ ├── catalog/ IAppCatalogService(安装侧读目录的唯一入口) │
│ │ ├── plugin/ 类加载器 / 动态路由 / 每插件独立子上下文 │
│ │ ├── security/ 包签名与产物白名单 │
│ │ └── spi/ 安装器 SPI │
│ └── wujies--api 各应用的**契约**(实体 / Mapper 接口 / Service 接口) │
│ │
│ wujies-extend 监控中心 / 调度中心 │
└──────────────────────────────────────────────────────────────────────────────┘
▲
│ 安装 / 升级(运行期,无需重启)
┌───────────────────────────────────┴─────────────────────────────────────────┐
│ wujies-plugins(独立仓库 · 全部业务应用) │
│ │
│ wujies-gallery 图床 wujies-mall 商城 wujies-member 会员 │
│ wujies-exam 考试 wujies-im IM wujies-pay 支付 │
│ wujies-quote 报价 wujies-social 社交 wujies-enterprise 企业 │
│ wujies-finance 财务(纯前端) wujies-hello Hello 示例(新插件模板) │
│ │
│ sandbox/ 本地开发沙箱(H2 内存库,不连中间件即可单插件调试) │
└──────────────────────────────────────────────────────────────────────────────┘
```
---
## 应用(插件)是怎么工作的
一个「应用」是一个**完整可插拔单元**,包含四样东西:
| 组成 | 作用 | 放在哪 |
|---|---|---|
| **后端 jar** | 应用实现(controller / service / listener) | 插件仓库 |
| **前端 ESM** | 远程视图,跑在宿主同源上下文 | 前端仓库 / 插件包内 |
| **清单 `app.json`** | 编码、版本、菜单树、产物路径 | 插件仓库 |
| **迁移脚本 `migrations/`** | 建表 / 种子数据 / 字典 / 站点配置 | 插件仓库 |
生命周期(**全部不需要重启**):
| 动作 | 后端行为 |
|---|---|
| **部署** | 落位 + 热加载(卸载旧插件 → 建新子上下文 → 注册路由) |
| **安装** | 本机缺产物 → 从市场按地址拉包 → 校验签名 → 落位 → 执行迁移 → 加载 |
| **升级** | 同上 + 菜单幂等同步 |
| **停用 / 启用** | unload / 重新 load |
| **卸载** | 保留数据(默认)或彻底删除(连菜单、数据表、迁移记录、产物一起回收) |
### 插件与宿主怎么解耦
插件运行在宿主 JVM 里,天生能注入宿主的 bean —— 但**"能注入"不等于"应该直接注入宿主业务模块"**。
如果插件直接依赖 `wujies-system`,它就再也无法脱离平台单独构建与调试。
所以平台提供 **`wujies-common-plugin-sdk`**:宿主向插件暴露一组**稳定能力契约**。
| 契约 | 能做什么 |
|---|---|
| `PlatformUserApi` | 查用户(昵称/头像/状态)、按部门取人、批量改状态 |
| `PlatformDeptApi` | 部门及其子部门展开 |
| `PlatformOssApi` | 取对象存储元信息、上传、删除 |
| `PlatformMessageApi` | 发站内消息、查公开公告 |
| `FollowRelationApi` | 关注关系查询 |
插件侧用 `ObjectProvider` 取用:**宿主没提供该能力时插件照常启动,只是对应功能降级** ——
而不是因为缺一个可选能力就整个应用起不来。
> 目前**全部 10 个应用对宿主业务模块的依赖为 0**。迁移过程与设计取舍见
> `wujies-plugins/docs/解耦路线图.md`。
---
## 快速开始
### 环境要求
JDK 17+(实测 JDK 23 构建 `release 17`)、Maven 3.9+、MySQL 8、Redis、RabbitMQ。
### 1. 初始化数据库
```bash
mysql -u root -p <库名> < script/sql/platform_init.sql
```
> ⚠️ **不要用上游的 `ry_vue_5.X.sql`**(该文件**已从仓库删除**)。
> 它是上游产品的种子数据,不是本仓库的库结构:缺 82 行参数、31 个字典类型、
> 几百行菜单与整份地区数据,列结构也是上游版本。拿它初始化,起服务就会撞
> 「缺列 / 缺表 / 排序规则不一致」那一串问题。
> 需要交付库时请用 `script/sql/platform_init.sql` —— 25 张平台表 + 平台数据,
> 由 `deploy/tools/gen-platform-init.mjs` 从真实库生成,也是安装包实际导入的那一份。
### 2. 构建
```bash
mvn -B install -DskipTests
```
> ⚠️ 这一步同时是**插件开发的前置**:插件编译期需要 `cn.wujies:*` 构件(全部 `provided`),
> 所以改完平台**必须**重新 `install`,插件侧才看得到新接口。
### 3. 启动宿主
```bash
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/start-host.ps1
```
### 4. 前端
管理端在 **wujies-ui** 仓库,启动方式见该仓库 README。
### 5. 开发一个应用
```bash
cd /wujies-plugins
# 构建全部应用
mvn -B package -DskipTests
# 用沙箱把单个应用跑起来(H2 内存库,不连 MySQL/Redis/RabbitMQ)
powershell -NoProfile -ExecutionPolicy Bypass -File sandbox/run.ps1 -Plugin wujies-hello
# 打成可上架的应用包(含签名)
powershell -NoProfile -ExecutionPolicy Bypass -File package.ps1 \
-Plugin wujies-hello -SigningKey /plugins/keys/private.pem
```
新应用从 **`wujies-hello`** 开始(一张表、两个接口、零宿主业务依赖的最小可运行形态)。
完整流程见 `wujies-plugins/docs/插件开发指南.md`。
---
## 功能清单
**平台基础设施**:多租户 · 用户/部门/角色/菜单/岗位 · 数据字典 · 参数配置 · 操作日志 · 登录日志 · 在线用户 · 定时任务(随应用安装) · 工作流 · 对象存储 · 邮件 · 短信 · 站内消息 · 文件上传 · 接口文档
**应用市场**:应用目录 · 分类 · 版本管理 · 应用上架 · 安装包上传 · 签名校验 · 安装/升级/卸载 · 任务中心 · 菜单归属保护 · 目录中心化(本地/远程)
**可插拔应用**:图床 · 在线考试 · 即时通讯 · 商城 · 会员 · 支付 · 报价管理 · 社交互动 · 企业库 · 财务管理
---
## 与上游的关系
本项目的基线是开源项目 **RuoYi-Vue-Plus `5.X`**,已整体改名并**独立演进**。
上游已于 **2026-07-30 发布 `v6.0.0`**(整体升级 Spring Boot 4.X、移除多租户,与 5.X 不兼容),
`5.X` 分支事实上停更(最后一次提交 2026-09-07,月度提交已降到个位数)。
因此本项目**不再跟随上游**,转而按自身节奏演进。这也意味着**无法再合并上游提交** ——
这是刻意的取舍,换来的是一个可以自己掌控、不会因上游大版本跳跃而被迫重写的基线。
| 维度 | 上游 5.X | 本项目 |
|---|---|---|
| Java 包 | `org.dromara.**` | `cn.wujies.**` |
| Maven 坐标 | `org.dromara:ruoyi-*` | `cn.wujies:wujies-*` |
| 开放 / 门户模块 | `ruoyi-openapi` + `ruoyi-portal` | 已移除 |
| 插件 | 在宿主仓库内 | **独立仓库 `wujies-plugins`** |
| 插件与宿主耦合 | 直接依赖宿主业务模块 | **契约化解耦(依赖为 0)** |
| 插件本地调试 | 需要完整平台环境 | **沙箱(H2,不连中间件)** |
感谢 RuoYi-Vue-Plus 原作者与社区。
---
## 文档
| 文档 | 位置 | 说明 |
|---|---|---|
| 开发须知(约束与坑) | `AGENTS.md` | **改代码前扫一遍**,每条都是踩过坑换来的 |
| 插件开发指南 | `wujies-plugins/docs/` | 建插件 → 本地调试 → 打包上架全流程 |
| 解耦路线图 | `wujies-plugins/docs/` | 插件与宿主的能力边界与设计取舍 |
| 沙箱说明 | `wujies-plugins/sandbox/` | 不连中间件跑单个应用的用法与限制 |
---
## 如何参与贡献
1. Fork 对应仓库并新建分支;
2. 提交前请确保 `mvn -B install -DskipTests`(后端)/ `mvn -B package -DskipTests`(插件)通过;
3. 提交 Pull Request,说明改了什么、为什么。
---
## 开源协议
[MIT](LICENSE)。
本项目基于 RuoYi-Vue-Plus 5.X 二次开发,遵循 MIT 协议并保留原作者的版权声明。