外观
每日签到 · 技术实现
「玩家设定 →」
1. 代码位置
| 层 | 类 | 职责 |
|---|---|---|
| Controller | controller/DailySignInController(/api/daily/sign-in) | 状态查询/签到 |
| Service | service/DailySignInService | 签到判定(Asia/Shanghai 时区、Redis 缓存去重)、奖励发放(1,000 点券 + 七日循环材料箱 + 会员体验日) |
| repository | repository/DailySignInRepository | 签到记录持久化、会员体验日幂等台账 |
| domain | domain/ShopBalanceRules | DAILY_SIGN_IN_REWARD_TICKETS = 1_000(每天 1000 福利点券) |
2. 数据表
| 表 | 关键列 | 说明 |
|---|---|---|
player_daily_sign_in | player_id、sign_date、reward_tickets | 签到记录(主键去重,V56 起) |
player_member_trial_grant | player_id、grant_month、sign_in_ordinal | 会员体验日发放台账(V134):同月同档位唯一,防回滚/删行后重签刷月卡 |
3. 配置与常量
- 奖励常量:
ShopBalanceRules.DAILY_SIGN_IN_REWARD_TICKETS = 1_000(福利点券 4001) - 会员体验日:
DailySignInService.MEMBER_TRIAL_SIGN_IN_DAYS = {2, 15, 28}、MEMBER_TRIAL_DURATION = 24h - 缓存键:
emberfall:daily:sign-in:<playerId>(Redis,DailySignInService) - yml 键:无
4. 数据流简述
GET /api/daily/sign-in/status 先查 Redis 缓存再查表判定今日是否已签。POST /api/daily/sign-in(根路径)按 Asia/Shanghai 时区取当日日期,未签则写入 player_daily_sign_in 并发放 1000 福利点券(inventory_item 4001),Redis 置位防重;已签返回错误码。事务提交后通过 TransactionSynchronization 写缓存。
第七天(七日循环 dayIndex 6)加发自选材料箱 ×1;月内签到次数命中 2/15/28 时发放会员体验日——先写 player_member_trial_grant 台账(INSERT IGNORE,同月同档位只发一次),再调用 GameRepository.extendMonthlyCard 单条 UPDATE 原子延长:新到期时间 = GREATEST(COALESCE(monthly_card_expire_at, NOW()), NOW()) + 24h(只增不减,已有正式月卡时直接并入延长)。响应含 memberTrialGrantedToday / memberTrialExtended 供前端区分「激活体验」与「并入延长」提示。
5. 已知差异
无
6. 相关代码
- 商城(
ShopBalanceRules:福利点券 4001 发行体系) - 每日限额(
DailyLimitPool) - Redis 会话(
RedisAuthSessionStore:缓存基础设施)