Commit Graph

7 Commits

Author SHA1 Message Date
lzh
87beb1228e feat(tenant): 租户-项目两级架构 Phase 0+1 — 基础框架层
Phase 0 技术验证:
- ProjectBaseDO extends TenantBaseDO,新增 projectId 字段
- ProjectContextHolder (TransmittableThreadLocal) 项目上下文管理
- ProjectDatabaseInterceptor 实现 TenantLineHandler,返回 project_id 列
- 注册第二个 TenantLineInnerInterceptor,通过 @Qualifier 保证初始化顺序
- DualInterceptorTest 11 个用例验证双拦截器 SQL 注入(SELECT/INSERT/UPDATE/DELETE + JOIN + 子查询)

Phase 1 基础框架层:
- @ProjectIgnore 注解 + ProjectIgnoreAspect (SpEL 条件支持)
- ProjectUtils 工具类 (execute/executeIgnore)
- ProjectContextWebFilter 从请求 Header 解析 project-id
- WebFrameworkUtils 扩展 HEADER_PROJECT_ID + getProjectId()
- WebFilterOrderEnum 新增 PROJECT_CONTEXT_FILTER、PROJECT_SECURITY_FILTER
- RPC: TenantRequestInterceptor 自动透传 project-id
- MQ: Kafka/RocketMQ/RabbitMQ/Redis 全部支持 project-id 发送与消费
- @ProjectJob + ProjectJobAspect (@Order(2) 内层,配合 @TenantJob 使用)
- TenantJobAspect 补充 @Order(1) 外层标记
- ProjectDO + UserProjectDO + Mapper + ProjectService + ProjectController
- ProjectCommonApi (Feign) + ProjectApiImpl + ProjectFrameworkServiceImpl (Guava 缓存)
- TenantServiceImpl.createTenant() 联动创建默认项目
- ErrorCodeConstants 新增 1-002-030-xxx 项目错误码

Review 修复:
- Bean 初始化顺序: projectLineInnerInterceptor 依赖 @Qualifier 确保顺序
- computeIgnoreTable: @ProjectIgnore 检查优先于 isAssignableFrom
- ProjectFrameworkServiceImpl 注册为 Spring Bean
- RocketMQ SendHook: project-id 独立于 tenantId 传播
- createDefaultProject 移入 TenantUtils.execute 事务块内
- 全部 MQ/RPC 统一使用 HEADER_PROJECT_ID 常量
- ProjectJobAspect 增加租户上下文防御校验
- 移除 ProjectDO/UserProjectDO 无效的 @KeySequence
- ProjectServiceImpl/ProjectApiImpl 移除冗余 TenantUtils.execute 嵌套

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 19:22:57 +08:00
lzh
e11d3e1b6e feat(framework): OssPresignResponseBodyAdvice 支持 List<String> 字段预签名
- @OssPresignUrl 注解现在同时适用于 String 和 List<String> 字段
- 回填时防御不可变 List,自动降级为 ArrayList
- FileServiceImpl 预签名访问 URL 去除查询参数,保持持久化路径干净

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:59:34 +08:00
lzh
f3299bd655 feat(framework): 新增 @OssPresignUrl 注解与 ResponseBodyAdvice 自动预签名框架
基于 ResponseBodyAdvice 拦截 CommonResult 响应体,通过反射递归扫描
VO 中标注 @OssPresignUrl 的 String 字段,去重后批量调用
OssPresignUrlApi 一次性完成预签名,再回填到对应字段。

核心设计:
- supports() 阶段通过泛型静态分析判断 VO 是否含注解字段,
  无注解的接口零开销跳过(类似字典翻译注解思路)
- 三级缓存:FIELD_CACHE / ALL_FIELDS_CACHE / HAS_PRESIGN_CACHE
- 递归深度限制 MAX_SCAN_DEPTH=10 防止 StackOverflow
- 仅扫描 com.viewsh.* 包,规避 Java 17 模块系统限制
- 异常静默降级,保留原始 URL

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:05:42 +08:00
lzh
2a20f7a89f fix(framework): ApiRequestFilter 纳入 /open-api 路径,修复 open-api 多租户拦截缺失
TenantSecurityWebFilter 继承 ApiRequestFilter,之前 shouldNotFilter 仅匹配
/admin-api 和 /app-api,导致 /open-api 请求跳过租户校验,DB 层
getRequiredTenantId() 抛 NPE。现在补上 openApi prefix,外部系统需传
tenant-id Header。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:02:02 +08:00
lzh
6e56dcb6a2 feat(framework): API 签名、安全白名单与 Web 配置调整
- 新增 ApiSignatureProperties 配置类
- 调整签名自动配置与 Redis DAO 实现
- 更新安全白名单与 Web 属性配置
- 网关新增安保模块路由配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:35:05 +08:00
lzh
ee0304e120 chore: banner修改 2025-12-31 17:29:28 +08:00
lzh
8ccfafe2bb first commit
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
2025-12-31 11:48:19 +08:00