# 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 无界平台 # Wujies 无界平台 **多租户后台管理平台 · 可插拔应用架构** [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5-blue.svg)]() [![JDK](https://img.shields.io/badge/JDK-17%2B-green.svg)]() [![Vue](https://img.shields.io/badge/Vue-3-42b883.svg)]() [![Version](https://img.shields.io/badge/version-5.6.2-success.svg)]() 官网:[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 协议并保留原作者的版权声明。