6b1966ce90
问题:小程序端 getOrCreateDefaultProject 在重试/并发/重复调用下, 仅靠应用层"先查后插"不保证幂等,会给同一用户重复创建默认项目。 素材库虽有唯一约束 uq_asset_libraries_project_kind(迁移058), 但 ensure-default 接口未捕获冲突,并发下直接 500。 改动: 1. projects 表新增 is_default 列 + 部分唯一索引 uq_projects_owner_default(owner_user_id WHERE is_default=true), 保证每用户至多一个默认项目(迁移069,存量"默认项目"最早一条回填) 2. Project 实体/Model/Repository 增加 is_default 字段 3. 新增 get_or_create_default_project / find_default_by_owner: INSERT 冲突时捕获 IntegrityError 回滚重查,返回已有记录不报500 4. 素材库仓储新增 get_or_create_default_library(同上幂等语义) 5. 新增 POST /projects/ensure-default 组合接口: 一次请求幂等返回默认项目 + 三类默认素材库ID 6. ensure-default 素材库接口改用幂等仓储方法(修复并发500) 7. in-memory 仓储同步幂等方法 测试:15 个新测试(并发10次只建1个、跨用户独立、IntegrityError恢复、 字段语义),99 个相关旧测试全过。