Files
shaguabijia-app-server/docs/database/signin_record.md
T
marco b4780e256e docs(database): 补全 19 表文档 + 新增 OVERVIEW 总览
- 重写 15 张已有表文档:每张补「用在 App 哪/增删改查时机/字段取值/join key 指向」
- 新建 4 张缺失表文档:wechat_transfer_authorization / ad_watch_log / price_report / app_config
- 新增 OVERVIEW.md:功能↔表映射 + 写入路径 + 表间关系(含语义 join key)+ ER + 资金模型
- README 索引补齐到 19 表 + 置顶 OVERVIEW + 通用约定补全
- 纠正过时:withdraw_order(reviewing/rejected/user_name)、savings_record(/order/report 真实写入)、coin_transaction(biz_type)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 00:25:57 +08:00

2.4 KiB

signin_record — 签到记录(7 天循环)

模型 app/models/signin.py · 仓库 app/repositories/signin.py · 接口 signin-status / signin-do · ← 索引 · 总览

App「每日签到」每签一次写一行,(user_id, signin_date) 唯一,天然防一天签两次。cycle_day(1..7)决定发多少金币(档位 rewards.SIGNIN_REWARDS,默认 (10,20,30,50,80,120,200),运营后台 app_config.signin_rewards 可改),断签重置回 1;streak 是连续天数(不封顶),给"已连续签到 N 天"展示。

用在哪 / 增删改查

  • C(插入):POST /signin/do(do_signin)。今天未签且校验通过 → 算出 cycle_day/streak(昨天签过则在上次基础上 +1、否则重置 1)→ 写一行 + grant_coins(biz_type='signin', ref_id=今天日期) 加币,同事务 commit。今天已签再调 → 抛 AlreadySignedError(409),不重复写。
  • U / D:无。每天一行,历史不改。
  • R:GET /signin/status(签到页:今天签没签、连续天数、7 档状态/金币、能否签),内部 get_status 读最近一条 + 推算今天档位。

字段

类型 约束 / 默认 说明(取值 / join)
id Integer PK, autoincrement
user_id Integer FK→user.id, index, NOT NULL 归属用户
signin_date Date NOT NULL 签到日期(北京时间 cn_today() 的 date)。其 ISO 串被 coin_transaction.ref_id 引用(biz_type=signin)
cycle_day Integer NOT NULL 取值 1..7:7 天循环里今天第几档,决定发币额;断签重置回 1
streak Integer NOT NULL 连续签到天数(≥1,不封顶);断签重置回 1
coin_awarded Integer NOT NULL 本次实发金币(= 当时档位金额)
created_at DateTime(tz) server_default now() 时间

关系 / Join Key

  • user_iduser.id(多对一)。
  • 配套写 coin_account(U,加币)+ coin_transaction(C,biz_type='signin'ref_id=signin_date.isoformat())。coin_transaction.ref_id 反查即对应本表当天那条。

索引与约束

  • PK id;index user_id;UNIQUE(user_id, signin_date) = uq_signin_user_date(防一天签两次)。

注意

  • "今天/昨天"全按北京时间(CN_TZ=UTC+8),不用 UTC(否则 0~8 点会算成前一天)。
  • 连续判定:last.signin_date == today - 1天 才算连续,否则首签/断签重置。