mjava-mcli/ 为 mjava-pro/pom.xml artifactId 为 mjava-proBoot.java package 为 com.malk.pro,scanBasePackages = {"com.malk"} 保持application.yml server.port=9010 + context-path=/api/pro;spel.multiSource=falsepom.xml <modules> 追加 <module>mjava-pro</module>mvn -pl mjava-pro -am compile 通过mjava-pro/src/main/java/com/malk/pro/tenant/TenantProfile.java(数据类:tenantId + vendorCredentials + extraJson)com.malk.pro.tenant.TenantContext(ThreadLocal<TenantProfile> + current()/set()/clear()/propagate())TenantInterceptor(HandlerInterceptor)解析 X-Tenant-Id → 查注册表 → set;afterCompletion clearWebMvcConfigurer 注册拦截器,排除 /_admin/** 的公共端点MdcTaskDecorator 或新建 TenantTaskDecorator,挂到 AsyncConfig 两个线程池com.malk.pro.tenant.TenantRegistryService(依赖 YDClient)loadAll():按 tenant.registry.formUuid 分页查宜搭应用表,转 TenantProfileget(tenantId):内存 Map 查;缺失触发 loadOne() 单条拉取@PostConstruct loadAll();@Scheduled(fixedDelay = ttl) 异步刷新AdminController(仅 dev profile 通过 @Profile("dev") 生效)暴露 /reloadTenantcom.malk.pro.service.dingtalk.DynamicDDService:从 TenantContext 读凭据 → 构造 DDConf → 调基座 DDClientDynamicYDService(对接宜搭)、其他 vendor 按需UtilToken 使用规范:key 统一 {tenantId}:{vendor}:{appKey}(若基座未扩展 namespace,就在调用侧拼)UtilHttp 审计日志扩展字段 tenantId(从 MDC 读);改基座或在 pro 侧包一层./log/{日期}/pro-%X{tenantId}.logapplication-dev.yml.example(含 tenant.registry.* 占位)application-prod.yml.example(含 tenant.registry.* 占位)README.md(在 mjava-pro 目录下,说明新增租户操作步骤)/Users/malk/Desktop/Tech/claude/后端/mjava-baseline.md 表格里 mjava-pro 状态改为"已实施"TenantContextTest(set/clear/异步传播)X-Tenant-Id 调同一接口 → 验证 token 隔离 + 审计日志分片/opsx:validate add-mjava-pro --strict 通过