wh
ef8b75a03e
修改中间件地址
2026-04-13 18:22:40 +08:00
wh
7172861e67
修改用户模块
2026-04-13 17:13:29 +08:00
wh
a489e2b204
修改mybatis版本启动报错,swagger注解问题
2026-04-12 00:15:59 +08:00
wh
c3308e069d
后台添加swagger支持
2026-04-10 10:47:51 +08:00
wh
b8d9aec4ca
docs(plan): 修正 pom.xml 中 includeScope=runtime(fix excludeScope 错误)
2026-04-09 19:47:40 +08:00
wh
5103dac16c
fix(deploy): pom.xml maven-dependency-plugin excludeScope 改为 includeScope=runtime
2026-04-09 19:47:12 +08:00
wh
c2a254cba4
fix+refactor: 代码审查修复(11 项安全/并发缺陷)+ log.debug → log.info(21 处)
...
代码审查修复:
- MybatisPlusConfig: video_process_job 加入 IGNORED_TABLES(修复回调路径多租户过滤导致全部回调静默丢失)
- TokenFilter: catch(Exception) 替代 catch(NumberFormatException),防止空指针泄漏为 500
- VideoController: createJob 空指针防护 + handleCallback 共享密钥校验(X-Callback-Secret)
- VideoProcessService: handleCallback 显式校验 companyId 非空;triggerAi 失败改为 error 级日志
- ExtractionService/QaService: validateAndGetTask 显式校验 companyId(纵深防御)
- TaskClaimService: reclaim 增加原子 WHERE status='REJECTED';claim 异常时释放 Redis 锁
- TaskService: reassign 校验 targetUserId 属于同一租户
- AuthService: user:sessions:{userId} Set 设置滑动 TTL,防止 Token 无限累积
- ExportService/SourceService: RustFS + DB 非原子操作增加失败回滚清理
- SourceService: getOriginalFilename 使用 Paths.get().getFileName() 防路径遍历
日志规范:
- 11 个 Service 类 21 处 log.debug 替换为 log.info
2026-04-09 19:42:20 +08:00
wh
d231180bff
feat(deploy): Dockerfile 改为多阶段构建(薄 jar + start.sh)
2026-04-09 19:39:49 +08:00
wh
3f0dee0826
feat(deploy): pom.xml 替换 fat JAR → 薄 jar + maven-dependency + maven-assembly
2026-04-09 19:39:28 +08:00
wh
8eb3c77abd
feat(deploy): 添加 Assembly 描述符 distribution.xml
2026-04-09 19:36:39 +08:00
wh
b7d6cbc1e2
feat(deploy): 添加 start.sh(Docker exec / VM nohup 双模式)
2026-04-09 19:35:58 +08:00
wh
7b25064593
feat(deploy): 添加 logback.xml(INFO 级,60 MB 滚动)
2026-04-09 19:31:15 +08:00
wh
ff3b38ab2e
docs(plan): 添加部署优化实施计划(deploy.md 8 条需求)
2026-04-09 19:27:17 +08:00
wh
011a731f4b
docs(spec): 补充九、部署与发布章节(deploy.md 需求落地)
...
- TOC 添加第九章入口
- 九.1 Maven 构建:移除 fat JAR,添加 maven-jar-plugin + maven-dependency-plugin + maven-assembly-plugin
- 九.2 分发包结构:bin/etc/libs/logs 四级目录
- 九.3 start.sh:Docker 用 exec 前台、VM 用 nohup 后台
- 九.4 logback.xml:INFO 级别,60 MB 滚动,30 天保留
- 九.5 Dockerfile 更新:多阶段构建,复制 etc/ 配置并调用 start.sh
- 九.6 log.debug → log.info:11 文件 21 处,附批量替换命令
- 八 合规清单新增 #12-14:包结构、start.sh Docker 兼容、日志级别
2026-04-09 19:14:56 +08:00
wh
0fa3981a85
格式化
2026-04-09 16:46:02 +08:00
wh
a14c3f5559
feat(phase9-10): US8 视频处理与系统配置模块 + 代码审查修复
...
Phase 9 (US8):
- VideoProcessJob 实体 + VideoProcessJobMapper
- SysConfig 实体 + SysConfigMapper(手动多租户查询)
- VideoProcessService:createJob/handleCallback(幂等)/reset
- T074 修复:AI 触发通过 TransactionSynchronization.afterCommit() 延迟至事务提交后
- VideoController:4 个端点,/api/video/callback 无需认证
- SysConfigService:公司专属优先 > 全局默认回退,UPSERT 仅允许已知键
- SysConfigController:GET /api/config + PUT /api/config/{key}
- TokenFilter:/api/video/callback 绕过 Token 认证
- 集成测试:VideoCallbackIdempotencyTest、SysConfigIntegrationTest
Phase 10 (代码审查与修复):
- T070 MultiTenantIsolationTest:跨公司资料/配置隔离验证
- T071 SourceController.upload():ResponseEntity<Result<T>> → Result<T> + @ResponseStatus
- T074 FinetuneService.trigger():移除 @Transactional,AI 调用在事务外执行
2026-04-09 16:18:39 +08:00
wh
f6c3b0b4c6
feat(phase8): US7 用户管理模块(角色变更立即生效、禁用即失效)
...
- RedisService:新增 hPut/sAdd/sRemove/sMembers Set 操作
- RedisKeyManager:新增 userSessionsKey(userId) = user:sessions:{userId}
- AuthService:login 后将 token 加入 user:sessions 集合;logout 时从集合移除
- UserService:createUser/updateUser/updateRole/updateStatus
- updateRole:DB 写入后更新所有活跃 Token 的 role 字段(立即生效,无需重新登录)
- updateStatus(DISABLED):删除所有活跃 Token(立即失效),清除 sessions 集合
- UserController:5 个端点全部 @RequiresRoles("ADMIN")
- 集成测试:角色变更同一 Token 立即生效;禁用后 Token 立即 401
2026-04-09 15:48:07 +08:00
wh
49666d1579
feat(phase7): US6 训练数据导出与 GLM 微调提交模块
...
- ExportBatch 实体 + ExportBatchMapper(updateFinetuneInfo)
- ExportService:createBatch(JSONL生成+RustFS上传+批量更新)、listSamples、listBatches
- 双重校验:sampleIds非空(EMPTY_SAMPLES 400)、全部APPROVED(INVALID_SAMPLES 400)
- FinetuneService:trigger(提交GLM微调)、getStatus(实时查询)
- AI调用不在@Transactional内,仅DB写入部分受事务保护
- ExportController:5个端点全部@RequiresRoles("ADMIN")
- 集成测试:权限403、空列表400、非APPROVED样本400、已审批样本查询200
2026-04-09 15:43:45 +08:00
wh
6d972511ff
feat(phase6): US5 QA 问答生成阶段标注与审批模块
...
- QaService:getResult/updateResult/submit/approve/reject 五大方法
- approve() 单事务内完成:training_dataset→APPROVED + task→APPROVED + source_data→APPROVED
- reject() 清除候选问答对(deleteByTaskId),source_data 保持 QA_REVIEW 状态
- 与 ExtractionService 同款自审校验(SELF_REVIEW_FORBIDDEN 403)
- QaController:5 个端点 /api/qa/{taskId} 系列,ANNOTATOR/REVIEWER 权限分离
- 集成测试 QaApprovalIntegrationTest:
- 审批通过验证整条流水线终态(training_dataset+source_data 均为 APPROVED)
- 驳回验证候选记录清除 + 重领再提交全流程
2026-04-09 15:39:28 +08:00
wh
927e4f1cf3
feat(phase5): US3+US4 任务领取、提取标注与审批模块
...
- 任务领取(TaskClaimService):Redis SET NX + DB WHERE status=UNCLAIMED 双重并发防护
- 任务管理(TaskService/TaskController):任务池/我的任务/待审批/全部任务/创建/指派 10 端点
- 提取标注(ExtractionService/ExtractionController):AI 预标注/更新/提交/审批/驳回 5 端点
- 审批解耦(ExtractionApprovedEventListener):@TransactionalEventListener(AFTER_COMMIT) + REQUIRES_NEW
确保 AI QA 生成在审批事务提交后独立执行,异常不回滚审批结果
- 状态实体:AnnotationTask/AnnotationTaskHistory/AnnotationResult/TrainingDataset
- 集成测试:并发领取安全(10 线程恰好 1 成功)+ 审批流(通过/自审/驳回重领)
2026-04-09 15:36:11 +08:00
wh
7f12fc520a
Phase 4 完成:US2 原始资料上传(SourceData / SourceService / SourceController)
...
新增:
- SourceData 实体 + SourceDataMapper(含 updateStatus 方法)
- SourceResponse DTO(上传/列表/详情复用)
- SourceService(upload/list/findById/delete,upload 先 INSERT 获取 ID
再构造 RustFS 路径,delete 仅允许 PENDING 状态)
- SourceController(POST /api/source/upload 返回 201,GET /list,
GET /{id},DELETE /{id};@RequiresRoles 声明权限)
- SourceIntegrationTest(权限校验、空列表、删除不存在资料、
已进入流水线资料删除返回 409)
- application.yml 添加 token.ttl-seconds 配置项
2026-04-09 15:21:32 +08:00
wh
a28fecd16a
Phase 2/3 完成:修复 Shiro javax/jakarta 兼容性,实现 US1 认证模块
...
修复:
- TokenFilter 改继承 OncePerRequestFilter(jakarta.servlet),
移除 PathMatchingFilter(javax.servlet)依赖,解决 Lombok 级联失败
- ShiroConfig 用 FilterRegistrationBean 替代 ShiroFilterFactoryBean,
避免 javax/jakarta Filter 类型不兼容;securityManager 调用
SecurityUtils.setSecurityManager() 确保 @RequiresRoles AOP 可用
- LabelBackendApplication 排除 ShiroWeb 自动配置(WebAutoConfiguration、
WebFilterConfiguration、WebMvcAutoConfiguration)
- SysUserMapper @InterceptorIgnore 修正为 mybatis-plus 包路径
新增(Phase 2 尾声):
- SysCompany / SysCompanyMapper
- SysUser / SysUserMapper
- ShiroFilterIntegrationTest(无 Token→401、过期→401、角色不足→403、满足→200)
新增(Phase 3 / US1):
- LoginRequest / LoginResponse / UserInfoResponse DTO
- AuthService(login + logout + me;BCrypt 校验;Redis Hash 存 Token)
- AuthController(POST /api/auth/login、POST /logout、GET /me)
- AuthIntegrationTest(正确密码→token、错误密码→401、退出后→401)
2026-04-09 15:16:49 +08:00
wh
b5f35a7414
Merge branch '001-label-backend-spec'
2026-04-09 14:09:02 +08:00
wh
4a002bd84e
提交gitignore
2026-04-09 13:57:25 +08:00
wh
0cd99aa22c
On branch 001-label-backend-spec
...
Changes to be committed:
new file: src/main/java/com/label/common/shiro/BearerToken.java
new file: src/main/java/com/label/common/shiro/ShiroConfig.java
new file: src/main/java/com/label/common/shiro/TokenFilter.java
new file: src/main/java/com/label/common/shiro/TokenPrincipal.java
new file: src/main/java/com/label/common/shiro/UserRealm.java
modified: src/main/java/com/label/common/statemachine/DatasetStatus.java
new file: src/test/java/com/label/AbstractIntegrationTest.java
new file: src/test/java/com/label/unit/StateMachineTest.java
new file: src/test/resources/db/init.sql
2026-04-09 13:54:35 +08:00
wh
556f7b9672
feat(common): 添加 MybatisPlusConfig/StateValidator,修复 jsqlparser 依赖 (T010/T011)
...
- MybatisPlusConfig: TenantLineInnerInterceptor + PaginationInnerInterceptor
- StateValidator: 通用状态机校验,失败抛出 INVALID_STATE_TRANSITION
- pom.xml: 新增 mybatis-plus-jsqlparser 3.5.9(3.5.7+ 必须显式引入)
2026-04-09 13:31:14 +08:00
wh
8fb730d281
feat(common): 添加 @OperationLog 注解和 AuditAspect (T016/T017)
2026-04-09 13:28:38 +08:00
wh
3d1790ad64
feat(common): 添加 RedisKeyManager/RedisService/RedisConfig (T009)
2026-04-09 13:27:47 +08:00
wh
42fb748949
chore: 添加 .gitignore 和 tasks.md 到版本控制
2026-04-09 13:25:50 +08:00
wh
52d5dd9c24
feat(common): 添加 BusinessException/GlobalExceptionHandler/CompanyContext/状态枚举 (T007/T008/T012-T015)
2026-04-09 13:21:06 +08:00
wh
ae55e87e2c
fix(init): 更新真实 BCrypt 哈希值,添加 actuator 依赖,修复健康检查 (T003/T004 followup)
2026-04-09 13:20:07 +08:00
wh
94cb27e95f
feat(common): 添加 RustFsClient 和 AiServiceClient (T018/T019)
2026-04-09 13:16:53 +08:00
wh
0e2b1e291b
feat(common): 添加统一响应格式 Result/ResultCode/PageResult (T006)
2026-04-09 13:16:31 +08:00
wh
3da0e49b38
feat(init): 添加 application.yml 配置文件 (T005)
2026-04-09 13:12:58 +08:00
wh
600a8b8669
feat(init): 配置全量依赖 (T002)
2026-04-09 13:10:33 +08:00
wh
672fe888c9
feat(db): 创建全部 11 张表 DDL 及初始数据 (T003)
2026-04-09 13:09:30 +08:00
wh
bc33194b6e
feat(infra): 添加 Docker Compose 配置和后端 Dockerfile (T004)
2026-04-09 13:08:49 +08:00
wh
fba3701cb9
fix(init): 修复 pom.xml 冗余编译器属性,测试类加 webEnvironment=NONE (T001)
2026-04-09 13:05:47 +08:00
wh
3b99b1d8c3
feat(init): 创建 Maven 项目骨架 (T001)
2026-04-09 13:00:30 +08:00
wh
4054a1133b
feat(plan): 生成 label_backend 完整实施规划文档
...
Phase 0:research.md(10项技术决策,无需澄清项)
Phase 1:data-model.md(11张表+Redis结构),contracts/(8个模块API契约),quickstart.md(Docker Compose启动+流水线验证)
plan.md:宪章11条全部通过,项目结构确认
2026-04-09 12:27:16 +08:00
wh
0891ae188d
feat(spec): 新增 label_backend 需求规格说明文档
...
包含 8 个用户故事、35 条功能性需求、9 条可度量成功标准
涵盖认证、多租户隔离、双标注流水线、并发任务领取、异步视频处理等核心场景
2026-04-09 12:11:10 +08:00
wh
ba3b7389f0
docs: 添加文档目录及各章节返回目录链接
2026-04-09 11:47:31 +08:00
wh
badffd8bca
docs: 添加文档目录及各章节返回目录链接
2026-04-09 11:43:10 +08:00
wh
6e0677e06a
docs: 数据库表设计完善性专项评审(第三轮)
...
新增 §9.5 评审,10 项问题(N–W):
- N: sys_config 全局唯一约束修复(NULL != NULL 问题,改为两个局部唯一索引)
- O: annotation_result 新增 UNIQUE(task_id)
- P: training_dataset.export_batch_id 改为 BIGINT FK
- Q: 全部枚举字段添加 CHECK 约束(role/status/phase/task_type)
- R: annotation_task_history 补充 operator_name 快照字段
- S: annotation_task 新增 (company_id, source_id) 索引
- T: training_dataset 新增 task_id 索引
- U: sys_user 补充 created_by 字段
- V: source_data 补充 mime_type 字段
- W: 新增 set_updated_at() 触发器,覆盖全部有 updated_at 的表
附:DDL 修复补丁(ALTER TABLE + 触发器),可直接在开发库执行
2026-04-09 11:39:19 +08:00
wh
e382995718
docs: 审批流程合理性专项评审(第二轮)
...
- 新增 §9.4 审批流程合理性专项评审,5 项问题(I–M)
- 新增 GET /api/tasks/pending-review(REVIEWER 审批收件箱)
- 新增 POST /api/tasks/{id}/reclaim(REJECTED 任务重拾)
- GET /api/tasks/mine 说明补充:包含 REJECTED 状态
- ExtractionService.approve() 重构为两阶段:同步审批 + 异步 AI 调用(发布 ExtractionApprovedEvent)
- 修复 QaService.approve() 重复变量声明(编译错误)
- 修复 SourceStatus 状态机:移除不可达的 QA_REVIEW → REJECTED 转换
2026-04-09 11:34:31 +08:00