Skip to content

日常打卡(小程序 · 设计定稿)

状态:P0/P1 已落地(Sys 模块 + 小程序 pages/daily-check-in/*);库表 mini_daily_check_in_* 已通过 zen:push 同步。
入口:首页九宫格 「常用」miniapp/src/constants/mobile-shell-local.ts 本地注入)。
约束:与个人记账相同 — miniapp-bookkeeping-user-scope(openid/JWT sub、无 siteId、不跳账号登录页)。

架构:P0 = Sys 内模块,不单独微服务(见 microservice-split-decision.md)。


产品定稿

约定
名称日常打卡
核心用户 自定义类型一日一类可多条 记录
统计优先级① 连续天数(按类型)② 本月总次数
全局连续P0 不做(仅按类型统计连续;P1+ 可单独立项)

完整功能清单

图例:[P0] 首版必做 · [P1] 二期 · [P2] 可选 · [工程] 非用户可见

一、打卡类型(用户自定义)

#功能阶段说明
1.1新建类型P0名称必填(如 ≤32 字);可选图标(预设 menuIconKey)、标签色
1.2编辑类型P0改名称 / 图标 / 颜色
1.3类型列表P0未归档类型;按 sort 排序展示
1.4拖拽 / 上下调整排序P0type/sort 批量更新
1.5归档类型P0从「今日」列表隐藏;历史记录保留
1.6恢复归档P0重新出现在今日列表
1.7删除类型P0仅当该类型无任何历史记录 可物理删;否则提示改归档
1.8空态引导P0无类型时引导「先添加想记录的事」

二、打卡记录(一日一类多条)

#功能阶段说明
2.1新增一条打卡P0选类型 + 默认当前时间;写入 bizDate(业务日)
2.2再记一次P0同类型、同一 bizDate 可多条; (用户,类型,日) 唯一约束
2.3可选备注P0如「5km」「第 2 次」;record/save / update
2.4编辑备注 / 发生时间P0单条 record/update
2.5删除单条记录P0record/delete;不影响同类型其它条
2.6今日次数展示P0卡片显示「今日 n 次」+ 最近一条摘要(时间/备注)
2.7补记过去日期P0主屏切换日期或明细页指定 bizDate 后新增
2.8查看某日全部记录P0按「类型 + 日期」列表(当日明细页)
2.9附件 / 拍照P2不在 P0/P1 范围

三、今日打卡(主屏)

#功能阶段说明
3.1默认展示今天P0bizDate = 今天(与用户时区约定一致,对齐记账)
3.2左右切换日期P0回看某天是否打过、可补记
3.3类型卡片:未打P0主按钮「打卡」→ 新增一条
3.4类型卡片:已打P0展示次数;「再记一次」;点击进入当日明细
3.5快捷入口「类型管理」P0跳转 types 页
3.6下拉刷新P0重拉 record/day-summary + 类型列表

四、当日明细

#功能阶段说明
4.1列表展示P0该类型 + 该日全部记录(时间、备注)
4.2单条编辑 / 删除P0见 2.4 / 2.5
4.3底部「再记一次」P0同 2.2
4.4空态P0该日该类型 0 条时的提示

五、打卡统计

#功能阶段说明
5.1周期 Tab:周 / 月P0query period=week|month
5.2主指标:连续天数P0按类型;类型下拉切换;从周期末日往前,每日 ≥1 条 +1
5.3次指标:本月总次数P0当前类型 + 全类型合计
5.4分类型汇总列表P0每行:类型名、连续 X 天、本月 Y 次
5.5活跃天数(辅助)P1月内有记录的自然日数(≠ 次数)
5.6自定义日期区间P1对齐记账 stats-custom:多选类型 + dateFrom/dateTo
5.7日历热力格P1点格看当日条数
5.8生成分享图P1参考 bookkeeping/stats 分享 canvas
5.9全局连续天数P2任意类型每天至少 1 次

六、类型管理页

#功能阶段说明
6.1列表(含已归档区)P0归档折叠或分 Tab
6.2新建 / 编辑弹窗或子页P0表单:名称、图标、颜色
6.3排序P0与 1.4 一致
6.4归档 / 恢复 / 删除P0与 1.5–1.7 一致

七、首页「常用」入口

#功能阶段说明
7.1日常打卡P0PagePath.dailyCheckInTodaypinOrder 约 -10
7.2打卡统计P0.../stats?period=month(或 week,与记账一致)
7.3类型管理P0.../types
7.4分组P0groupKey: commongroupTitle: 常用
7.5不与远端重复 path 去重P0mergeLocalShellApps 按完整 path 去重

八、账号 / 会话 / 网关(与个人记账一致)

#功能阶段说明
8.1微信 openid 换 JWT 即可进P0不要求绑手机
8.2无 JWT 不跳登录页P0失败回首页换票
8.3请求不附 X-Site-IdP0postApiShouldAttachSiteHeader 增加 /sys/daily-check-in/
8.4豁免手机门闸P0credential-gate / isDailyCheckInPath
8.5401 回首页P0复用 bookkeeping-session 或抽 ensurePersonalSession
8.6数据仅 sub 隔离P0Service 层 assertActor 按当前用户,禁止 siteId

九、后端(Sys 模块)

#功能阶段说明
9.1ZenStack 模型 + zen:pushP0mini_daily_check_in_typesmini_daily_check_in_records
9.2软删P0对齐 backend-soft-delete
9.3POST .../type/saveP0新建/更新
9.4POST .../type/listP0含归档标记
9.5POST .../type/archiveP0归档/恢复
9.6POST .../type/deleteP0无记录可删
9.7POST .../type/sortP0{ ids: string[] }{ items: {id,sort}[] }
9.8POST .../record/saveP0新增
9.9POST .../record/updateP0备注、时间
9.10POST .../record/deleteP0单条
9.11POST .../record/pageP0PageQueryDto + typeId? + dateFrom/dateTo
9.12POST .../record/day-summaryP0某日各 typeIdcount、最近一条摘要
9.13POST .../stats/summaryP0周/月:连续天数、次数、分类型数组
9.14Sys 路由权限 registryP0@SysRoutePermission({ kind: 'authenticated' })
9.15Swagger / Knife4jP0@ApiSysPost* + DTO @ApiProperty
9.16网关路径P0/api/sys/daily-check-in/*,文档前缀一致

十、小程序工程

#功能阶段说明
10.1pages.json 注册页面P0today、day-detail、types、stats(+ stats-custom P1)
10.2page-paths.ts 常量P0
10.3shared/apiapi/daily-check-in.tsP0对接上述 POST
10.4useHomeShellOpenApp 会话P0打开前 ensureBookkeepingSession(或扩展 path 判断)
10.5各页 onShow 会话守卫P0失败 reLaunch 首页
10.6布局P0表单/列表遵循 miniapp-form-layoutminiapp-list-page
10.7统计图表P1miniapp-charts-canvas(若有环图/柱图)

十一、文档与规则

#功能阶段说明
11.1扩展 miniapp-bookkeeping-user-scope.mdcP0补充 daily-check-in 路径与 API 前缀
11.2roadmap-four-tracks Track 3 勾选P0开发中更新 checkbox
11.3改表时 database-docs-syncP0schema 变更后同步表文档

十二、P2 / 不做

#功能阶段说明
12.1订阅消息提醒P2每日提醒打卡
12.2类型「每周目标 N 次」P2完成率
12.3导出 CSVP2
12.4多人协作 / 监督打卡不做,除非单独立项
12.5与 Acc / 站点 / 记工联动不做
12.6PC Web 管理端P0 仅小程序

数据模型

表:mini_daily_check_in_types

字段说明
userId所属用户
name类型名称
iconKey可选,预设图标
color可选,#RRGGBB
sort排序
archived是否归档
Baseid、软删、审计字段

表:mini_daily_check_in_records

字段说明
userId所属用户
typeId类型 FK
bizDate业务日 YYYY-MM-DD
occurredAt发生时刻
note可选备注
Base软删

索引建议(userId, bizDate)(userId, typeId, bizDate)(非唯一)。

统计口径

指标计算
连续天数typeId,从 anchor 日往前,有 ≥1 条则 streak++,否则断
本月总次数bizDate 落在当月内的记录条数 COUNT
周统计dateFrom/dateTo 为本周一至周日(或与自然周配置一致)

页面与路由(规划)

页面路径P0
今日打卡/pages/daily-check-in/today
当日明细/pages/daily-check-in/day-detail?typeId=&bizDate=
类型管理/pages/daily-check-in/types
打卡统计/pages/daily-check-in/stats?period=week|month
自定义统计/pages/daily-check-in/stats-customP1

API 一览(POST /sys/daily-check-in/*

路径P0
type/save
type/list
type/archive
type/delete
type/sort
record/save
record/update
record/delete
record/page
record/day-summary
stats/summary

P0 验收标准

自动化

bash
pnpm run check
pnpm run check:miniapp

页面只显示 pages/daily-check-in/today.wxml 无内容

多为 dev 产物占位页(先登记 pages.json、后补 .vue,且未重启编译)。处理:

bash
cd miniapp
pnpm run clean:mp-weixin
pnpm run dev:mp-weixin

微信开发者工具导入目录须为 miniapp/dist/dev/mp-weixin(勿用旧缓存)。dev:mp-weixin 启动前会自动检测并清理占位 wxml。

手工(微信)

  1. 未绑手机:首页 常用日常打卡 可进,不跳登录页。
  2. 新建类型「跑步」→ 今日打卡 2 次(再记一次)→ 今日显示 2 次。
  3. 当日明细可删 1 条 → 今日变 1 次。
  4. 打卡统计 · 月:跑步本月 2 次;连续天数与操作一致。
  5. 归档类型后今日列表不显示;统计仍计历史。
  6. 抓包:无 X-Site-Id;仅 /api/sys/daily-check-in/*

分期总表

阶段包含清单章节
P0一~四、六~十一(不含 P1/P2 行);九、十全部 API/页面
P15.5–5.8、4.6、stats-custom、日历、分享图
P2十二 12.1–12.3、2.9、5.9

相关文档

TaskFlow 内部文档 Released under the MIT License.