删除功能
这篇解决什么
内置功能多,多数情况只要在菜单里停用。只有确定永远不用、并且能接受不可逆改动时,才按「菜单 → 表 → 后端 → 前端 → 验收」拆干净。下面以多租户为例,其它功能同五步。
优先停用,不要删代码
管理端「菜单管理」把状态关掉即可。以后要再用,再打开。

本系统截图:打开菜单编辑,把「菜单状态」设为关闭即可停用。
只想单租户跑,也可以关开关:
| 名称 | 说明 | 仓库路径 |
|---|---|---|
yudao.tenant.enable | 默认 true。设为 false 即关闭多租户 | ruoyi-office/yudao-server/src/main/resources/application.yaml |
同文件里已有 ignore-urls / ignore-tables(例如 /admin-api/system/auth/**、system_user_role)。
真删不可逆
新分支、工作区干净、先备份库。至少备份 system_tenant、system_tenant_package 以及带 tenant_id 的业务表。可用 AI 先出删除计划,人审过再改。
第一步:菜单
「系统管理 → 菜单管理」删「租户管理」目录及子项(列表、套餐、切换等)。再清 system_role_menu 里已经不存在的 menu_id。种子在 ruoyi-office-db,改完归档增量 SQL,避免下次初始化又长回来。
第二步:表
租户列表也可先在界面核对,再决定删哪些表:

本系统截图。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
TenantDO | 租户主表,@TableName("system_tenant") | yudao-module-system-server/.../dal/dataobject/tenant/TenantDO.java |
TenantPackageDO | 套餐 system_tenant_package | 同目录 TenantPackageDO.java |
TenantPackageAssetDO | 套餐资产 system_tenant_package_asset | 同目录 |
TenantTransferJobDO | 迁移任务 system_tenant_transfer_job | 同目录 |
TenantDatabaseInterceptor | 给 SQL 拼 tenant_id | yudao-spring-boot-starter-biz-tenant/.../TenantDatabaseInterceptor.java |
第一次建议保留各表 tenant_id 列,只删租户表、关框架。确认单租户稳定后再考虑 DROP COLUMN。
DROP TABLE IF EXISTS system_tenant_transfer_job;
DROP TABLE IF EXISTS system_tenant_package_asset;
DROP TABLE IF EXISTS system_tenant_package;
DROP TABLE IF EXISTS system_tenant;第三步:后端
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 管理端接口 | 租户、套餐 | controller/admin/tenant/ |
| 业务与 DAL | Service、DO、Mapper、Convert | service/tenant/、dal/.../tenant/ |
| 对外 API | TenantApiImpl、TenantCommonApi | system-server / yudao-common |
| 框架 Starter | 删模块并从各 pom 去掉依赖 | yudao-framework/yudao-spring-boot-starter-biz-tenant/ |
用搜索核对 yudao-spring-boot-starter-biz-tenant 是否还有引用。
拆壳保芯
TenantUtils.execute / executeIgnore 只是临时切租户上下文。去掉包装,留下 lambda 里的业务。addTenantHeader 只是塞 tenant-id 请求头,可删行。@TenantIgnore、@TenantJob 只去注解。TenantContextHolder.getTenantId() 按调用处改掉。
// 删除前
TenantUtils.execute(tenant.getId(), () -> {
Long roleId = createRole(tenantPackage);
createUser(roleId, createReqVO);
});
// 删除后
Long roleId = createRole(tenantPackage);
createUser(roleId, createReqVO);TenantBaseDO 若还在,各 DO 要改继承,不能只删父类。
第四步:前端
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 租户页 | 列表与表单 | ruoyi-office-vben/apps/web-antd/src/views/system/tenant/ |
| 套餐页 | 套餐与资产 | src/views/system/tenantPackage/ |
| API | 请求封装 | src/api/system/tenant/、src/api/system/tenant-package/ |
启动 PC,按报错清 import。
第五步:验收
编译通过不等于隔离已消失。再搜 TenantUtils、tenant-id、TenantLineHandler。登录、切菜单、跑一遍核心单据。
@TenantJob 去掉后只会跑一遍。若原来依赖「每个租户执行一次」,要自己改调度。
其它功能同样五步:菜单、表、后端、前端、验收。跨模块引用先从 *-api 搜。
配置与操作
先停菜单再删表和代码,最后搜 TenantUtils / 跨模块 api。编译通过不等于隔离消失。
开启见 框架层。截图见上文菜单和租户。
