Wujies 无界平台
平台功能(自研)应用生态

平台内置模块

这一页是平台(后端仓库 wujies-platform/)里有哪些模块的权威清单:每个模块负责什么、 哪些模块已经删除、以及"平台模块"和"应用"为什么不是一回事。

读之前先分清三类东西,混了就一定会找错仓库、改错地方:

你想找的在哪看哪一页
平台自己的 Maven 模块(系统管理、工作流、应用市场…)wujies-platform/本页
业务应用(商城 / 图床 / 考试…)wujies/wujies-plugins/应用生态
某个具体文件该放哪三个仓库各自的目录约定仓库目录

口径以 wujies-platform/AGENTS.md §1「模块地图」为准;目录布局的逐条查证方式见 项目结构。

结论先看

  • 平台后端是 wujies-platform/,反应堆根 pom.xml 的 <modules> 只有 4 个条目: wujies-admin、wujies-common、wujies-extend、wujies-modules。
  • 全反应堆 pom.xml 共 38 个(含各层 parent),叶子模块 34 个。
  • 业务应用不在平台里。平台对 cn.wujies.<app>.* 的 Java 引用为 0,新增一个业务应用不需要动平台一行。
  • 平台上没有 *-api 契约模块(2026-09-30 起为 0 个):实体 / BO / VO / Mapper 接口 与 Mapper XML / Service / controller / open / listener / task 全在插件仓库自己的目录里。
  • 模块名一律是 wujies-*。本项目源自上游 RuoYi-Vue-Plus,但上游那套模块名(前缀、包名、目录名) 本项目一律不用;在源码或旧文档里看到它们,那是历史遗留,不要照着写。

模块地图

wujies-platform/                     38 个 pom.xml(含各层 parent)
├── wujies-admin/                    启动模块:PluginClassPathLoader 在这里,Spring 之前执行;产物 wujies-admin.jar
├── wujies-common/                   基础设施,27 个子模块
│   ├── wujies-common-core/          宿主反查插件与菜单归属的 SPI:PluginServiceProvider / MenuOwnershipProvider / AppRouteHintProvider
│   ├── wujies-common-web/           GlobalExceptionHandler(异常 → 前端的唯一出口)
│   ├── wujies-common-plugin-sdk/    宿主向插件暴露的能力契约(Platform*Api / FollowRelationApi / *ServiceLocator)
│   ├── wujies-common-job/           SnailJob 客户端与开关(本模块里没有任何任务实现)
│   ├── wujies-common-mybatis/       MyBatis-Plus 集成(BaseMapperPlus 等)
│   └── …                            tenant / satoken / security / redis / oss / sse / websocket / rabbitmq / excel / doc …
├── wujies-modules/                  业务模块,4 个
│   ├── wujies-app-market/           ★ 应用市场:目录 + 插件运行时 + 上架端 + 包安全
│   ├── wujies-system/               系统管理 + 监控 + 少数宿主侧门户/开放端点
│   ├── wujies-workflow/             工作流(warm-flow)
│   └── wujies-plugin-probe/         插件运行时探针(验证外置 jar 能否被宿主装配)
└── wujies-extend/                   旁挂服务:独立进程、独立 jar,都不在启动模块的依赖链上
    ├── wujies-monitor-admin/        服务监控中心(Spring Boot Admin,控制台 /admin)
    └── wujies-snailjob-server/      定时任务调度中心(SnailJob 服务端 + 控制台 /snail-job)
模块负责什么关键落点
wujies-admin启动模块,打包产物就是整个宿主PluginClassPathLoader(启动期按 plugins-dist/active-plugins.txt 挂插件 jar)
wujies-common-core宿主侧 SPI 契约PluginServiceProvider、MenuOwnershipProvider、AppRouteHintProvider
wujies-common-web异常 → 前端的唯一出口GlobalExceptionHandler
wujies-common-plugin-sdk插件唯一应依赖的宿主入口Platform*Api、FollowRelationApi、各应用的 *ServiceLocator
wujies-common-jobSnailJob 客户端与开关SnailJobConfig(snail-job.enabled=true 时装配)
wujies-app-market应用市场的全部机制catalog/(IAppCatalogService + Local/Remote)、plugin/(PluginRuntimeManager / PluginMapperRegistrar / PluginHandlerMapping)、security/(签名 + 产物白名单)、edition/(official / client)
wujies-system系统管理与监控;另有 3 个宿主侧端点controller/system/**、controller/monitor/**,以及 OpenWebsiteConfigController / OpenMessageController / PortalUserProfileController
wujies-workflow工作流引擎是 warm-flow
wujies-plugin-probe探针:用最小 jar 验证外置产物能被装配。不得被 wujies-admin 依赖(它必须在编译期不在宿主 classpath 上,否则测不出真实情况)自带 mapper XML 与定时任务的最小样本
wujies-monitor-admin服务监控中心独立进程,无数据库,控制台 /admin
wujies-snailjob-server定时任务调度中心独立进程与独立库(script/sql/ry_job.sql),控制台 /snail-job,执行器端口 17888

各模块内部的包分工,另见 应用市场模块 与 插件运行时。

平台模块 ≠ 应用 ≠ 插件

类别位置分发方式例子
平台模块wujies-platform/wujies-modules/**跟着 wujies-admin.jar 一起编译发布wujies-system、wujies-workflow
旁挂服务wujies-platform/wujies-extend/**各自一个 jar,可装可不装wujies-snailjob-server、wujies-monitor-admin
应用(插件)wujies/wujies-plugins/wujies-<app>/打成应用包上架,租户按需安装mall / gallery / exam / member…
宿主前端plus-ui/(它的 package.json 里 name 写的是 wujies-admin,那只是名字不是位置)与后端一起打成前端产物plus-ui/src/plugins/appmarket/** 是远程应用的装载器

两条判据,看路径就能分清,不用问人:

  • 路径里出现 wujies-platform/ 且带 pom.xml → 平台模块,改它要重建 wujies-admin.jar;
  • 路径里出现 wujies/wujies-plugins/wujies-<app>/ → 应用,改它走打包 + 上架/升级, 平台一行都不用动。

两者的类加载关系决定了改法的边界:平台模块的类由宿主类加载器加载,插件由每插件独立的类加载器加载, 插件子上下文以宿主为 parent —— 所以插件能注入宿主,宿主不能注入插件,宿主侧要拿插件服务只能走 PluginServiceProvider 或定位器代理。细节见 插件运行时 与 必须遵守的不变量。

已删除 / 已归档的模块

下面这些名字在旧文档、旧提交信息与源码注释里都出现过,现在都不存在。 最容易犯的一类错是把 wujies-platform/docs/removed/** 下的源码当成"平台模块": 它们不在任何 <modules> 里、不参与编译。

名字曾经是什么现状
wujies-job平台侧的定时任务模块已删。宿主只留 wujies-common-job(SnailJob 客户端与开关),任务实现随应用走(cn.wujies.<app>.task);调度服务端是 wujies-extend/wujies-snailjob-server
wujies-demo平台侧的示例业务模块已删。示例用途由插件仓库的示例应用 hello 承担(wujies/wujies-plugins/wujies-hello/),见 示例应用
wujies-generator代码生成已删。平台里既没有模块也没有对应菜单(顶层菜单 tool 已从平台初始化 SQL 去掉)。新应用的起点是插件仓库的模板工程 wujies-hello,见 跟着 hello 读源码
wujies-portal门户端(C 端)接口模块已归档,源码在 wujies-platform/docs/removed/wujies-portal/。仍然需要的端点已重构进 wujies-system,见下
wujies-openapi对外开放接口模块已归档,源码在 wujies-platform/docs/removed/wujies-openapi/。同上
归档目录里的 import 不算"平台引用了应用"

docs/removed/wujies-portal/ 与 docs/removed/wujies-openapi/ 里仍有 import cn.wujies.gallery.* 这类语句。查"平台到底有没有引用应用包"时必须先排除这两棵目录,否则会得到错误结论。

门户 / 开放端点的下落

wujies-portal / wujies-openapi 归档后,宿主侧只保留了三处端点,都在 wujies-system:

端点类说明
GET /open/{code}/configOpenWebsiteConfigController泛化端点:归档版 5 个子类(enterprise / exam / gallery / im / mall)逐字看下来只差一个 config_category 常量,故收成一个模板;新应用接站点配置不用改宿主
/open/system/message/**OpenMessageController公开公告
/portal/user/profilePortalUserProfileControllerC 端「我的资料」:宿主用户 + 角色组/岗位组 + 会员信息(会员走 MemberServiceLocator,未安装时返回 member: null 而不是报错)

应用专属的端点不在这里 —— 它们已经搬进各自的插件(/portal/mall/**、/open/exam/**、 /portal/follow/** …),插件没装时那些路由根本不存在,不会留下"能路由、一调就报没装"的空壳。 搬与不搬的分界线见 从宿主模块抽成应用; 全部 /open/** 清单见 开放接口清单。

平台模块在应用登记表里的身份

app_info 是"应用"的唯一事实来源,平台自带的顶层菜单也在这里登记 —— 脚本是 wujies-platform/script/sql/update/app_market_register_modules.sql(7 行)。 两个字段正交,不要混着读:

  • install_mode:system(平台自带,不可卸载、不进市场、没有版本包)/ optional(可选应用,可安装、可停用);
  • audience:platform(平台管理员)/ tenant(B 端租户管理员)/ member(C 端用户),逗号分隔。
应用编码入口install_modeaudience是什么
system/systemsystemplatform系统管理(用户 / 角色 / 菜单 / 部门 / 岗位 / 字典 / 参数 / OSS / 消息 / 待办)
tenant/tenantsystemplatform租户与租户套餐
monitor/monitorsystemplatform系统监控(在线用户 / 缓存 / 日志)
log/logsystemplatform日志管理
appconsole/appconsolesystemplatform应用上架端(用户版整体不可用)
appmarket/appmarketsystemtenant应用市场
myapps/myappssystemtenant我的应用

所以「系统管理 = system + platform」,而可选应用是「optional + tenant」—— install_mode 决定能不能卸载、进不进市场,audience 决定谁看得见。

普通租户看不到系统管理入口,靠的是可见范围过滤

超管查询时不传 audience(表示不限制),因此 audience = 'platform' 的行只有超管命中; 租户身份按 FIND_IN_SET('tenant', audience) 过滤。这不是"前端把菜单藏起来"。

系统应用没有版本包,因此不存在"安装"这个动作,也不会有 app_install 记录; 市场列表按 install_mode != 'system' 排除,且不允许上下架与删除。 字段定义见 数据模型,市场侧的口径见 在应用市场里找应用。

定时任务:宿主只提供支持,任务在应用里

角色在哪
调度服务端 + 控制台wujies-extend/wujies-snailjob-server:独立进程、独立库(script/sql/ry_job.sql),控制台 /snail-job,执行器端口 17888
宿主侧支持wujies-common-job:SnailJobConfig 在 snail-job.enabled=true 时装配,模块里没有任何任务实现
任务实现插件仓库 wujies/wujies-plugins/wujies-<app>/src/main/java/cn/wujies/<app>/task/**

所以"平台里有个定时任务模块"是旧说法:平台侧没有任务实现,只有客户端与开关。 不部署调度中心(或 1Panel 安装表单里把调度中心地址留空)时,这些任务一条都不会执行, 包括订单自动取消/自动收货、优惠券状态刷新、会员积分过期、统计刷新等 —— 那是"没装",不是故障。 另外任务定义还要在 SnailJob 控制台导入,排查见 故障排查, 任务执行记录见 任务中心与日志。

部署形态:这些模块怎么落成可安装的包

deploy/tools/build-1panel.ps1 把上面的模块拼成 4 个 1Panel 应用包 (模板在 deploy/1panel/apps/**,docker context 在 deploy/docker/**):

包由什么构建说明
wujies-platform-serverwujies-admin + plus-ui 前端产物官方版(app-market.edition=official):目录在自己库 + 有上架端,并通过 /app/catalog/** 向用户版提供目录
wujies-platform-client同一份 jar,换配置用户版(edition=client + catalog.mode=remote),没有上架端
wujies-snailjob-serverwujies-extend/wujies-snailjob-server可选加装,装完在主包表单里填地址才启用
wujies-monitor-adminwujies-extend/wujies-monitor-admin可选加装

主包只含「前端 nginx + 后端」两个容器;MySQL / Redis / RabbitMQ 安装时从 1Panel 应用商店选 或填外部地址;对象存储不在包里。构建命令与表单填写见 后端部署, 两个版本的差异见 多部署与目录服务,版本形态开关见 目录中心化与版本形态。

怎么自己核验这一页

以下命令都在工作区根执行(wujies-platform/ 与 wujies/ 的上一层):

# 1) 反应堆根只有 4 个聚合条目
Select-String -Path wujies-platform\pom.xml -Pattern '<module>'

# 2) 全反应堆 pom 数(含各层 parent)→ 38
(Get-ChildItem wujies-platform -Recurse -Filter pom.xml |
   Where-Object FullName -notmatch '\\target\\').Count

# 3) 契约模块数量 → 0(空结果)
Get-ChildItem wujies-platform -Recurse -Directory -Filter '*-api' |
   Where-Object FullName -notmatch '\\target\\'

# 4) 已删模块:目录不存在(空结果)
Get-ChildItem wujies-platform -Recurse -Directory |
   Where-Object Name -in 'wujies-job','wujies-demo','wujies-generator'

# 5) 哪些是应用(平台里没有它们):一行一条 appCode=jarFileName
Get-Content wujies-platform\plugins-dist\active-plugins.txt
Select-String -Path wujies\wujies-plugins\pom.xml -Pattern '<module>'

# 6) 宿主侧没有任务实现(唯一命中落在 PluginRuntimeManager 的注释里)
Get-ChildItem wujies-platform -Recurse -Include *.java |
   Where-Object FullName -notmatch '\\target\\|\\docs\\removed\\' |
   Select-String '@JobExecutor'

wujies-common/ 的 27 个子模块逐个列出、以及各模块的详细说明,见 仓库目录。

相关阅读

目录