feat: 新增邀请翻牌验证及相关文案与界面调整

- CardFlipManager:注入 InviteCodeManager,新增对 Invite 类型翻牌的邀请校验(未使用邀请码则抛出异常),防止未被邀请的用户使用邀请类型翻牌。
- CardFlipService:调整提示文案,统一使用“本周”前缀,并在邀请解锁提示中强调必定中奖且每次中奖最大额度翻倍。
- 前端:
  - CardFlipActivity.vue:注释掉翻牌失败的全局提示,调整统计文案为“本周已翻/本周剩余/本周邀请”,并在邀请弹窗文案中说明必定中奖且奖励翻倍。
  - Avatar.vue:更新菜单项标签为“每日任务(限时)”和“每周邀请(限时)”。
This commit is contained in:
chenchun
2025-10-30 11:19:22 +08:00
parent e6b991fe86
commit e906208f4a
4 changed files with 23 additions and 10 deletions

View File

@@ -241,16 +241,16 @@ public class CardFlipService : ApplicationService, ICardFlipService
if (status.RemainingFreeFlips > 0) if (status.RemainingFreeFlips > 0)
{ {
return $"还有{status.RemainingFreeFlips}次免费翻牌机会"; return $"本周您还有{status.RemainingFreeFlips}次免费翻牌机会";
} }
else if (status.RemainingInviteFlips > 0) else if (status.RemainingInviteFlips > 0)
{ {
if (status.TotalFlips >= 7) if (status.TotalFlips >= 7)
{ {
return $"使用邀请码可解锁{status.RemainingInviteFlips}次翻牌,必中大奖!"; return $"本周使用他人邀请码可解锁{status.RemainingInviteFlips}次翻牌,必中大奖!每次中奖最大额度将翻倍!";
} }
return $"使用邀请码可解锁{status.RemainingInviteFlips}次翻牌"; return $"本周使用他人邀请码可解锁{status.RemainingInviteFlips}次翻牌,必中大奖!每次中奖最大额度将翻倍!";
} }
return "继续加油!"; return "继续加油!";

View File

@@ -11,6 +11,7 @@ namespace Yi.Framework.AiHub.Domain.Managers;
public class CardFlipManager : DomainService public class CardFlipManager : DomainService
{ {
private readonly ISqlSugarRepository<CardFlipTaskAggregateRoot> _cardFlipTaskRepository; private readonly ISqlSugarRepository<CardFlipTaskAggregateRoot> _cardFlipTaskRepository;
private readonly InviteCodeManager _inviteCodeManager;
private readonly ILogger<CardFlipManager> _logger; private readonly ILogger<CardFlipManager> _logger;
// 翻牌规则配置 // 翻牌规则配置
@@ -32,9 +33,11 @@ public class CardFlipManager : DomainService
public CardFlipManager( public CardFlipManager(
ISqlSugarRepository<CardFlipTaskAggregateRoot> cardFlipTaskRepository, ISqlSugarRepository<CardFlipTaskAggregateRoot> cardFlipTaskRepository,
InviteCodeManager inviteCodeManager,
ILogger<CardFlipManager> logger) ILogger<CardFlipManager> logger)
{ {
_cardFlipTaskRepository = cardFlipTaskRepository; _cardFlipTaskRepository = cardFlipTaskRepository;
_inviteCodeManager = inviteCodeManager;
_logger = logger; _logger = logger;
} }
@@ -107,6 +110,16 @@ public class CardFlipManager : DomainService
throw new UserFriendlyException(GetFlipTypeErrorMessage(flipType)); throw new UserFriendlyException(GetFlipTypeErrorMessage(flipType));
} }
// 如果是邀请类型翻牌,必须验证用户已使用过邀请码
if (flipType == FlipType.Invite)
{
var isInvited = await _inviteCodeManager.IsUserInvitedAsync(userId);
if (!isInvited)
{
throw new UserFriendlyException("需要使用他人邀请码才能解锁更多翻牌次数");
}
}
// 计算翻牌结果(基于当前是第几次翻牌,而不是卡片序号) // 计算翻牌结果(基于当前是第几次翻牌,而不是卡片序号)
var flipCount = task.TotalFlips + 1; // 当前这次翻牌是第几次 var flipCount = task.TotalFlips + 1; // 当前这次翻牌是第几次
var result = CalculateFlipResult(flipCount); var result = CalculateFlipResult(flipCount);

View File

@@ -128,7 +128,7 @@ async function handleFlipCard(record: CardFlipRecord) {
} }
} }
catch (error: any) { catch (error: any) {
ElMessage.error(error?.message || '翻牌失败'); // ElMessage.error(error?.message || '翻牌失败');
// 如果请求失败,移除翻牌动画 // 如果请求失败,移除翻牌动画
flippingCards.value.delete(record.flipNumber); flippingCards.value.delete(record.flipNumber);
} }
@@ -341,7 +341,7 @@ function toggleInviteSection() {
{{ taskData?.totalFlips || 0 }}/10 {{ taskData?.totalFlips || 0 }}/10
</div> </div>
<div class="stat-label"> <div class="stat-label">
已翻 本周已翻
</div> </div>
</div> </div>
</div> </div>
@@ -355,7 +355,7 @@ function toggleInviteSection() {
{{ taskData ? 10 - taskData.totalFlips : 10 }} {{ taskData ? 10 - taskData.totalFlips : 10 }}
</div> </div>
<div class="stat-label"> <div class="stat-label">
剩余 本周剩余
</div> </div>
</div> </div>
</div> </div>
@@ -369,7 +369,7 @@ function toggleInviteSection() {
{{ taskData?.invitedCount || 0 }} {{ taskData?.invitedCount || 0 }}
</div> </div>
<div class="stat-label"> <div class="stat-label">
邀请 本周邀请
</div> </div>
</div> </div>
</div> </div>
@@ -455,7 +455,7 @@ function toggleInviteSection() {
> >
<div class="invite-dialog-content"> <div class="invite-dialog-content">
<p class="dialog-tip"> <p class="dialog-tip">
请输入好友的邀请码解锁最后3次翻牌机会 请输入好友的邀请码解锁最后3次翻牌机会必定中奖每次奖励最大额度翻倍
</p> </p>
<el-input <el-input
v-model="inputInviteCode" v-model="inputInviteCode"

View File

@@ -72,8 +72,8 @@ const navItems = [
{ name: 'rechargeLog', label: '充值记录', icon: 'Document' }, { name: 'rechargeLog', label: '充值记录', icon: 'Document' },
{ name: 'usageStatistics', label: '用量统计', icon: 'Histogram' }, { name: 'usageStatistics', label: '用量统计', icon: 'Histogram' },
{ name: 'premiumService', label: '尊享服务', icon: 'ColdDrink' }, { name: 'premiumService', label: '尊享服务', icon: 'ColdDrink' },
{ name: 'dailyTask', label: '每日任务', icon: 'Trophy' }, { name: 'dailyTask', label: '每日任务(限时)', icon: 'Trophy' },
{ name: 'cardFlip', label: '翻牌活动', icon: 'Present' } { name: 'cardFlip', label: '每周邀请(限时)', icon: 'Present' }
// { name: 'usageStatistics2', label: '用量统计2', icon: 'Histogram' }, // { name: 'usageStatistics2', label: '用量统计2', icon: 'Histogram' },
]; ];
function openDialog() { function openDialog() {