+ * ⚠️ 修复「多默认」之前,各消费点是用 list() + RandomUtil.choice() 随机挑一个的, + * 那是在「可能有多条默认」的既成事实下打的补丁;现在约束唯一后应统一走本方法。 + */ + TtUserAvatar getDefaultAvatar(); } diff --git a/skins-service/service-admin/src/main/java/com/ruoyi/admin/service/impl/TtUserAvatarServiceImpl.java b/skins-service/service-admin/src/main/java/com/ruoyi/admin/service/impl/TtUserAvatarServiceImpl.java index 7ec28c4..cf7144e 100644 --- a/skins-service/service-admin/src/main/java/com/ruoyi/admin/service/impl/TtUserAvatarServiceImpl.java +++ b/skins-service/service-admin/src/main/java/com/ruoyi/admin/service/impl/TtUserAvatarServiceImpl.java @@ -1,20 +1,78 @@ package com.ruoyi.admin.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.domain.other.TtUserAvatar; import com.ruoyi.admin.mapper.TtUserAvatarMapper; import com.ruoyi.admin.service.TtUserAvatarService; -import com.ruoyi.common.config.RuoYiConfig; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +/** + * 用户头像库 + *
+ * 【默认头像的唯一性约束 —— 2026-09-24】 + * 默认头像用于给新注册 / 白号 / 推广号分配初始头像(见 ApiRegisterServiceImpl、 + * ApiLoginServiceImpl、ApiUserServiceImpl、PromoLoginServiceImpl 四处消费点), + * 语义上必须**全表最多只有一条 is_default='1'**。 + *
+ * 原实现只做 updateById,导致「把 A 设为默认」时 B/C/D 的 is_default 仍为 '1', + * 库里一度出现 7 条默认(id 63~69),并且部分消费点用的是 RandomUtil.choice(...), + * 会随机挑一条 ⇒ 默认头像实际不唯一、每次注册拿到的头像都不同。 + *
+ * ⇒ 现在把「互斥」收敛到 service 层:凡是把某条写成 is_default='1' 的写操作,
+ * 都先把其余记录的 is_default 清成 '0',再落当前这条;两步同一事务。
+ */
@Service
public class TtUserAvatarServiceImpl extends ServiceImpl