平台内置模块
本文是 1.x 的归档文档(冻结于 1.x)。该分支只接收勘误修正, 内容基本不再变动;文中的源码路径、配置项与版本号均以 1.x 为准,不建议用于新项目。
新项目请查看 5.x 最新文档。已在 1.x 上运行的项目,本文仍是可靠依据。
这一页是平台(后端仓库 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-job | SnailJob 客户端与开关 | 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/。同上 |
docs/removed/wujies-portal/ 与 docs/removed/wujies-openapi/ 里仍有 import cn.wujies.gallery.*
这类语句。查"平台到底有没有引用应用包"时必须先排除这两棵目录,否则会得到错误结论。
门户 / 开放端点的下落
wujies-portal / wujies-openapi 归档后,宿主侧只保留了三处端点,都在 wujies-system:
| 端点 | 类 | 说明 |
|---|---|---|
GET /open/{code}/config | OpenWebsiteConfigController | 泛化端点:归档版 5 个子类(enterprise / exam / gallery / im / mall)逐字看下来只差一个 config_category 常量,故收成一个模板;新应用接站点配置不用改宿主 |
/open/system/message/** | OpenMessageController | 公开公告 |
/portal/user/profile | PortalUserProfileController | C 端「我的资料」:宿主用户 + 角色组/岗位组 + 会员信息(会员走 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_mode | audience | 是什么 |
|---|---|---|---|---|
system | /system | system | platform | 系统管理(用户 / 角色 / 菜单 / 部门 / 岗位 / 字典 / 参数 / OSS / 消息 / 待办) |
tenant | /tenant | system | platform | 租户与租户套餐 |
monitor | /monitor | system | platform | 系统监控(在线用户 / 缓存 / 日志) |
log | /log | system | platform | 日志管理 |
appconsole | /appconsole | system | platform | 应用上架端(用户版整体不可用) |
appmarket | /appmarket | system | tenant | 应用市场 |
myapps | /myapps | system | tenant | 我的应用 |
所以「系统管理 = 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-server | wujies-admin + plus-ui 前端产物 | 官方版(app-market.edition=official):目录在自己库 + 有上架端,并通过 /app/catalog/** 向用户版提供目录 |
wujies-platform-client | 同一份 jar,换配置 | 用户版(edition=client + catalog.mode=remote),没有上架端 |
wujies-snailjob-server | wujies-extend/wujies-snailjob-server | 可选加装,装完在主包表单里填地址才启用 |
wujies-monitor-admin | wujies-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 个子模块逐个列出、以及各模块的详细说明,见
仓库目录。