--- title: 会员中心 - 签到记录 type: design module: member page_type: list created: 2026-09-05 updated: 2026-09-05 sources: [design/c-end/c-end-tables, design/c-end/pages/cend-member/sign, design/rules/member-business-rules, design/schema/member-tables, design/design-conventions] priority: P1 confidence: medium --- # 签到记录 — 页面详细设计 > **待确认清单**(原型先行页,2026-09-05 spec 补写批次,未确认前不臆造): > - `[待确认-1]` **双表口径并存**:C 端新表方案 `member_sign_record`([[design/c-end/c-end-tables]] §十,2026-08-24:UK(member_id,sign_date)、continuous_days、is_retroactive、reward_type/reward_value)vs server-cdz 实接口读 **V5 保留表 `member_sign_in_record`**(无 mobile 列,user_id=会员 id 字符串口径,仅 day/point/experience 旧列)。本页 real 分支消费保留表:会员列回退 memberId、补签标记恒 false、奖励由 point 推导(>0→积分,否则 '-')。 > - `[待确认-2]` 汇总/导出无端口径:real 无签到汇总接口(原型注释"GET /member/sign-records/summary 未落地")→ 顶部统计卡置 0 演示口径;导出为演示 toast;member-api 未登记本页契约(real 口径以 server-cdz `MemberController` + `api/member.ts` 为准)。 > - `[待确认-3]` 签到奖励默认值不一致:R-member-02(member-growth-flow 口径)默认 每日 5 分 + 连续 7 天额外 50 分;C 端 sign 页待确认 #1 记录默认 **+2/次**(快电实证)——两处默认值不同,最终以积分规则页(member_points_rule change_type=2,[[pages/member/points-rule]])线上配置为准,本页只读不做判断。 > - `[待确认-4]` 补签规则(C 端 sign 页待确认 #2):补签消耗积分扣点递增(参考快电 5/5/10/15/20)or 免费次数——默认积分扣点递增,消耗流水 change_type 待定稿;本页"仅看补签"筛选 real 无对应键不生效。 > - `[待确认-5]` reward_type=2 优惠券 时 reward_value 语义冲突:c-end-tables §十 记 numeric(20,2) 券面额(元);原型展示 `${rewardValue} 张`(张数);C 端 sign 页为"签到券包档位(3/5/10/20/25 天)券面额运营可配"——张数 vs 面额待 C 端券包定稿(本页展示原型"张"口径,标注待定)。 ## 1. 页面定位与用户目标 - 一句话描述:本页用于查看会员每日签到/补签记录(会员/签到日期/连续天数/补签标记/奖励类型与值),顶部统计卡展示签到活跃度(今日签到/补签/最长连续/累计发积分),是「签到 → 积分/券 → 留存」活动的运营监测与对账页(**只读**,无写操作)。 - 用户目标/任务: - 运营商/运营(主角色):看今日签到规模、连续签到分布、累计发放奖励,评估签到留存抓手效果。 - 值班员:按手机号/会员 ID 查某会员签到明细,核对签到积分争议(与 [[pages/member/points]] change_type=2 流水对账)。 - 入口路径:`/member/sign-record`(PC) - 所属模块:[[modules/member-prd]](88 页口径 P1,关联 C 端签到体系 member_sign_record) - 页面类型:list - 优先级:P1 - 设计来源(调研依据): - 行为基准 = 原型 `prototype/src/views/member/SignRecord.vue`(real/mock 双轨)与 `api/member.ts`(fetchSignRecords、SignRecordQuery、toSignRecordDTO)。 - 写入源 = C 端「每日签到」页([[design/c-end/pages/cend-member/sign]],`/pages/member/sign`):日历式签到/补签/连续天数/券包(快电实证主型)。 - 表结构 = `member_sign_record`(c-end-tables §十)+ V5 保留表 member_sign_in_record([[design/schema/member-tables]] §2.3/§四 旧表族)。 - 规则 = R-member-02 签到/连续签到积分([[design/rules/member-business-rules]])。 ## 2. 布局与交互线框(ASCII) ### PC 端 ``` +------------------------------------------------------------------+ | [顶部统计卡区 - 4 指标] | | +---------+ +---------+ +---------+ +---------+ | | |今日签到 | |今日补签 | |最长连续 | |累计发积分 | | | | 1,268人 | | 87人 | | 45天 | | 6,420分 | ← real 全 0([待确认-2]) | +---------+ +---------+ +---------+ +---------+ | +------------------------------------------------------------------+ | [筛选区] | | 会员手机号[____] 签到日期[日期范围 至] [仅看补签☐] | | [查询] [重置] | +------------------------------------------------------------------+ | [工具栏] 签到奖励由积分规则「每日签到/连续签到」驱动(change_type=签到,点数由积分规则页配置) | [导出] | +------------------------------------------------------------------+ | [表格区] | | 记录ID | 会员 | 签到日期 | 连续天数 | 补签 | 奖励类型 | 奖励值 | | 1001 | 138****5678 | 2026-08-26 | 12天 | - | 积分 | 5 分 | | 1002 | 138****5678 | 2026-08-24 | 10天 | - | 优惠券 | 1 张 | ← 语义 [待确认-5] | 1004 | 139****1234 | 2026-08-26 | 3天 | 补签 | 积分 | 5 分 | +------------------------------------------------------------------+ | [分页] | +------------------------------------------------------------------+ ``` > real 分支差异:筛选输入框 placeholder"会员ID(real 无手机号筛选键)"(纯数字才透传 memberId);签到日期窗 real 生效;仅看补签仅 mock 生效;会员列展示 memberId(无 mobile 列)。 ## 3. 功能点清单 | 编号 | 功能点 | 触发位置 | 权限码 | 行为描述 | 来源 | |------|--------|---------|--------|---------|------| | FP-01 | 签到记录分页 | 页面加载/筛选 | member:view | real:GET /api/member/sign-records 服务端分页 + memberId/时间窗;mock:本地过滤 + 装饰分页 | 原型 SignRecord.vue | | FP-02 | 汇总统计卡 | 顶部 4 卡 | member:view | 今日签到/今日补签/最长连续/累计发积分(mock 全量聚合;real 置 0 演示口径 [待确认-2]) | 原型 | | FP-03 | 会员筛选 | 筛选区 | member:view | 手机号子串(mock);**real 输入纯数字 → 按 memberId 透传;非数字不生效**(保留表无 mobile 列) | 原型 | | FP-04 | 时间窗筛选 | 筛选区 | member:view | 签到日期范围 YYYY-MM-DD(real 透传 startDate/endDate 服务端生效) | 原型(real 分支) | | FP-05 | 仅看补签 | 筛选区 | member:view | 勾选仅展示 isRetroactive=true 行;**real 无对应键 → 不生效**([待确认-1/4]) | 原型(mock 分支) | | FP-06 | 导出 | 工具栏 | member:export | 异步导出当前筛选 ≤10000 条;**演示 toast(real 无导出接口)** | 原型(通用列表能力) | ## 4. 字段定义 | 字段 | key | 类型 | 必填 | 校验规则 | 枚举/默认 | 单位 | 来源 | 说明 | |------|-----|------|------|---------|-----------|------|------|------| | 记录 ID | signId | bigint | 是 | - | - | - | c-end-tables §十 / real id | mock 自增;real=member_sign_in_record.id | | 会员手机号 | mobile | string | 是 | 11 位手机号 | - | - | c-end-tables §十 | **real 保留表无 mobile 列 → 会员列回退 memberId(user_id 数字解析,解析失败置空)** | | 会员 ID | memberId | bigint | 否 | - | - | - | real 派生 | 仅 real 分支填充;user_id=旧版会员 id 字符串口径 | | 签到日期 | signDate | date | 是 | YYYY-MM-DD | - | - | 同上 | real 由 createTime 取日期(fmtDate) | | 连续天数 | continuousDays | int | 是 | ≥1 | - | 天 | c-end-tables §十 | 当日连续签到天数;real=旧列 day;中断重计(R-member-02) | | 补签标记 | isRetroactive | bool | 否 | - | false | - | c-end-tables §十 | true 展示黄色"补签"tag;**real 恒 false**(旧表无补签标记,[待确认-1]) | | 奖励类型 | rewardType | enum | 否 | 二态 | 1=积分/2=券(原型 积分/优惠券;色码:积分蓝/券绿) | - | c-end-tables §十 | real 由 point 推导(>0→积分,否则 '-');无奖励行 '-' | | 奖励值 | rewardValue | number | 否 | - | 积分 mock 5/50;券 mock 1 | 积分"分" / 券"张"([待确认-5]) | 同上 | real=旧列 point(经验列 experience 不展示);展示后缀:积分 `${v} 分`、优惠券 `${v} 张` | > 奖励枚举/色码登记于 `prototype/src/constants/status.ts`(SIGN_REWARD_TYPES/SIGN_REWARD_TYPE_TAG_TYPE)。签到规则点数不落本表列——点数由 member_points_rule(change_type=2 SIGN_IN)驱动(R-member-02),本页只读展示发放结果;金额字段无(券面额语义见 [待确认-5])。 ## 5. 业务逻辑规则卡 > R-member-02 为 [[design/rules/member-business-rules]] 权威规则;R-sign-* 为页面派生局部规则,待接真/规则评审时并入 rules 文档登记。 | 编号 | 规则名 | 触发条件 | 业务逻辑 | 边界/异常 | 来源 | |------|--------|---------|---------|----------|------| | R-member-02 | 积分获取-签到/连续签到 | C 端每日首次登录签到 | 每日签到固定 5 分(ACQUIRE+FIXED,limitCount=1/DAY,change_type=2 SIGN_IN);连续 7 天额外 50 分(第 7 天发放);签到记录防重(当日仅 1 次,member_sign_in_record 或流水幂等) | 每日限 1 次,重复签到 → 409 MEMBER_4092;中断重计;Redis `member:sign-in:{memberId}:{date}` 当日标记 | [[design/rules/member-business-rules]] R-member-02;[[flows/member-growth-flow]] §三 | | R-sign-01 | 每日签到唯一 | C 端签到写入 | UK(member_id, sign_date)(member_sign_record 新表);签到流水以 member_points_transaction change_type=2 为准(member_sign_in_record 为 V5 保留沿用的明细表) | 重复签到 → 40903 MEMBER_4092"当日已签到";跨日边界(00:00 后为新一天)以服务端时区为准 | c-end-tables §十;schema member-tables §2.3 | | R-sign-02 | 连续签到计算 | 每日签到写入 | continuous_days = 昨日连续天数 + 1(昨日未签到则重置为 1);补签可续期但计入 is_retroactive | 跨自然月是否清零:C 端 sign 页快电实证"自然月分周期" vs R-member-02"中断重计"——周期口径 [待确认-4 同族] 待定稿 | c-end sign 页;R-member-02 | | R-sign-03 | 签到奖励对账 | 页面展示 | 本页只读:奖励发放真实凭据在 member_points_transaction(change_type=2);展示行(含补签/券)与流水核对 | 账实不符 → 积分对账任务(对齐 R-member-01 对账语义) | R-member-01/03 | ## 6. 操作流程与状态机 ### 6.0 签到日状态流(C 端写入侧;本页为只读查询,无页面内状态机) ```mermaid stateDiagram-v2 [*] --> 已签到: 当日首次签到(+积分/券,连续天数+1) 已签到 --> [*]: 当日终(次日重新判定;UK(member_id,sign_date) 防同日重复) 已签到 --> 补签记录: 断签后补签(is_retroactive=true,连续续期) ``` ### 6.1 用户故事 - US-1(运营商,PC):作为运营商,我想看今日签到人数与累计发放积分,以便评估签到活动投入产出。验收:顶部统计卡加载正确;工具栏提示奖励由积分规则配置驱动。 - US-2(值班员):作为值班员,我想查某会员的签到明细核对"签到未到账"投诉。验收:输入手机号/会员 ID 命中该会员记录(real 数字口径 → memberId 服务端筛选),连续天数与奖励值正确。 ### 6.2 测试场景(五要素:目标/前置/角色/步骤/预期) - TS-1(正常):筛选日期窗 2026-08-24~2026-08-26 → 列表仅剩窗内签到行,连续天数列展示正确。 - TS-2(边界):空签到库 → 空态"暂无签到记录,会员在 C 端签到后展示于此";real 保留表空表返回空集为开发期正常(api/member.ts 注释)。 - TS-3(异常):real 勾选"仅看补签" → 不生效(无服务端键);输入非数字"手机号" → 提示以 memberId 为准/不筛选(原型 placeholder 语义)。 ## 7. 权限控制 | 操作 | 权限码 | 角色([[permission-matrix]]) | 无权限表现 | |------|--------|------------------------------|-----------| | 查看列表/统计 | member:view | 值班员/运营商/站长 | 隐藏菜单 | | 导出 | member:export | 运营商 | 按钮隐藏 | > 本页只读,无写权限码;签到奖励配置在 [[pages/member/points-rule]](member:points:edit,R-member-02 规则源)。 ## 8. 接口契约 > **契约未登记 [[design/api/member-api]](本页为 88 页批次后补页)**;real 口径以 server-cdz `module/member/controller/MemberController`(@RequestMapping("/api/member"))+ `api/member.ts` 为准。下表「已实现」= server-cdz M7+ 读切片已落地;「待后置」= 未实现。 | 接口 | 方法 | 路径 | 请求关键参数 | 响应关键字段 | 备注 | |------|------|------|-------------|-------------|------| | 签到记录分页 | GET | /api/member/sign-records | page,size,memberId,startDate,endDate(yyyy-MM-dd) | Page | **已实现**(MemberVOs.SignRecordPageReq/SignRecordDTO;读 V5 保留表 member_sign_in_record:无 mobile 列,memberId 按 user_id 数字口径匹配,day/point 旧 bigint 原样透传) | | 展示映射 | - | - | - | - | real → 页面:signDate=createTime 取日期、continuousDays=day、rewardType=point>0?'积分':'-'、rewardValue=point、isRetroactive=false(toSignRecordDTO,[待确认-1]) | | 签到汇总统计 | GET | -(未实现,不臆造路径) | dateRange | - | **待后置**:原型注释"GET /member/sign-records/summary 未落地"→ real 统计卡置 0 演示口径;排期后增补并回填 member-api | | 导出 | POST | -(未实现,不臆造路径) | 同列表筛选 | taskId | **待后置**:原型导出为演示 toast(异步 ≤10000 条) | | 补签筛选/手机号筛选键 | - | - | - | - | **待后置**:real 无 retroactive/mobile 参数(SignRecordPageReq 仅 memberId/时间窗),mock 仅本地过滤 | ## 9. 异常与边界场景 - 加载态:骨架屏 300ms(统计卡 + 表格骨架)。 - 空态:"暂无签到记录,会员在 C 端签到后展示于此"(real 保留表空集同文案,开发期正常态)。 - 错误态:错误码 + "签到记录加载失败,请检查后重试" + 重试按钮(对齐 [[design-conventions]] §九)。 - 无权限态:"您无签到记录查看权限,请联系管理员开通"(403)。 - real 差异提示:统计卡 0 演示口径;会员列 memberId;"仅看补签"/手机号筛选不生效(筛选框 placeholder 明示"会员ID(real 无手机号筛选键)")。 - 边界值:单页 10/20/50/100;时间窗跨年允许(服务端 ≤1 年限制开发期定稿);mock"今日签到"按固定演示日 2026-08-26 聚合(原型打样,接真后按服务端汇总)。 - 移动端:无(Web 端页面)。 ## 10. 关联页面与数据流 - [[design/c-end/pages/cend-member/sign]] — C 端「每日签到」写入源(`/pages/member/sign`):日历签到/补签/券包档位 - [[design/pages/member/points]] — 签到奖励流水(change_type=2 SIGN_IN)查看/对账(R-member-02) - [[design/pages/member/points-rule]] — 每日签到/连续签到规则配置源(本页工具栏口径引用) - [[design/pages/member/member-list]] — 会员 360 入口:按 memberId/mobile 反查签到会员 - [[design/pages/member/invite-record]] — 同族"C 端运营活动只读查询页"(邀请记录,奖励同为积分体系) - [[design/c-end/c-end-tables]] §十 — member_sign_record 表结构权威(UK/连续天数/补签/奖励) - [[design/rules/member-business-rules]] R-member-02 — 签到积分规则权威 - 数据流:C 端 sign 页写 member_sign_record + member_points_transaction(change_type=2)→ 本页读(real 当前读 V5 member_sign_in_record 保留表,[待确认-1] 双轨说明);无写操作。实体见 [[design/er/er-member]]。