Wujies 无界平台
框架设计

仓库目录

本文是 1.x 的归档文档(冻结于 1.x)。该分支只接收勘误修正, 内容基本不再变动;文中的源码路径、配置项与版本号均以 1.x 为准,不建议用于新项目。

新项目请查看 5.x 最新文档。已在 1.x 上运行的项目,本文仍是可靠依据。

这一页回答"哪个文件该放哪"。三块代码分属三个 git 仓库(没有共同根,各自提交), 所以目录结构本身就是一条约定:先看它属于哪个仓库,再决定改哪里。

本章节其它页面讲"为什么这么设计";这一页只讲"东西在哪"。 目录是照着实际文件系统读出来的(2026-10 工作区),不是凭记忆写的 —— 结构变了请重读一遍再改这一页。

三个仓库

仓库内容默认分支
wujies-platform后端(Java / Spring Boot)+ 平台 SQL 脚本feature/app-market
wujies/wujies-plugins插件本体 + 插件前端工程(pnpm workspace)+ 打包器 + 文档master
plus-ui宿主前端(Vue 3 / Vite)feature/app-market

三者没有共同 git 根:改一个功能经常要跨仓库提交两到三次。


一、wujies-platform/ —— 后端

反应堆根 pom.xml 的 <modules> 只有 4 个聚合模块: wujies-admin、wujies-common、wujies-extend、wujies-modules。

wujies-platform/
├── pom.xml                       反应堆根:<modules> 只列上面 4 个聚合模块
├── AGENTS.md                     ★ 改代码前扫一遍的"不变量与已知坑"清单(权威,优先级最高)
├── wujies-admin/                 后端启动模块(Java)。产物 wujies-admin.jar
│   ├── Dockerfile
│   └── src/                      PluginClassPathLoader 在这里(Spring 之前执行)
├── wujies-common/                基础设施,27 个子模块(见下)
├── wujies-extend/                旁挂服务,独立进程
│   ├── wujies-monitor-admin/     监控端
│   └── wujies-snailjob-server/   定时任务调度服务端
├── wujies-modules/               业务模块,只剩 4 个
│   ├── wujies-app-market/        ★ 应用市场:目录 + 安装编排 + 插件运行时 + 包安全
│   ├── wujies-system/            系统管理(用户 / 部门 / 角色 / 菜单 / 字典 / OSS / 消息)
│   ├── wujies-workflow/          工作流
│   └── wujies-plugin-probe/      插件运行时探针
├── script/                       运维与数据脚本
│   ├── sql/                      平台建表脚本 + 增量脚本
│   ├── prune/                    启动前清理插件 jar(prune-plugins.ps1 / start-host.ps1)
│   ├── docker/ · bin/ · leave/
├── deploy/                       部署物料与工具
│   ├── 1panel/                   1Panel 应用包定义
│   ├── docker/ · dist/
│   └── tools/                    种子 SQL / 迁移拆分等生成器(Node 脚本)
├── plugins-dist/                 ★ 插件 jar 的落位目录(loader.path 指向它,只读根下、不递归)
│   ├── active-plugins.txt        本机启用清单:不在清单里的 jar 不挂载
│   ├── wujies-<app>-plugin-<版本>.jar
│   └── migrations/<appCode>/     随包迁移脚本(子目录,刻意不会被当插件加载)
├── dist-packages/                ⚠️ **历史**产物目录(打包器早已不再往这里写,见插件仓库那棵树)
├── docs/                         平台侧文档与 SQL 片段
└── logs/                         运行日志

wujies-common/ 的 27 个子模块

wujies-common/
├── wujies-common-bom/            BOM:统一版本,供插件 POM 导入
├── wujies-common-core/           ★ 平台核心。PluginServiceProvider / MenuOwnershipProvider
│                                 (宿主反查插件与菜单归属的 SPI 契约放这里)
├── wujies-common-web/            GlobalExceptionHandler(异常 → 前端的唯一出口)
├── wujies-common-plugin-sdk/     ★ 插件扩展点契约(FollowRelationApi / Platform*Api …)
├── wujies-common-mybatis/        MyBatis-Plus 集成(BaseMapperPlus 等)
├── wujies-common-tenant/         多租户
├── wujies-common-satoken/        Sa-Token 鉴权集成
├── wujies-common-security/       安全配置(security.excludes 白名单等)
├── wujies-common-redis/          Redis
├── wujies-common-oss/            对象存储
├── wujies-common-job/            定时任务宿主侧支持(任务实现随应用走)
├── wujies-common-sms/            短信
├── wujies-common-mail/           邮件
├── wujies-common-social/         社会化登录
├── wujies-common-sse/            SSE 推送
├── wujies-common-websocket/      WebSocket
├── wujies-common-rabbitmq/       RabbitMQ(队列 / 交换机 / 绑定要在宿主声明)
├── wujies-common-ratelimiter/    限流
├── wujies-common-idempotent/     幂等
├── wujies-common-log/            操作日志
├── wujies-common-excel/          Excel 导入导出
├── wujies-common-json/           JSON 序列化
├── wujies-common-encrypt/        字段加解密
├── wujies-common-sensitive/      数据脱敏
├── wujies-common-translation/    字段翻译
├── wujies-common-phone-verify/   手机号校验
└── wujies-common-doc/            接口文档

⚠️ 这里没有 *-api 契约模块(2026-09-30 起数量为 0):契约随插件走, 见 必须遵守的不变量。


二、wujies/wujies-plugins/ —— 插件仓库

pnpm workspace 根(package.json 的 name 是 wujies-plugins-workspace)。 注意它同时在工作区的子目录 wujies/ 下,不是工作区顶层。

wujies/wujies-plugins/
├── wujies-<app>/                 插件后端,每个自包含(11 个):
│   ├── enterprise/ exam/ finance/ gallery/ hello/ im/
│   ├── mall/ member/ pay/ quote/ social/
│   ├── app.json                  清单:菜单、assets、迁移声明(菜单的唯一真相)
│   ├── migrations/*.sql          建表 + 种子数据 + 字典 + 站点配置(按文件名排序执行)
│   ├── src/main/java/cn/wujies/<app>/
│   │                             domain / BO / VO / Mapper 接口 + XML / Service / controller
│   ├── pom.xml                   平台依赖一律 <scope>provided</scope>
│   ├── package.ps1               打包器(构建 + 签名 + 组装 zip)
│   ├── release.ps1               发布一个版本(读源 app.json 的 version → 打包 → 打 tag → 推 tag)
│   └── target/                   本模块构建输出(不进仓库)
├── frontend/                     插件前端工程(pnpm workspace 的成员,每个 app 一个)
│   ├── build/                    共用构建底座:host-source.ts(复刻宿主源码别名)/ vite.ts
│   ├── gallery-app/ exam-app/ im-app/ pay-app/ quote-app/ social-app/
│   ├── mall-app/ member-app/ enterprise-app/ finance-app/ hello-app/
│   ├── <code>-app/package.json · vite.config.ts(outDir 必须等于 remote-apps/<code>)
│   └── <code>-app/src/           远程视图(独立 ESM 产物)
├── sandbox/                      插件沙箱(独立 Maven 工程 + run.ps1,不含业务)
├── keys/                         签名密钥:private.pem(**已 gitignore,绝不进仓库**)/ public.pem
├── dist-packages/                ⚠️ **历史**产物目录(2026-10-05 起不再写入,仍在 .gitignore 里)
├── docs/                         插件仓库自己的文档(开发指南、打包教程、解耦路线图…)
├── package.json · pnpm-workspace.yaml · pnpm-lock.yaml   前端工程的工作区定义
├── package.ps1                   仓库级打包脚本(-Plugin / -SigningKey / -Keygen / -SyncPublicKey)
└── pom.xml                       插件后端的 Maven 聚合 POM

⚠️ 前端产物目录名必须等于 appCode:frontend/<code>-app 的 outDir、 defineRemoteApp 的 appCode、后端落位目录、GET /app/runtime/remote-apps 拼出的 URL 四处是同一个约定。少一个 -app 就是"菜单永远点不开"。

⚠️ 应用包的落点在这两棵树之外(所以上面两处 dist-packages/ 都标了"历史"): 打包器的默认输出目录是 <插件仓库的上一级>\.plugin-dist\<appCode>\<版本>\, 本机即 C:\Users\TX\Desktop\ruoyi\wujies\.plugin-dist\(与插件仓库平级的另一棵目录)。 放在仓库外是有意的:产物不会被任何仓库的 git 看到,也不会被仓库的 clean 顺手删掉。 见打包应用。


三、plus-ui/ —— 宿主前端

plus-ui/
├── package.json                  ⚠️ 它的 name 是 wujies-admin(命名陷阱的根源)
├── vite.config.ts · uno.config.ts · eslint.config.ts · tsconfig.json · index.html
├── src/                          宿主源码
│   ├── api/ · assets/ · components/ · composables/ · directive/ · enums/ · hooks/
│   ├── lang/ · layout/ · router/ · store/ · types/ · utils/ · views/
│   └── plugins/appmarket/        应用市场前端运行时:远程应用装载、菜单刷新、形态自检、可用性探测
├── vite/                         构建期插件
│   ├── plugins/                  各 vite 插件(auto-import / components / compression / icons / unocss …)
│   ├── auto-import.ts            ★ 自动导入宇宙 —— 插件工程必须逐项对齐,否则远程产物裸全局
│   ├── appMarketStatic.ts        远程应用的静态清单(开发兜底)
│   └── index.ts · setup-extend.ts
├── scripts/                      Node 守门脚本:audit-menus / check-remote-apps /
│                                 check-remote-globals / check-runtime-shims / gen-runtime-shims / svg2ico
├── bin/                          本机批处理:run-web.bat / build.bat / package.bat
├── public/ · html/               静态资源
├── app-market-dist/              市场产物落位:app-runtime/ + remote-apps/
├── dist/                         构建输出
└── node_modules/

四、命名陷阱:wujies-admin 有三个意思

同一个名字在三处含义不同,历史上已经因此误导过两次排查。 依据:wujies-platform/AGENTS.md §0。

写法实际指怎么认出来
wujies-platform/wujies-admin/后端启动模块(Java)有 pom.xml / src/main / Dockerfile;产物是 wujies-admin.jar
工作区顶层的 wujies-admin/前端产物的落位目录,里面只有 app-market-dist/没有 package.json、没有 src/;app-market-dist/remote-apps/ 是产物落点
plus-ui/宿主前端仓库(Vue 3 / Vite)有 vite.config.ts / src/;package.json 的 name = wujies-admin

判断口诀(AGENTS.md §0 原话的意思):

  • 凡是指向 src/plugins/**、src/views/**、app-market-dist/** 的路径 → 都是前端 = plus-ui/;
  • 凡是指向 src/main/resources/**、wujies-admin.jar、mvn -pl wujies-admin 的 → 都是后端 = wujies-platform/wujies-admin/。

⚠️ 还有一个不在任何 git 仓库里的目录要说清楚:工作区最外层还有一个 docs/ (松散副本 + 教程记录),改它不会有人知道。要长期保留的内容请放 wujies/wujies-plugins/docs/ 或 wujies-platform/docs/。

相关阅读

目录