时光未央,念念不忘 · 时光记录产品(Timesake)
整理日期:2026-08-17(随每次关键节点更新)
**主线进度(2026-08-18 更新)**:① 交互原型 ✅ → ② H5 完整版 ✅ → ③ H5 迭代二(媒体记录 + 自定义里程碑)✅ → ④ 微信小程序体验版已发布 ✅ → ⑤ 微信授权登录已上线(体验版 1.0.3)✅ → ⑥ 微信邀请分享卡片已上线(1.0.4)✅ → ⑦ 原生导航栏定稿(1.0.7,标题固定「念时 Life」)✅ → ⑧ 详情页返回修复(1.0.8)✅ → ⑨ 待办体验优化(分组展示 + WS 实时同步)✅ → ⑩ **迭代 A「一念生命周期」H5 已完成 ✅(含按钮失效 bug 修复)** → ⑪ **评审问题修复(2026-08-16:WS 鉴权 / 错误码 1003 重号 / 验证码爆破锁 / N+1 / 硬编码 URL 收敛 / 文档同步)✅** → ⑫ **迭代 B「一念结构化共识」H5 已完成 ✅(讨论流 3→7 类:交通/集合/预算/分工,走附议)** → ⑬ **迭代 C「一念转坚持」H5 已完成 ✅(敲定时再选转期待/转坚持)** → ⑭ **一念回忆资产闭环(2026-08-18:敲定后讨论全程可见 + 珍藏态静态化 + 分享升级为「分享这段经历」)✅** → **下一步:小程序同步迭代 A+B+C(同步前 mp 后台配 WS socket 合法域名)**
shitzman/timesake,main 分支)| 目录 | 内容 | 状态 |
|---|---|---|
app/ | 鸿蒙工程(ArkTS),M1 四页 + v4.2 视觉还原 | 编译通过,待真机验证 |
server/ | Spring Boot 后端(12 表 / 认证·项目·记录·邀请·待办·分享·一念 REST + WebSocket) | 已上线(systemd 常驻) |
h5/ | uni-app(Vue3)H5 端,一套代码复用微信小程序 | 完整版 + 一期迭代 + 迭代二(媒体记录 + 自定义里程碑) 全跑通 ✅;小程序体验版已发布 ✅ |
docs/ | PRD v0.9 / 产品设计 v1.2 / 架构 / API v0.2 / 数据库 / 总览 / 构建部署手册 | 已入库 |
prototype/ | 可交互原型 v4.5 定稿(v4.4 前归档) | 已上线 ✅ |
scripts/ | deploy_h5.sh(H5 构建部署)、deploy_mp.sh(小程序构建+上传)、publish_docs.sh(文档发布,含原型同步) | 可用 |
#FAF4E9、砖红大数字置顶卡、清新冲出版;深色模式(暖棕深色版);字体全用鸿蒙原生、不打包第三方字体完整版(2026-08-07):
一期迭代(2026-08-08 完成):
迭代二(2026-08-11 完成):
project_record.image_url 可空 + content 放开非空 → 支持纯图记录PUT /projects/{id}/milestones,≤5 个,空=清空,仅管理员);天数 ≤ 已坚持天数自动「已颁发」;纪念章页展示(已达成 ★ / 待颁发 ☆ + 进度条)image_url,分享页时间线图文混排 + 大图预览迭代 A「一念生命周期」(2026-08-15 完成,H5):
wish_note/location;新表 wish_participant(seen 看见 / vote 表态 / joined 结果三维留痕)、wish_suggestion(时间/地点/其他建议)、wish_suggestion_support(附议 toggle);敲定后只增不删POST /projects/{id}/vote(表态)、/confirm(采纳敲定,可一键采纳建议写入 target_time/location)、/suggestions(提建议)、/suggestions/{id}/support(附议);创建支持 status=0+wishNote;join 一念分支只留痕「看见」不落正式成员/pages/wish/wish-create,名字+200 字描述+图标+颜色+候选日期/地点多选,第一个候选作默认倾向)、首页「一念 · 等待成行」分区 + FAB 弹层(自定义底部卡片「时光未央 · 念念不忘」)、详情页一念视图(倾向卡/参与档案/讨论区/表态/敲定弹窗)、join 表态引导、分享卡片文案「邀你一起完成这个念头」;封存后详情展示「这一念的旅程」(含未加入者与被采纳建议)(正式视图分支)内部,一念视图(v-if 分支)渲染时弹窗 DOM 不存在 → createInvite 执行成功但弹窗不出现;修复=一念视图拆为独立子组件 wish-view.vue(事件/弹窗自包含)+ 邀请弹窗移到 v-if/v-else 兄弟之外(两视图共用);CDP 实测邀请/敲定/表态全部恢复 ✅docs/spec-iteration-a.md(状态机/表结构/8 接口/5 页面改动/A1-A8 验收)迭代 B「一念结构化共识」(2026-08-17 完成,H5):
wish_suggestion.type 枚举 1-7;新类型复用 content 文本承载,不参与敲定采纳(仅 type 1/2 可采纳)addSuggestion type 校验 1-3 → 1-7;DTO @Max(3) → @Max(7)(编译通过)wish-view.vue 讨论区 7 类型标签(t1-t7 七色)+ 提建议表单(交通快捷 chip 自驾/高铁/飞机/拼车/其他 + 按类型 placeholder)+ 副标题/空状态文案;detail.vue 旅程区补类型标签;建议列表混排不分组(方案 A,类型筛选放后续扩展)docs/spec-iteration-b.md迭代 C「一念转坚持」(2026-08-17 完成,H5):
project.type(1/2) 与 start_time;创建一念 type 存 1 占位,敲定按选择写最终 type;转坚持时 target_time(倾向日期)清空让位 start_timeConfirmRequest 加 type(1/2,默认 1) + startTime;confirm 按 type 填 target_time/start_time,采纳时间建议按 type 分流;转坚持置 p.setType(2) + p.setStartTime(...) + p.setTargetTime(null)(编译通过)wish-view.vue 敲定弹窗顶部加「转期待 ⏳ / 转坚持 🌱」切换卡片,日期 label 随类型变「目标日期 / 开始日期」,doConfirm 按类型传 type + targetTime/startTime,提示语随类型变「成行了 / 开始坚持了」docs/spec-iteration-c.mdTheme.ets 双色板 Token、深浅色自动切换、四页全部接入build_hap.sh)/api/v1/*、WS /ws/projects/{id}?token=(握手鉴权:JWT + 项目权限,2026-08-16 评审 P0 修复)journalctl -u timesake + server.log123456 仅开发期用(一次性、5 分钟有效、60s 限频、连续错 5 次锁 15 分钟,2026-08-16 应用层防爆破)| 概念 | 定案 |
|---|---|
| 重复提醒 | = 提醒推送频率(非统计口径),期待/坚持都有;MVP 仅存储展示,二期接 Push |
| 坚持计时口径 | 自动滚动(如"宝宝出生第 139 天");打卡 = 发记录、不参与连续天数;"连续打卡 N 天"二期做 |
| 期待"已相伴" | 原型示例混入,不做 |
| 纪念章 | 满 30/100/365 天自动 + 自定义里程碑(名称+天数,≤5 个,达天数自动颁发;H5 已实现,2026-08-11) |
| 珍藏(归档) | status 1=进行中 2=已珍藏(修正原 2/3 分法);期待「转为珍藏」/ 坚持「封存纪念」 |
| 坚持封存 | 随时可封存+二次确认;封存即结业、天数冻结于封存日、MVP 不可逆(二期重新开启);纪念章随封存收录(2026-08-08 定案) |
| 分享 | 只读链接、token 可作废;期待/坚持珍藏均可;"引用"二期 |
| 结构化数值 | value_json 预留,MVP 纯文本(二期) |
| 游客模式 | 二期,MVP 登录硬门槛 |
| MVP 红线 | 卡片/实况窗/共享/纪念章 UI 不阻塞最小闭环 |
wx922841a32ab516fd,私钥 /data/miniapp/private.wx922841a32ab516fd.key(不入库)npm run build:mp-weixin → dist/build/mp-weixin(9 页面 + project.config.json)/data/miniapp/ci/,一键脚本 scripts/deploy_mp.sh(upload 版本 描述 上传体验版;默认 robot=1,可用 CI_ROBOT 指定)✓ 已完成 N 项 分隔头 + 已完成区」,勾选完成后不再直接沉底"消失",取消勾选即回到未完成区;② 多人实时同步——新增 utils/ws.ts 封装项目频道 WebSocket(wss://timesake-api.shihesuian.cn/ws/projects/{id}?token=,30s 心跳、指数退避重连、H5/小程序双端分支),详情页 onShow 连接、onHide/onUnload 断开;监听 todo_added/todo_toggled(刷新待办)、record_added/record_deleted/project_updated(刷新详情)、member_joined(刷新伙伴)——双标签实测:A 用户添加/勾选待办,B 用户自动同步join 页原 reLaunch 直达详情会清空页面栈(详情成为根页面 → 原生导航栏无返回箭头 → iOS 左滑直接退出小程序);改为 join 加入成功 → reLaunch 回首页(带 open 参数)→ 首页 onLoad 检测到 open 自动 navigateTo 进详情,详情页返回栈 = [首页, 详情],原生返回箭头与左滑手势恢复navigationBarTitleText,各页独立标题移除);详情页项目名 + 「⋯」移到原生导航栏下方内容区第一行(左项目名、右 ⋯,返回仍用原生箭头);原生导航栏字体为微信系统控制,不可自定义(仅支持黑/白文字色),品牌字体诉求需内容区自定义渲染(当前未采用)setNavigationBarTitle)、返回用原生箭头(页面内 ‹ 移除)、「⋯」留在内容区顶部右侧原位(页面随原生导航栏自然下移后不再与胶囊重叠);各页顶部留白按原生导航栏压缩;H5 端条件编译保持原 custom 设计,零回归(CDP 实测确认)onShareAppMessage 分享卡片(标题「{项目名}邀请你一起守护这段时光」+ 项目背景图,path 直达邀请加入页);进入详情预生成邀请 token(右上角「...」菜单也能分享邀请);邀请弹窗新增「分享给微信好友」按钮(open-type="share",仅 MP-WEIXIN 编译);拉新链路打通:未登录点开分享卡片 → 暂存 token 跳登录页 → 登录/注册成功自动回邀请页加入 → 直达详情页(H5 端 CDP 已实测全链路,H5/小程序共用同一逻辑)wx.login → openid 自动注册/登录),我的页新增「绑定手机号」(未绑定提示 + 验证码弹窗;手机号已注册自动合并账号:项目/成员/记录/邀请/待办/分享归属转移);H5 端条件编译自动剔除(仅小程序端展示)background-image 改为 铺底(小程序不支持远程 URL 背景;加载失败自动隐藏露出渐变兜底)navigationStyle: custom 页面从屏幕顶渲染,右上角自定义按钮必与微信胶囊重叠,需自行用 getMenuButtonBoundingClientRect 按机型避让(状态栏高 + 胶囊宽),且各机型位置不固定;最终方案:小程序端全部改用原生导航栏(pages.json 用 #ifndef MP-WEIXIN 条件编译保留 H5 的 custom),状态栏/胶囊由系统自动处理,零维护成本/usr/bin/node(v18.20.4)可用,.hermes/node 等新版缺 GLIBC 符号直接报错;deploy_mp.sh 内 node 调用须显式 /usr/bin/nodeTIMESAKE_WX_APPID/TIMESAKE_WX_SECRET,敏感值仅存本机 /etc/systemd/system/timesake.service,不入仓库);POST /auth/wx-login 调通 code2session(未配置 5001 → 已配置假 code 5002 → 真机实测);POST /auth/bind-phone 绑定/合并已 curl 全链路验证(测试数据已清理);体验版 1.0.7 已上传,待真机实测一键登录 + 分享卡片 + 原生导航栏wss://timesake-api.shihesuian.cn)② 评审遗留需拍板:重复提醒去留(repeat_rule 空承诺)、「一念讨论≠社交」原则修订、emoji 图标换矢量 + H5 design token ③ 正式发布需提交微信审核deploy_mp.sh upload 出体验版)详情页待办区 + 转珍藏/封存入口(期待/坚持双态演示)+ 首页珍藏分区(两种卡片)+ 只读分享页视图,已随 publish_docs.sh 发布
详见上文「一.3」迭代二小节;后端 DB 迁移 + 里程碑接口 + 分享带图已上线。剩余:分享页媒体版 UI 目视终检(建议手机打开分享链接确认图片显示)
详情页待办/转珍藏/封存/分享/伙伴/置顶/背景/编辑/删除 + 首页珍藏分区 v4.4 + Mine/Medal/Partner 页,见上文「一.4」。剩余:真机验证(需你签名安装)+ 同步迭代二(媒体记录/里程碑)
体验版 1.0.1 起通过 CLI 上传发布,1.0.2 同步迭代二并修复小程序背景图( 组件铺底),1.0.3 上线微信一键登录 + 手机号绑定合并,详见上文「一.7」;后续迭代照常 scripts/deploy_mp.sh upload。注意:脚本内 node 须显式 /usr/bin/node(CentOS 7 兼容)
开机自启 + 崩溃自动拉起 + 生产环境变量注入(server/deploy/timesake.service,详见 build-deploy.md)
aliyun = 阿里云号码认证「短信认证」生产通道(免企业资质/签名/模板),已配置 systemd(TIMESAKE_SMS_TYPE=aliyun,签名「恒创联众」+ 模板 100001),真实发送+核验实测通过;mock 123456 仅开发期用
详见上文「一.3」迭代 A 小节 + docs/spec-iteration-a.md;剩余:小程序同步迭代 A(同步前需在 mp 后台添加 WS socket 合法域名 wss://timesake-api.shihesuian.cn)
一套 uni-app 代码 + 条件编译,迭代 A/B/C 代码已全部就位(pages/wish/wish-create 已注册、wish-view.vue 一念视图含 7 类讨论 + 敲定转期待/坚持、首页一念起分区 + 新建入口、utils/ws.ts 的 MP-WEIXIN 分支、config.ts 统一 URL),零改动即可构建。剩余两步(均需外部环境,本机无法代做):① 微信 mp 后台「开发管理 → 服务器域名」添加 socket 合法域名 wss://timesake-api.shihesuian.cn(否则小程序 WS 连不上);② 服务器执行 bash scripts/deploy_mp.sh upload 1.0.9 "迭代ABC一念同步" 出体验版(附带 H5 待办体验优化)
detail() 对 status≥1 且有一念描述的项目返回一念数据(参与档案/建议/留言);详情页 status=1 显示「当时怎么商量的」区块(只读)、status=2 显示「这一念的旅程」,并补上建议下的留言/回复渲染(嵌套、折叠);参与档案文案按状态区分(status=1「已确认同行 ✓」/ status=2「最终同行 ✓」)update() 封禁珍藏态修改(新错误码 4107 已珍藏的记忆不可修改)GET /share/{token} 新增 wish 字段(一念描述 + 参与档案 + 当时商量的建议/附议/留言嵌套);分享页新增「这一念的旅程」区块,完整讲述这段经历用户拍板方案:倒计时秒级实时跳动 + 操作/留言展示到分钟 + 选择器支持到分钟;范围仅 H5 + 小程序(鸿蒙端另议)。 - ① 倒计时秒级跳动:后端 ProjectDtos 新增 secondsLeft(目标时刻 − now 秒差,期待未珍藏时返回;daysLeft 保留给列表页);hero 副文案每秒 tick——≥1 天「还剩 X 天 X 小时 X 分 X 秒」/ <1 天「X 小时 X 分 X 秒」/ <1 小时「X 分 X 秒」;归零→「就是今天!」;已过→现有逾期态。默认时刻:新建时间选择器默认 08:00(可见可改);00:00 字面化为精确午夜;存量 00:00 老数据由迁移脚本统一改为 08:00 - ② 操作节点绝对时间到分钟:详情 meta「目标/珍藏于/封存于/开始」、旅程起点、待办完成 doneAt 统一「M月D日 HH:mm」(跨年补年份) - ③ 留言混合格式(后端 VO 已有 createdAt,零后端改动):今天→「今天 14:30」/ 昨天→「昨天 21:05」/ 今年→「8月15日 09:12」/ 跨年→「2025-12-31 22:10」;详情页 + 分享页留言/回复都补 - ④ 选择到分钟(4 入口 + 编辑复用):创建页目标/开始日期、一念建议「候选日期」、敲定弹窗「目标/开始日期」——日期 picker + 时间 picker 双联(uni-app 无 datetime 模式),提交 'YYYY-MM-DDTHH:mm:00';后端确认 LocalDateTime 带时分解析 - ⑤ 打卡记录日期 recordDate 保持到日(语义是日历日) - 列表页卡片保持到日(信息密度,详情页才看分钟);编辑弹窗选择器一并升级 - 交付:后端 1 字段 + 解析验证;前端 5 文件(detail/share/create/wish-view/index);双端构建部署 + 实测(目标时刻今晚的项目看秒跳/归零/逾期流转、选择器到分钟、留言格式、存量 00:00→08:00 迁移);status.md 同步 - 实现落点(2026-08-21,本机已验证通过): - 后端 ProjectDtos.ProjectVo + secondsLeft;ProjectService.toVoDetail 计算(仅详情链路 & 进行中期待;列表 toVo 不算秒差,目标时刻按字面秒差);ShareService 分享 project 补 created_at;新增 3 个单测(秒级倒计时/字面时刻秒差/珍藏不返回) - 前端新增 h5/src/utils/time.ts(absTime 操作节点到分钟·按字面时刻、commentTime 留言混合格式、countdownText 秒级文案、parseDateTime/splitDateTime/combineDateTime 日期时间双联工具,默认时刻 08:00) - detail.vue:进行中期待 hero 副文案每秒 tick(服务端秒快照 + 本地自减,onShow/onHide/onUnload 生命周期管理定时器);meta「目标/珍藏于/封存于」与待办 doneAt 到分钟,坚持「开始」只显示日期;「这一念的旅程」补「旅程起点」(= 一念 createdAt)与留言时间;目标当天时刻已到(倒计时归零)也显示「转为珍藏」入口 - wish-view.vue:留言/回复改混合格式;提建议「候选日期」与敲定弹窗「目标/开始日期」日期+时间双联 - create.vue(目标/开始日期)、wish-create.vue(候选日期多选 + 编辑倾向日期)日期+时间双联;share.vue 封存时间/待办完成到分钟 + 旅程起点 + 留言时间 - 本地验证状态(2026-08-21):前端 type-check ✅;build:h5 / build:mp-weixin 与后端 mvn test 在本轮改动后未重跑(沙箱拦截 mvn.cmd),需服务器复核 - 上线待办(服务器按序执行): 1. psql -h 127.0.0.1 -U timesake -d timesake -f scripts/migrate_time_default_0800.sql 迁移存量 00:00→08:00 2. mvn test 复核 13 项单测 3. 部署后端(systemd 重启) 4. deploy_h5.sh + deploy_mp.sh 双端出包 5. 手机实测:秒跳/归零/逾期流转、选择到分钟、留言格式、存量 08:00 迁移、坚持开始只显示日期 - 可选后续(未做):坚持模式创建/编辑表单仍保留时间选择器(默认 08:00)但详情只显示日期,可考虑表单也去时间选择器
在立意不变前提下做更紧凑集中的 UI 升级 + 审美提升 + 操作直觉化。设计稿(高保真多屏原型)与方案文档已发布 hermes-show,手机可预览。 - 发布入口:设计稿 https://hermes-show.shihesuian.cn/timesake-design-v2/design-v2.html | 方案文档 https://hermes-show.shihesuian.cn/timesake-design-v2/index.html | 已索引进 hermes-show 念时栏目顶部;源稿 /root/timesake/docs/design/v2/{design-v2.html,README.md} - 设计主张「一屏一时光」:首页从 6 区块收敛为一条时光主线;核心动作「记这一刻」前置(首页快捷记录条 + 底部中央凸起「+」) - 视觉新令牌(暖墨纸感):米纸底 #F6F1E7 / 米白卡 #FDFBF6 / 暖墨文 #2E2A24 / 陶红主 #B4532A / 鎏金仪 #C19A4B / 苔绿持 #5C7A5A;大数字衬线、圆角 22/16/12、轻双层纸感阴影;页面主题色区分(期待=陶红 / 坚持=苔绿 / 一念=深棕渐变) - 5 屏设计稿:① 首页(焦点卡+快捷记录+期待横滑小卡+坚持紧凑行卡+珍藏横条)② 期待详情(大数字卡+行动条+底部记录坞)③ 坚持详情(苔绿主题+仪式打卡卡+纪念章进度)④ 一念起(表态前置走起/改天/不了+共识头像叠排+建议卡+底部行动坞提建议/敲定成行)⑤ 待办内嵌(详情页区块,非新页面) - 关键交互决策(已拍板/修正): - 待办留详情页不做新页面(2026-08-21 拍板);本轮紧凑化——从「每项独立卡」改「单卡分行列表」:勾选圈 34→26px、行内 11px padding+1px 细分隔、行内添加行贴未完成卡底部、已完成下沉独立卡、细进度条 5px - 坚持行卡不放勾选圈(2026-08-21 修正):坚持是「从某天起自动滚动天数」(PRD 2.4 打卡不参与连续天数、自动滚动不依赖打卡),放假打卡圈误导;焦点卡也去「✓ 打卡」只留「✎ 记这一刻」;分区副标题「今天 1/2」→「2 段在坚持」 - 讨论区:沿用 Reddit 风两层结构(一级留言+二级回复),默认折叠「▸N 条讨论+末条预览」,二级回复轻缩进(贴边竖线+小头像,不右推);修复回复输入框发送按钮溢出(多层 flex min-width:0 + 按钮 white-space:nowrap + 外层 overflow:hidden) - 时间精度落地 UI(沿用 8-20 拍板,见第 13 条):期待详情 hero 秒级倒计时行(等宽数字 tabular-nums)+ 目标/开始时刻到分钟、待办完成到分钟、这一刻/留言混合格式(今天 14:30/昨天 21:05/月日时分/跨年带年份);列表页卡片保持到日 - 待落地(未做,属改代码需另定时机):焦点卡选角逻辑、快捷记录默认落笔项目、emoji 图标换 SVG、按新令牌出一套 H5 design token/CSS 变量、详情页记录坞改造、待办单卡分行 + 时间精度展示接入现有 detail.vue
① 完善确认交互原型 → ② 优先 H5 开发完整版 → ③ 最后同步鸿蒙 app 与微信小程序
systemd 常驻服务已上线(开机自启 + 崩溃拉起),见 build-deploy.md 第二节。
体验版 1.0.1 已通过 miniprogram-ci CLI 上传,微信内可访问(体验成员/扫码)。正式上线需在 mp 后台提交审核 + 配置合法域名。
TIMESAKE_SMS_TYPE=mock | aliyun 切换;aliyun = 阿里云号码认证「短信认证」(无需企业资质/签名/模板,0.06 元/条,发送失败不计费,核验免费)100001(预置)已配置 systemd;TemplateParam 必须传 {"code":"##code##","min":"5"}(##code## 为系统占位符,传 {} 会 InternalError);认证方案名可选(留空用默认);真实短信发送 + 阿里云核验(错误码拒绝)均已实测通过需要你的华为账号走 AGConnect。现在准备,还是等开发完成再启动?