jif2.zhang
|
77e057c580
|
docs(任务): 已归档任务管理界面重设计原型 (待评审, 未改业务代码)
Docker Build and Push / build-image (push) Successful in 1m29s
按评审意见重做「已归档任务」全屏弹层的界面, 产出可交互原型:
docs/V0.2/任务模块/已归档任务管理-原型.html
四点改动:
1. 去掉「类型」过滤 —— 类型是弱维度, 归档场景几乎不按类型检索, 反而占掉一整行;
2. 关键词输入框前加常驻标签「标题」, 框内占位改为「输入关键词」;
3. 归档时间新增快捷预设: 全部 / 本周 / 本月 / 本季度 (+ 自定义才展开日期区间),
选完在下方灰字回显实际区间, 避免"以为选的是整周";
4. 补上「筛选」按钮 —— 原版改任何条件都立即查询且没有确认动作; 改为条件填完一次性提交,
按钮带生效条件数徽标, 另有「重置」。
附带改进:
- 列表上方显示已应用条件标签(可单独 × 撤销) + 命中条数;
- 列表行重排: 标题独占一行, 元信息收成一行(#编号 · 看板列 · 归档于日期),
「恢复/删除」从右侧竖排改到底部右侧横排, 降低行高;
- 空状态区分「还没归档过」与「筛选无结果」, 分别给出下一步提示;
- 类型标签仍在行内展示, 只是不再作为筛选项。
原型为单文件 HTML (无外部依赖), 可交互: 点预设/筛选/恢复/删除均有反馈。
已用无头浏览器验证: 无 JS 错误, 本周预设算出 2026-10-26~2026-10-28, 筛选命中条数正确。
业务代码未改动, 等待评审确认后再落地。
|
2026-10-28 09:51:00 +08:00 |
|
jif2.zhang
|
75cabe8339
|
fix(任务): 修复归档/恢复归档报 "Cannot access 'a' before initialization"
根因: api/task.js 的 archive / unarchive 里写了 `const now = now()`。
同一函数作用域内的 `const now` 会遮蔽模块级的 now 函数, 而初始化表达式的右侧
在求值时该 const 正处于 TDZ, 于是抛 ReferenceError。
源码里报错信息是 "Cannot access 'now' before initialization",
经 vite 压缩后变量被重命名为单字母, 用户端看到的就是 "Cannt access 'a' before i"。
影响: 点「归档」确认后必然失败 (弹错误框); 恢复归档同理。删除/编辑不受影响。
修复: 局部变量改名为 ts, 并补注释避免后人再写回同名。
验证 (真实 Windows 外壳 + CDP 走 UI):
- 点任务行 ⋯ → 归档 → 确认: 无异常, 行从列表消失, 任务数减少;
- 服务端确认已落库: archived=t / archivedAt / archiveSource=manual;
- 测试数据已还原 (archived=f)。
顺带全仓搜索 `const X = X()` 自遮蔽写法, 仅这两处, 无其它同类隐患。
|
2026-10-28 09:45:43 +08:00 |
|
jif2.zhang
|
58879024a2
|
docs+feat(即时同步): 实测端到端 1~2s 达标; 补回滚开关; 订正两次错误排查结论
Docker Build and Push / build-image (push) Successful in 1m26s
一、结论订正 (第二次, 前两次均被测量方式误导)
初次把 ~14s 延迟归因于 nginx 未关 proxy_buffering —— 实测被推翻:
加了 proxy_buffering off / proxy_read_timeout 1h 并热重载, nginx -T 确认生效, 延迟毫无变化。
(该配置已回滚: advanced_config 清空、生效 conf 还原、nginx 已重载。保留它反而会让 OTA 大包
下载失去缓冲保护, 属净负收益。)
随后把 ~15-30s 延迟归因于客户端 db.watch/渲染滞后 —— 同样被推翻:
错误在于测量方法, 用 CDP 反复读 document.body.innerText (长列表页开销大) 去轮询,
且把 ssh + docker exec 的 ~6s 开销算进了延迟。
改为**页面内自计时**后 (50ms 轮询本地库 + MutationObserver 观察 DOM, 各自记录 performance.now),
一次干净测量的结果:
- psql 命令总耗时 (ssh + docker exec + UPDATE): 2138ms
- 数据出现在客户端本地库: 2251ms (≈ 命令返回后 113ms)
- 界面更新: 2580ms
- 同步数据到达 -> 渲染完成: 329ms
即端到端约 1~2s, 其中 UI 渲染只占 ~0.33s, useDbSignal 的表级 watch 工作正常,
无需改用 useQuery。服务端侧的 powersync 日志也一致 (checkpoint_complete 与改库同一秒,
stream_ms 达 42 分钟、close_reason: client closing stream, 长连接稳定)。
二、补回滚开关
文档验收标准里的"回滚开关"此前并未实现。useDbSignal 现在读取
localStorage['iboard_realtime'] === '0' 时完全不订阅, 退回手动刷新,
用于线上出问题时的快速止损 (重启应用生效)。
三、文档
§7.0 改为"端到端约 1~2s (达标)", 写入可复现的页面内自计时测量方法,
并留档两次被推翻的结论及各自错因, 避免后人重复踩坑。§6.2 验收标准同步更新。
|
2026-10-27 22:20:53 +08:00 |
|
jif2.zhang
|
96f4e09bd5
|
docs(即时同步): 订正延迟排查结论 —— 不是 nginx 缓冲, 瓶颈在客户端应用/渲染段
Docker Build and Push / build-image (push) Successful in 1m28s
上一版文档把 ~14s 延迟归因于 nginx 未关闭 proxy_buffering, 实测推翻了该判断:
- 已为 iboard.honor3.com 配置 proxy_buffering off / proxy_read_timeout 1h 并热重载,
nginx -T 确认生效, 但端到端延迟无任何改善;
- powersync 服务日志 (docker logs -t): 改库与服务端 checkpoint_complete 几乎同一秒
(13:46:53.738), 另一次约 6s —— 服务端推送很快;
- 同步流是长连接 (stream_ms 达 42 分钟, close_reason: client closing stream), 非频繁重连;
- 临时把 db 挂到 window.__psdb 轮询: 数据确实已写入客户端本地库, 但 DOM 更新明显滞后。
结论修正为: 瓶颈在客户端「同步数据应用 → db.watch 通知 → React 渲染」这一段,
延迟 15~30s 且波动 (1s/6s/17s/27s), 更像排队或重试退避。文档补充了下一步排查方向。
nginx 那组配置未回滚: 对长连接流式接口属合理配置, 且已验证不影响其它站点。
|
2026-10-27 21:54:20 +08:00 |
|
jif2.zhang
|
fd4079c9c3
|
feat(任务): 即时同步 —— 订阅本地库变更, 跨端改动无需切页自动刷新
Docker Build and Push / build-image (push) Failing after 1m48s
现象: 多端同时打开同一项目时, 一端改完, 另一端必须切到别的页面再切回来才更新。
根因: 不是同步没到, 而是 UI 从未订阅本地库变化 ——
PowerSync 的下行推送 (PG 逻辑复制 → sync service → 客户端本地 SQLite) 本身正常,
但任务模块的读全是命令式 db().getAll() (api/task.js), 读完不再看;
lib/powersync/react.jsx 虽然导出了 useQuery/useStatus, 全项目一次都没用过;
TaskPage/ProjectView 只在 useEffect 里 load() 一次, 连 useRefreshOnVisible 都没接
(只有打卡与宏观页面在用)。「切面板能刷新」纯粹是因为组件重新挂载又 load 了一次。
实现 (docs/V0.2/离线编辑模块/即时同步方案.md, 方案 C):
- 新增 lib/powersync/useDbSignal.js: 用 db.watch() 的表级过滤 (tables) + 节流
(throttleMs) + AbortSignal, 订阅本地库变更; 跳过订阅时的首次通知, 避免与
挂载时的 load() 重复。
(初版设计是手写 count/sum/max(updatedAt) 的「信号 SQL」, 实施时发现 SDK 原生
支持 tables 过滤, 更可靠, 已改为表过滤并在文档中记录变更。)
- api/task.js 新增 TASK_TABLES / PROJECT_TABLES 常量 (表名须与客户端 schema 一致)。
- ProjectView: 订阅任务域 (Task/BoardColumn/TaskMember/TaskTag) → 重算;
TaskPage: 订阅项目域 (Project/ProjectMember) → 重算。
- 不打断操作: BoardView/ListView 上报 onDragActiveChange, 拖拽期间收到变更只记
pending, 松手后补一次刷新, 避免卡片在手指下跳位。
- 回前台兜底: 两页都接 useRefreshOnVisible (WebView 后台可能节流订阅回调)。
验证 (真实 Windows 外壳 + CDP, 服务端直接改库模拟另一端):
- 服务端改任务标题后, 页面在**无任何操作**的情况下自动更新 (三次复测均成功);
- 改回原标题后同样自动还原; 测试数据已恢复。
已知瓶颈 (不在 UI 层, 另见文档 §7.0):
- 实测端到端延迟约 13~14s, 未达 ≤1s 目标;
- CDP Network 观察客户端: 无 WebSocket, 仅 /sync/stream 长连接;
- NPM (baishe nginx-app-1, proxy_host/5.conf) 未关闭 proxy_buffering,
流式响应被 nginx 缓冲后按批下发, 与观测到的固定批次延迟吻合;
- 修复属运维配置 (proxy_buffering off 等), 需单独评估后执行。
|
2026-10-27 20:57:05 +08:00 |
|
jif2.zhang
|
86335dfaa4
|
fix(离线库): 关闭 PowerSync 多标签共享 worker —— 修复 Windows 升级后任务页永久「加载中」
Docker Build and Push / build-image (push) Successful in 1m30s
现象: Windows 外壳 OTA 升级后, 任务页一直「加载中」; 其它不访问本地库的页面正常。
Android 正常。仅「原地升级/reload 之后」出现, 全新启动进程则正常。
根因: PowerSync Web 的 enableMultiTabs 默认在桌面端开启 (有 SharedWorker 时),
开启后会额外用 **共享 IndexedDB worker** 承载本地库。该 SharedWorker 跨页面 reload
存活, OTA applyUpdate 后 location.reload() 的新页面连上去时, 本地库读取永久挂起
—— 无异常、纯 pending, 所以 TaskPage 的 projects 一直是 null, 停在「加载中…」。
Android WebView 不支持 SharedWorker, 走独立 worker (随页面销毁), 因此不受影响。
实测 (真实 Windows 外壳 + WebView2 CDP):
- 修复前: 目标页 /me 正常; Page.reload 后落到 /task 显示「加载中…」, 再导航仍卡住;
shared_worker 目标仍在 (worker-*.js 前后同 URL)。
- 修复后: reload 后 /task 正常渲染 25 个任务; shared_worker 目标消失;
控制台仅剩 PowerSync「未启用多标签」提示。
修复: database.enableMultiTabs = false。本应用是单窗口外壳 (dock.html 不访问本地库),
不需要多标签同步; 该选项关闭后本地库改用随页面销毁的独立 worker, reload 干净。
注: 该问题与 OTA 包内容无关 (同一个包全新启动正常), 属 reload 路径的运行时缺陷。
|
2026-10-27 19:56:25 +08:00 |
|
jif2.zhang
|
a23b10959c
|
fix(同步): 上传路径补上 Task.status 与 Project.icon —— 此前静默丢弃
Docker Build and Push / build-image (push) Successful in 1m35s
现象: 任务点完成后被自动移入 Done 分组, 但详情页状态仍是「未开始」。
根因: /api/powersync/upload 的 **更新分支** 漏了 status 字段 ——
Task 更新分支逐个处理了 title/description/kind/markDate/extras/sortOrder/
assigneeId/doneAt/archived*/columnId/parentId, 唯独没有 d.status
(离线新建分支是处理了的, 所以只有"改已有任务"这条路丢状态)。
客户端 api/task.js 本地写入时 status 与 columnId 是一起算、一起写的
(改状态会按列绑定归位到 Done 列), connector 上行回读整行, 所以 payload 里
status 一定存在 —— 是服务端 prisma.task.update 时没把它放进 data。
结果: 列变更落地、状态被丢弃; 下行同步以服务端为权威, 又把本地 status 覆盖
回去, 于是"看板在 Done、详情未开始"。
数据实证 (生产 PG): 9 条顶层任务处于 Done 列 (boundStatus=done) 但 status
非 done (8 条 todo + 1 条 doing), 且全部 doneAt 有值; 反向 (status=done 却
不在 done 列) 0 条 —— 单向故障, 排除下行覆盖/并发冲突。这 9 条的 columnId 与
doneAt 在同一个 update 里都写成功了, 唯独 status 没有, 只可能是它压根没进 data。
修复 (稳妥方案, 复用唯一口径):
- resolveStatus.js 新增 resolveTaskUpload(): 客户端上行的是**本地整行**, 字段
总是存在, 不能用"字段是否存在"判断变更, 必须先与服务端现值比较, 再交给
resolveTaskWrite 裁决。不这样做会踩 T-BD-16: 任务从 Plan 拖到未绑定状态的
Action 列时, 整行里 status 仍是 todo, 若当作"本次变更"提交, 场景 B 会把任务
从 Action 归位回 Plan (拖过去又被弹回来)。
- powersync.js Task 更新分支改为调用 resolveTaskUpload, 并把 task.column 与
columnId 一起指向目标列 (否则场景 B 会拿旧列判断, 同样误归位);
doneAt 与最终状态保持一致 (进入 done 记时 / 离开 done 清空, 口径同 REST)。
- Project 更新分支补 icon (客户端本地写了 icon, 服务端同样丢弃), 校验口径与
REST 写接口一致: 必须 data:image/ 前缀, 长度 <= 300_000。
- 上传处理器新增按项目缓存的 loadColumns (ops 已按表序排列, BoardColumn 先于
Task 落地, 故 Task 阶段读到的列是本批次最终结果)。
用例 (10 项, 含关键回归与旧思路对照):
仅换列到未绑定列保持列与状态 / 换列到绑定列状态跟随 / 仅改状态归位 /
无变化返回 null / 脏数据自愈 / 子任务豁免 / 无匹配列不移动 /
对照证明旧思路会把 Action 里的任务弹回 Plan。
存量脏数据 (9 条) 需另行订正为 done, 不在本提交内。
|
2026-10-27 17:28:38 +08:00 |
|
jif2.zhang
|
c460f09821
|
chore(dev): 新增 Windows 本地实时预览脚本 win:dev (不打包)
Docker Build and Push / build-image (push) Successful in 2m31s
改完前端 UI 想立刻在 Windows 外壳里看效果, 原本要 tauri build 打包。实际外壳
用 tauri-plugin-hotswap, 启动时优先读 %APPDATA%\<identifier>\hotswap\ 下的覆盖
包, 没有才回退 exe 内置 dist —— 与线上 OTA 同一条路径。因此只构建前端并写进
覆盖目录 + 重启外壳即可, 不编译 Rust、不打 NSIS/便携包、不重装。
npm run win:dev 构建(shell 模式) + 挂载 + 重启
npm run win:dev -- --no-build 复用现有 dist, 只挂载+重启 (~2s)
npm run win:dev -- --clear 卸载覆盖, 回到内置前端
npm run win:dev -- --no-launch 只改覆盖目录, 不碰外壳进程
读插件源码得到的两个硬约束 (写错会被静默丢弃或启动即回滚), 脚本已处理:
- min_binary_version 必须 == 外壳版本: 默认 DiscardOnUpgrade 在 binary > min 时
丢弃缓存, 而安全线又要求 binary >= min, 只能取等号;
- confirmed 必须为 true: 默认 SingleLaunch 对未确认版本启动即回滚。
另: 目录名须为 seq-<数字>; sequence 取 Date.now() 让 OTA 检查认为已是最新,
避免线上更新顶掉本地版本。
README 补「Windows 本地实时预览(不打包)」章节: 用法/原理/约束表/注意事项。
|
2026-10-27 15:49:39 +08:00 |
|
jif2.zhang
|
1d800c536e
|
feat(任务): 详情页编号右置到副标题行、换列后自动收起、固定头尾滚动
- 完整任务编号从标题下方独立一行, 移到「看板列 · 状态」同一行右侧
(左侧可省略号截断, 编号 flex-shrink:0 不被挤压)
- 切换看板列后 ActionSheet 未收起: 补 handler.close?.(), 且放在 onAction
最前 (选中即收, 不等接口返回), 与项目视图 ⋯ 菜单同口径
- 滚动优化: 原整个弹层是一个滚动容器, 标题与保存按钮都会随内容滚走。
改为三段式弹性布局 —— .td-head 固定 / .td-body 唯一滚动区 /
.td-foot 固定 (保存按钮), 键盘弹出时底部随 kb 上抬
验证: 390x720 矮屏渲染真实 TaskDetail (14 条子任务撑出溢出), 11 项断言通过 ——
主体 scrollH 1531 > clientH 465; 滚动 1066px 到底后头部 top 86->86、
底部 top 657->657 均不变; 保存按钮 bottom 708 <= 720 始终在屏内;
头+体+底高度之和等于弹层总高 (无重叠/无空隙)。
|
2026-10-27 15:49:06 +08:00 |
|
jif2.zhang
|
0fc45aa6ec
|
feat(打卡): 日历日期标记改为比例环, 并移除无引用死代码
日期标记 (F-CL-06): 旧实现是只按状态上色的 4px 圆点, 看不出完成度 ——
3/5 与 5/5 是同一个绿点。改为环形进度, 弧长 = 当天完成比例:
expected = 0 -> 不画环 (当天没有应打卡项)
expected > 0, 0 次 -> 空心环 (未开始)
部分完成 -> 弧长按比例 (半填充)
达标 / 超额 -> 整圈 (实心; 超额换色区分)
未来日期不画环 (计划 != 未完成); 选中日改用白环, 弧长仍表完成度;
「本月完成率」右侧补图例。
- 新增 components/checkin/DayRing.jsx (共享环形标记, 颜色交由 CSS 按视图上色)
- MergedView 日历格子接入该环
- 删除无引用死代码: pages/checkin/CalendarView.jsx (173 行) 与
HabitView.jsx (338 行) —— V0.2.1 合并「打卡/日历」tab 后遗留, 全库扫描确认
无任何 import/动态 import 引用; 连带清理仅服务于它们的 CSS
(保留仍被 ListView 使用的 .habit-link)
验证: 桩 fetch 渲染真实 MergedView, 15 项断言通过 —— 空心环 / 弧长 25%·50%
精确匹配 / 整圈 / 三态配色 / 未来不画环 / 选中日白弧 60% / 图例 / 旧圆点已移除。
|
2026-10-27 15:48:14 +08:00 |
|
jif2.zhang
|
32f404ac90
|
fix(任务): 修复列表与看板拖拽「能触发但放不下」—— uuid 主键被 Number() 成 NaN
Docker Build and Push / build-image (push) Successful in 1m34s
0.2.1 切本地库后 Task.id / BoardColumn.id 为 uuid 字符串, 拖拽落点却用
Number(dataset.xxxId) 取值得到 NaN:
- 看板 hitColumn 返回 NaN -> NaN 为 falsy, onDrop 永不触发; 目标列也不高亮
- 列表 colId/taskId 为 NaN -> 组内命中与换列 findIndex 恒失败, 松手无操作
(打卡侧仍走 REST 数字 id, 故未受影响)
- 新增 src/pages/task/ids.js: idStr / sameId / datasetId, 统一按字符串比对
- useColumnDrag / useRowDrag: 落点、组内命中、换列、提交判定改用 sameId
- ProjectView: moveToColumn / reorderTask / changeStatus 改用 sameId,
落点为空直接忽略, 不把坏 id 写进本地库
- api/task.js: update 拦截 "NaN"/"undefined" 列 id, 报「看板列无效」
验证: headless Edge + CDP 派发真实指针事件驱动两个 hook (uuid 数据),
修复前 4 条落点断言全挂, 修复后全部通过。
|
2026-10-27 10:06:37 +08:00 |
|
jif2.zhang
|
06e9a3e694
|
fix(任务): 编号改为 #序号展示、详情页完整编号可复制、修复详情改列报「看板列不存在」
- 列表/看板任务编号徽标改为 `#序号`(如 #18), 移除不再需要的 codePrefix 透传
- 详情页标题下新增完整任务编号胶囊 (项目编号-序号, 如 ADMIN-18), 点按复制:
Clipboard API 优先, 非安全上下文/旧 WebView 回退 execCommand, 并提示已复制
- 修复详情页「看板列」切换报错: 0.2.1 本地库列 id 为 uuid 字符串,
ActionSheet 的 key 恒为字符串, 旧代码 Number(key) 得到 NaN ->
update 校验失败抛「看板列不存在」。改为字符串比对 (currentCol/勾选标记同步)
- 详情页保存后先就地替换该行再回源刷新
|
2026-10-27 10:06:12 +08:00 |
|
jif2.zhang
|
317072539d
|
docs(0.2.1): 记录 OTA 链路打通与遗留清单实测数据
Docker Build and Push / build-image (push) Successful in 1m27s
|
2026-10-27 08:12:54 +08:00 |
|
jif2.zhang
|
08dd766886
|
fix(ci): OTA 包写入路径对齐 compose 挂载点 (deploy/prod/data/ota)
Docker Build and Push / build-image (push) Successful in 1m26s
|
2026-10-27 08:12:12 +08:00 |
|
jif2.zhang
|
c9477b562e
|
ci(ota): 新增 OTA 包同步步骤 —— 用 docker cp 经 bind-mount 容器写入宿主 data/ota
Docker Build and Push / build-image (push) Successful in 1m27s
|
2026-10-27 08:09:00 +08:00 |
|
jif2.zhang
|
50283269fb
|
fix(ota): 生产 app 挂载宿主 data/ota 为 OTA 包目录 (此前镜像内为空, 线上 OTA 不可用)
Docker Build and Push / build-image (push) Successful in 1m14s
|
2026-10-27 08:06:05 +08:00 |
|
jif2.zhang
|
04bc48b6a7
|
fix(ota): OTA_MIN_BINARY 提到 0.2.1 —— 旧外壳 CSP 不含新域名, 拉新前端会白屏; 补充遗留清单与外壳升级策略
Docker Build and Push / build-image (push) Successful in 1m16s
|
2026-10-27 07:52:25 +08:00 |
|
jif2.zhang
|
702c8daf6c
|
docs(0.2.1): 记录发布结果 —— master CI 10/10、Android 16/16、Windows 打包通过
Docker Build and Push / build-image (push) Successful in 1m18s
|
2026-10-27 07:30:30 +08:00 |
|
jif2.zhang
|
a1c267b0d4
|
feat(0.2.1): 生产切换完成 —— 单端口上线 (3001 + 内网 PG/PowerSync), 迁移 MySQL 全量数据, 补 uuid 镜像触发器
Docker Build and Push / build-image (push) Successful in 2m14s
|
2026-10-27 07:26:47 +08:00 |
|
jif2.zhang
|
836035f4cd
|
docs(0.2.1): 新增 021任务.md —— 目标/现状/卡点/待确认信息速查
|
2026-10-27 07:08:04 +08:00 |
|
jif2.zhang
|
b29be62747
|
fix(deps): dev-0.2 同步 package-lock (tauri CLI 2.12.4), 修复镜像构建 npm ci 失败
|
2026-10-26 22:53:46 +08:00 |
|
jif2.zhang
|
a9dc632986
|
chore(deploy): 生产 compose 增加 app 构建段 (服务器 buildKit 仅 compose 可用)
|
2026-10-26 22:52:27 +08:00 |
|
jif2.zhang
|
cc2677ce06
|
chore(deploy): 生产 compose 支持 HOST_PORT 变量 (灰度验证时先用备用端口)
|
2026-10-26 22:18:31 +08:00 |
|
jif2.zhang
|
71dcf7e1b1
|
ci(0.2.1): 部署段改为调用宿主 /app/iboard-prod 部署脚本 —— 无 PG secrets 时跳过自动部署
|
2026-10-26 22:18:14 +08:00 |
|
jif2.zhang
|
30bc489b5c
|
feat(0.2.1): 单端口生产架构 —— /sync 同域反代 (去掉 13002 独立同步端口), 新增 deploy/prod 生产编排
|
2026-10-26 21:57:40 +08:00 |
|
jif2.zhang
|
4b19d1d929
|
chore: artifacts 打包产物不入库
|
2026-10-26 21:22:57 +08:00 |
|
jif2.zhang
|
921f3496ea
|
chore(0.2.1): OTA 基址切正式域名 https://iboard.honor3.com
|
2026-10-26 21:22:49 +08:00 |
|
jif2.zhang
|
7234b4b40a
|
chore: 忽略 .esbuild-tmp 临时目录
|
2026-10-26 20:53:46 +08:00 |
|
jif2.zhang
|
eef296942f
|
feat(0.2.1): 合并 Windows 外壳 + 离线编辑, 版本 0.2.1, 正式域名 https://iboard.honor3.com
|
2026-10-26 20:53:38 +08:00 |
|
jif2.zhang
|
e689e44923
|
Merge branch 'dev-0.2.1' into dev-0.2
# Conflicts:
# generated/prisma/internal/class.ts
# generated/prisma/internal/prismaNamespace.ts
# generated/prisma/internal/prismaNamespaceBrowser.ts
# generated/prisma/models/BoardColumn.ts
# generated/prisma/models/Project.ts
# generated/prisma/models/ProjectMember.ts
# generated/prisma/models/Task.ts
# generated/prisma/models/TaskMember.ts
# generated/prisma/models/TaskTag.ts
# generated/prisma/models/User.ts
# server/routes/projects.js
# server/routes/tasks.js
# src/api/task.js
|
2026-10-26 20:46:25 +08:00 |
|
jif2.zhang
|
fc23919a4e
|
chore(prisma): 补齐 generated 任务模块模型 (Project/Task/BoardColumn 等 6 个), 与 schema 对齐
|
2026-10-26 20:42:05 +08:00 |
|
jif2.zhang
|
f34c8c3bae
|
feat(离线): 界面离线可看 —— GET 响应本地缓存 + 同步凭证持久化 (离线不清库) + 左上角离线徽标 (与 Windows 外壳分支同源)
|
2026-10-26 16:05:59 +08:00 |
|
jif2.zhang
|
9f16db4286
|
feat(0.2.1): 同步端点支持 VITE_POWERSYNC_URL 覆写 (Tauri 外壳等打包端按需指定)
|
2026-10-26 08:58:37 +08:00 |
|
jif2.zhang
|
fd029ad124
|
fix(0.2.1): PowerSync 升级 v2 线 (web 2.5.0 + react 2.1.0 + wa-sqlite 2.0.8) —— 1.39.1 与自动装配的 wa-sqlite 1.7.2 不兼容 (缺 sqlite3_prepare_v3)
|
2026-10-26 02:24:49 +08:00 |
|
jif2.zhang
|
e963140bf9
|
feat(0.2.1): TLS 前置 13443 —— PowerSync 网页端必须安全上下文 (navigator.locks), 自签证书按路径分流 app/sync
|
2026-10-26 01:59:31 +08:00 |
|
jif2.zhang
|
533a05832e
|
fix(0.2.1): crypto.randomUUID 仅安全上下文可用 —— http 明文部署下用 getRandomValues 兜底生成 uuid
|
2026-10-26 01:52:38 +08:00 |
|
jif2.zhang
|
086f7aecf9
|
fix(0.2.1): 验证脚本依赖移出 package.json (dev-only 工具不进镜像), 锁文件同步
|
2026-10-26 01:42:17 +08:00 |
|
jif2.zhang
|
1edf57b75d
|
fix(0.2.1): 运行时镜像 npm ci 加 --omit=optional (跳过 devOptional 的 better-sqlite3, 免 node-gyp)
|
2026-10-26 01:40:38 +08:00 |
|
jif2.zhang
|
4ce701e99a
|
feat(0.2.1): M5 闭环验证通过 —— verify 脚本 7 步全绿 (下行/离线写/上行/定号/回填/REST确认/删除同步); 方案文档补 Sequential ID Mapping
|
2026-10-26 01:37:24 +08:00 |
|
jif2.zhang
|
8813766aff
|
fix(0.2.1): 镜像列 Prisma 侧可空 (库级 NOT NULL, 触发器填充), 避免 create 校验拦截
|
2026-10-26 01:27:46 +08:00 |
|
jif2.zhang
|
aca8a05c0f
|
feat(0.2.1): Sequential ID Mapping —— 外键 uuid 镜像列+触发器, 同步流改 uuid 主键 (离线行回填后本地 id 稳定), 客户端零改动
|
2026-10-26 01:21:40 +08:00 |
|
jif2.zhang
|
9caaa303e5
|
fix(0.2.1): upload 契约对齐客户端 —— 外键列即父行 uuid (projectId/columnId/parentId/taskId); 附 Node 闭环验证脚本
|
2026-10-26 01:14:34 +08:00 |
|
jif2.zhang
|
a714013e3e
|
feat(0.2.1): M3 前端接入 —— PowerSyncProvider/登录连接/登出清库, 任务模块数据层切本地库 (projectApi/columnApi/taskApi 本地实现, 离线读写+自动上行), 任务编号徽标展示
|
2026-10-26 00:41:51 +08:00 |
|
jif2.zhang
|
1a695920ce
|
fix(0.2.1): ETL 按目标 PG 列白名单取数 + boolean/bigint/json 类型感知转换 (现网库 schema 领先于本分支)
|
2026-10-26 00:29:08 +08:00 |
|
jif2.zhang
|
025fcc3244
|
feat(0.2.1): M4-b ETL —— 现网 MariaDB 只读快照导入 PG (uuid/code/number 回填, 时序表限量, 序列校准)
|
2026-10-26 00:27:20 +08:00 |
|
jif2.zhang
|
636e566657
|
fix(0.2.1): initdb 增加 powersync publication (服务不自建, PSYNC_S1141)
|
2026-10-26 00:21:00 +08:00 |
|
jif2.zhang
|
040d560aff
|
fix(0.2.1): !env 为 YAML 整值标签 —— URI 由 compose 组装后整值注入 (PS_SOURCE_URI/PS_STORAGE_URI)
|
2026-10-26 00:19:18 +08:00 |
|
jif2.zhang
|
a4af607c41
|
feat(0.2.1): M3 前端 PowerSync 基础 (schema/connector/db) + 依赖; fix storage sslmode
|
2026-10-26 00:07:33 +08:00 |
|
jif2.zhang
|
a386660833
|
fix(0.2.1): compose build context 修正为 ../.. (仓库根)
|
2026-10-26 00:00:18 +08:00 |
|
jif2.zhang
|
034c87f955
|
feat(0.2.1): M4-a 部署栈 —— compose(PG逻辑复制+powersync+app:13001), sync streams(任务域6表+User), initdb, DISABLE_CRON 开关, 健康检查端口跟随 PORT
|
2026-10-25 23:57:51 +08:00 |
|
jif2.zhang
|
f83deefa47
|
feat(V0.2): 视图切换移入项目栏 —— 紧凑段控 + 按钮收纳 (按设计稿)
Docker Build and Push / build-image (push) Successful in 1m5s
- 项目栏一行: 项目名(省略) + 列表/看板紧凑段控(vseg 26px) + 已归档/管理/+新增
- 「项目管理」文案收窄为「管理」, mini-btn 内边距收窄
- 移除原 .pv-head 大段控; 视图记忆逻辑不变 (T-VW-02/03)
|
2026-10-25 23:51:09 +08:00 |
|
jif2.zhang
|
a4ab22588c
|
feat(0.2.1): M2 服务端同步接入 —— /api/powersync token+upload 幂等上行, 项目/任务/拷贝链路接入 uuid 与编号分配 (identity 助手)
|
2026-10-25 23:49:09 +08:00 |
|
jif2.zhang
|
61d3028909
|
feat(0.2.1): M1 数据库迁移 PostgreSQL —— schema 切 pg, 任务域六表加 uuid, 项目 code/任务 number, db.js 切 adapter-pg, 重建 PG 基线迁移; 附实施方案文档
|
2026-10-25 23:38:54 +08:00 |
|
jif2.zhang
|
368e99a380
|
feat(任务模块): 任务归档 T-ARC-01~08 实现
Docker Build and Push / build-image (push) Successful in 1m27s
- 数据: Project.autoArchive + Task.archived/archivedAt/archiveSource,
迁移 20261026000000_task_archive (两索引)
- 领域: server/task-domain/archive.js —— hiddenAtOf 与保留口径精确同源,
autoArchiveDue 到期判定, runAutoArchiveForProject (读时惰性) +
runAutoArchiveSweep (每小时 cron 兜底)
- 接口: POST /tasks/:id/archive|unarchive (连带子任务, 幂等);
GET /projects/:id/tasks/archived (keyword/kind/columnId/from/to 过滤,
archivedAt+id 游标分页); 项目 PUT 收 autoArchive (枚举校验);
主列表/子任务/项目 taskCount 全部排除归档
- 前端: ⋯ 菜单「归档」(确认含子任务条数); 项目栏「已归档」入口 →
ArchivedTasks 弹层 (关键词/类型/列/归档时段过滤 + 加载更多 + 恢复/删除);
项目管理「归档设置」四档 Picker
|
2026-10-25 23:09:52 +08:00 |
|
jif2.zhang
|
39282b9633
|
docs(任务模块): 任务归档 T-ARC 需求与设计 (T-ARC-01~08)
- 需求文档 §3.15: 手动归档(⋯菜单+连带子任务)/自动归档(项目级档位
3天/一周/一月/永不)/归档排除/游标分页大量查询/恢复/彻底删除/配置入口/权限
- 功能设计 §15: Project.autoArchive + Task.archived/archivedAt/archiveSource、
归档/恢复/归档查询 API、自动归档双保险执行(读时惰性+小时cron)、
边界处理; 覆盖自检表更新为 157 条
- 数据库设计: Project 补 notes/taskKinds/icon/autoArchive 字段,
Task 补归档三字段与两索引, 迁移清单标注 20261026000000_task_archive 待实施
|
2026-10-25 22:59:08 +08:00 |
|
jif2.zhang
|
7f213b5c9e
|
style(V0.2): 看板列滚动条右移进列间隙, 不再压住任务卡片右沿
|
2026-10-25 22:39:00 +08:00 |
|
jif2.zhang
|
a4cc4e9871
|
docs: 日常操作规则 —— 主目录默认 dev-0.2, 发布才切 master 推送后即回
|
2026-10-25 22:33:53 +08:00 |
|
jif2.zhang
|
1cd5b85a4b
|
Merge remote-tracking branch 'origin/master' into dev-0.2
Docker Build and Push / build-image (push) Successful in 1m6s
# Conflicts:
# CHANGELOG.md
|
2026-10-25 21:59:52 +08:00 |
|
jif2.zhang
|
8203a7f893
|
fix(V0.2): 版本规则收尾 —— 手动 OTA 工作流对齐发布说明/commit 口径
Docker Build and Push / build-image (push) Successful in 1m1s
- ota-build.yml: notes 默认取检出 commit 的 message, --commit 写入
manifest (与 docker-build 一致); 参数加引号防空格断裂
- docker-build.yml: 去掉 head -c 400 字节截断 (会把多字节汉字切成
非法 UTF-8 导致 latest.json 解析失败), 截断统一由打包脚本按字符处理
- build-ota.mjs: CI 日志输出 build_id 与 commit
|
2026-10-25 21:40:13 +08:00 |
|
jif2.zhang
|
0f71323c11
|
docs: CHANGELOG 按程序/Android外壳/Windows外壳 三部分独立记录当前值与变更
Docker Build and Push / build-image (push) Successful in 1m2s
|
2026-10-25 21:36:01 +08:00 |
|
jif2.zhang
|
93b7c7bb0a
|
docs(changelog): 记录 V0.2.1 —— 主要解决离线编辑与不同终端数据合并问题
|
2026-10-25 21:34:17 +08:00 |
|
jif2.zhang
|
67be8d8f7b
|
feat(V0.2): 版本方案落地 —— 前端/外壳解绑, build 标识统一, 外壳版本展示
Docker Build and Push / build-image (push) Successful in 1m5s
- check-version: 分组校验 (前端 package.json / 外壳 tauri.conf+Cargo),
两组不再要求相等; 分支前缀校验只针对前端版本
- build-ota: build_id 改为 YYYYMMDDHHmmss (北京时间, 与前端 BUILD_ID
同格式); sequence 保持毫秒仅用于判新
- 我的页: 当前版本恢复 v0.2.0 · build <原始BUILD_ID>; 新版本附 OTA
build_id; 底部替换为外壳版本 (Tauri getVersion, Web 端 —)
- README: 合并遗留 readme 全部内容并按决议重写版本管理章节;
新增 CHANGELOG.md (PATCH 仅明确提出时自增)
|
2026-10-25 21:28:06 +08:00 |
|
jif2.zhang
|
06aa48f6ad
|
docs: 版本方案 (V0.2) 整理稿 —— 版本构成/分支映射/OTA 口径/PATCH 记录/展示修复清单, 含待确认问题 A-E
Docker Build and Push / build-image (push) Successful in 1m7s
|
2026-10-25 20:46:11 +08:00 |
|
jif2.zhang
|
6bd39aeed2
|
feat(V0.2): 看板列内纵向滚动加固 + 滚动时右缘滚动条 (方案 B)
Docker Build and Push / build-image (push) Successful in 1m6s
- 列体外包 .bcol-main (relative): 叠加自绘细滚动条, 滚动时出现、
停止约 700ms 后淡出, 宽 3px 不占卡片空间
- bcol-body 补 -webkit-overflow-scrolling/overscroll-behavior,
高度链显式化 (height:100%), 修真机列内滚不动的问题
- 列头保持固定不随滚动
|
2026-10-25 18:57:35 +08:00 |
|
jif2.zhang
|
fd66c529c2
|
fix(V0.2): 智能截断去尾部标点; 看板左列收窄; 项目头像三处统一
Docker Build and Push / build-image (push) Successful in 1m7s
- splitTitle: 截断后用 \p{P} 去掉标题尾部连续分隔符 (原字符类重组有
转义坑, 换 Unicode 属性类)
- 看板卡片左列 (状态点+⋯) 收窄至 14px 并负外距悬进卡片内边距
- 项目头像统一: 新增 .pavatar 基类与 projectIcon.colorOfProject,
项目管理预览改用同配色/同圆角/居中首字, 修复灰底与文字歪斜
|
2026-10-25 18:38:16 +08:00 |
|
jif2.zhang
|
cee21a39d9
|
feat(V0.2): 快速添加输入框三行/失焦收起; ⋯菜单点选即收; 项目图标可设图片
Docker Build and Push / build-image (push) Successful in 1m22s
- 快速添加改 3 行 textarea, Enter 创建/Shift+Enter 换行/Esc 关闭,
焦点离开且无内容时自动收起
- 任务 ⋯ ActionSheet 点选动作后 handler.close() 收回菜单
- Project.icon (TEXT data URL, 迁移 20261025130000): 项目管理可选图片,
客户端裁为 96x96 cover JPEG (~15KB); 项目列表/最近项目/管理页图标位
显示图片, 保持原尺寸与圆角; 可恢复默认首字色块
|
2026-10-25 12:02:29 +08:00 |
|
jif2.zhang
|
e3ac00a641
|
fix(V0.2): OTA 发布说明改为 commit message, sha 单独展示; 版本附构建时间
Docker Build and Push / build-image (push) Successful in 1m2s
- CI: notes 取 git log -1 的 commit message (标题+正文, 截断 400 字),
commit sha 经 --commit 写入 manifest (不再把裸 sha 塞进发布说明)
- build-ota: 新增 --commit 参数; latest.json 增加 commit 字段
- 服务端 /ota/check 与 /manifest-web 透传 commit 与 sequence
- 我的页: 当前版本/新版本后附 seq 时间戳 (MM-dd HH:mm),
发布说明下方新增「提交」行显示短 sha
|
2026-10-25 11:56:04 +08:00 |
|
jif2.zhang
|
74e1e7dd13
|
feat(V0.2): 标题30字+智能拆分 / 时间标记 MM-dd / 时间词前缀 (T-TK-14~16)
Docker Build and Push / build-image (push) Successful in 1m25s
- 标题上限收紧至 30 字 (服务端校验+详情编辑框); 快速添加输入框
放宽到 200 字: 超长时在 30 字内分隔符处截断为标题, 完整原文进描述
- Task.markDate (DateTime, 迁移 20261025120000): 详情页 DatePicker
选择/清除, 列表行与看板卡显示 MM-dd 小标签
- 快速添加时间词前缀: 今天/明天/后天/本周/下周/本月/下月 开头
(后跟分隔符) 自动设为时间标记并移出标题; 本周=本周日, 本月=月末
- 需求/功能/数据库设计文档同步更新 T-TK-14~16 与 Task 表字段
|
2026-10-25 11:47:44 +08:00 |
|
jif2.zhang
|
fd27242e4e
|
fix(V0.2): 全局禁用非编辑框文字选中 + 标题类文本溢出省略
Docker Build and Push / build-image (push) Successful in 1m6s
- * 级 user-select/touch-callout 禁用, input/textarea/contenteditable 放行
- 项目列表标题、项目管理导航标题、看板列名: 单行省略
- 弹层 sheet-title 限两行截断, sheet-sub 单行省略 (任务详情 200 字标题
不再撑爆弹层头部)
|
2026-10-25 10:41:29 +08:00 |
|
jif2.zhang
|
20cc1ccde9
|
feat(V0.2): 列表/看板负责人改为头像 (姓氏首字+按名稳定配色)
Docker Build and Push / build-image (push) Successful in 59s
|
2026-10-25 03:04:15 +08:00 |
|
jif2.zhang
|
9401bd2b3d
|
refactor(V0.2): 列表行等高 (无标签保留元信息行); 看板类型标签与负责人同行
Docker Build and Push / build-image (push) Successful in 1m1s
|
2026-10-25 02:59:52 +08:00 |
|
jif2.zhang
|
fb9e2350b3
|
feat(V0.2): 任务类型标签 —— 项目级自定义 + 任务标记 + 列表/看板展示
Docker Build and Push / build-image (push) Successful in 1m21s
- 数据: Project.taskKinds (JSON, 未配置回落默认 需求/Bug/FEATURE/优化),
Task.kind (≤20字); 迁移 20261025030000_task_kind
- 服务: 项目 PUT 支持整体替换 taskKinds (去重/上限30/至少1个);
任务 create/update 支持 kind (空串清空)
- 项目管理: 新增「任务类型」分区, chips 展示 + 弹层编辑 (删除/新增)
- 任务详情: 新增「类型」字段, 项目类型 chips 点选, 可清空
- 展示: 列表行左下与看板卡左下显示彩色小标签
(需求蓝/Bug红/FEATURE紫/优化橙, 自定义类型灰)
|
2026-10-25 02:53:25 +08:00 |
|
jif2.zhang
|
2e6cc986a0
|
refactor(V0.2): 列表主行去掉状态圆点, 元信息行仅在有成员时显示
Docker Build and Push / build-image (push) Successful in 1m1s
|
2026-10-25 02:44:03 +08:00 |
|
jif2.zhang
|
d20837f9f1
|
refactor(V0.2): 看板 ⋯ 沉到左下角; 列表负责人右下角, 去掉状态文字
Docker Build and Push / build-image (push) Successful in 59s
- 看板卡片左列改为上下撑满: 状态点在上, ⋯ 落到卡片左下角
- 列表行右列改为上下撑满: ⋯ 在右上, 负责人落到右下角
- 列表行第二行不再显示未开始/执行中/完成小字, 只留状态点与成员
|
2026-10-25 02:40:02 +08:00 |
|
jif2.zhang
|
c0b55277a4
|
fix(V0.2): 列表组内排序乐观更新未重排数组, 松手后界面不动
Docker Build and Push / build-image (push) Successful in 1m0s
列表分组渲染按 tasks 数组顺序, reorderTask 此前只给任务打新
sortOrder 字段而保持原数组顺序 —— 松手后界面无任何变化, 看起来
就是组内无法排序 (数据其实已提交)。改为直接按新顺序重建数组,
不在分组内的任务 (孤儿) 追加在尾部。
|
2026-10-25 02:37:39 +08:00 |
|
jif2.zhang
|
49037371f8
|
refactor(V0.2): 看板卡片左列布局 / 列表负责人右移 / 把手再收窄
Docker Build and Push / build-image (push) Successful in 1m0s
- 看板卡片: 状态点与 ⋯ 竖排移到卡片左侧, 负责人+成员靠右, 标题独占中间
- 列表行: 负责人从第二行元信息移到行右侧 (⋯ 左边)
- ⠿ 把手: 宽度收到约 10px, 负外距悬进卡片内边距, 基本不占横向空间
|
2026-10-25 02:32:49 +08:00 |
|
jif2.zhang
|
2fa41c774b
|
fix(V0.2): 拖动浮层残留蓝色背景 —— 类名与遗留 .drag-ghost 规则冲突
Docker Build and Push / build-image (push) Successful in 1m3s
globals.css 里有一条无人使用的旧 .drag-ghost 规则 (蓝色气泡,
max-width 180px, 看板早期方案遗留), 排在新增规则之后同特异性胜出,
克隆卡片容器被套上蓝色背景并被压缩到 180px 宽, 即真机上手下面的
蓝色 div。删除遗留规则; 新规则显式清零背景/内边距并禁用
tap-highlight/user-select (克隆脱离 .mv-view/.task-content 祖先后
需自带防选中)。CDP 实测拖动中容器背景已透明、宽度正常。
|
2026-10-25 02:28:09 +08:00 |
|
jif2.zhang
|
1673cbdb7d
|
refactor(V0.2): 拖动交互收紧 —— 仅把手触发 / 缩小把手 / 去多余元素 / 打卡跨组
Docker Build and Push / build-image (push) Successful in 1m3s
- 打卡与列表: 去掉卡片整体长按拖动路径, 只有 ⠿ 把手可拖; 把手缩小
- 列表行去掉跟动的蓝色目标列徽标 (drag-pill), 占位/克隆浮层承担全部反馈
- 打卡支持跨组拖动: 落到其他周期组的目标卡 = 改周期 + 落位一次完成
(updateHabit period + reorder), 组内排序不变
- 看板: 去掉 ⠿ 把手, 恢复长按拖动
|
2026-10-25 02:19:03 +08:00 |
|
jif2.zhang
|
5066007d9d
|
feat(V0.2): 克隆卡片跟手浮层 + 列表组内排序 + 把手统一移到最左
Docker Build and Push / build-image (push) Successful in 1m1s
- 浮层改为激活时克隆原卡片 (DOM clone, 淡化+投影) 挂 body 顶层,
移动直接改 transform —— 替代蓝色信息条, 所见即所拖
- 任务列表支持组内排序: 拖到本组某行上/下半显示插入指示, 松手提交
POST /projects/:id/tasks/reorder (顶层任务按展平顺序重写 sortOrder);
拖到其他分组仍为换列
- ⠿ 把手统一移到卡片最左: 打卡 / 列表任务行 / 看板卡片 (看板新增把手
即按即拖路径, 与列表同款 touchstart preventDefault 双保险)
- useColumnDrag onDrop 经 ref 桥接防陈旧闭包
|
2026-10-25 02:07:58 +08:00 |
|
jif2.zhang
|
9a8313173d
|
fix(V0.2): 浮层 Portal 修复被遮挡 + 列表落点改为手指所在分组
Docker Build and Push / build-image (push) Successful in 1m1s
- 打卡/任务浮层 createPortal 挂 document.body: 页签滑动容器 transform
破坏 position:fixed 包含块, 浮层被压进卡片流只能看到边缘
- 任务列表落点: 弃用 80px/列步进换算 (视觉位置与换算不一致, 落点随机),
改为 elementFromPoint 命中 [data-column-id] 分组 —— 手指在哪个分组
松手就落到哪, 与看板行为一致; 划出分组时保持上一目标
|
2026-10-25 01:51:17 +08:00 |
|
jif2.zhang
|
83cc218c5e
|
feat(V0.2): 拖动跟手浮层 —— 半透明副本随指针, 原位虚线占位
Docker Build and Push / build-image (push) Successful in 1m5s
- useRowDrag/useHabitDrag 暴露 ghostRef, 拖动激活与移动时直接改
transform (绕过 React 重渲染, 保证跟手流畅)
- 打卡浮层带颜色点 + 名称; 任务列表浮层带任务名 + 实时目标列名
- 原位卡片降为低透明度虚线占位, 落点指示不变
|
2026-10-25 01:42:29 +08:00 |
|
jif2.zhang
|
215263bf2f
|
fix(V0.2): 打卡排序闭包陈旧 + 把手拖动双保险
Docker Build and Push / build-image (push) Successful in 1m1s
- useHabitDrag: onDrop 经 ref 桥接实时闭包 —— bind/bindHandle 空依赖
useCallback 固化了首次渲染(groups=[] 数据未加载)的落位函数, 松手
静默早退, 顺序永远不变
- 把手路径挂非 passive touchstart preventDefault: 规范上禁止浏览器对
整个触摸的默认处理 (含滚动), 与 touch-action:none 双保险
- 把手触区放大 (36px 高), 降低按到行体触发不可靠长按路径的概率
|
2026-10-25 01:31:27 +08:00 |
|
jif2.zhang
|
2725f00f68
|
fix(V0.2): 拖动可靠性重做 —— 把手入口 + 打卡排序接入实际渲染视图
Docker Build and Push / build-image (push) Successful in 1m1s
问题定位:
- 打卡页实际渲染的是 MergedView (CheckinPage 路由), 上次改的 HabitView
是未使用的旧组件, 打包时被 tree-shake, 线上自然无任何效果
- 任务列表长按抬起后一动即脱手: touch-action:pan-y 下手指出现纵向分量,
WebView/渲染器直接把触摸判给滚动并 pointercancel, touchmove preventDefault
拦不住已决定的滚动 (看板可用只因该模式下页面无纵向可滚祖先)
修复:
- 新增 ⠿ 拖动把手 (touch-action:none): 浏览器按规范完全不接管该触摸,
按下立即拖动, CDP 触摸仿真验证: 垂直拖动穿过可滚列表正常落点,
跨组(每天/每周/每月)正确拒绝; 任务行把手拖动换列, 打卡卡片把手组内排序
- useRowDrag/useHabitDrag 抽出 armListeners, 新增 bindHandle 立即激活路径
- MergedView: 组内排序改按 sortOrder (服务端已返回), 拖动落位乐观更新 +
POST /checkin/habits/reorder, 失败回滚; 打卡点击加拖动余波保护
- 长按路径保留为补充入口 (不可滚场景仍可用)
|
2026-10-25 01:21:42 +08:00 |
|
jif2.zhang
|
b1c1b16e66
|
ci: minisign 静态包混多平台二进制, 试运行挑可用者, 失败回退 apt
Docker Build and Push / build-image (push) Successful in 3m31s
|
2026-10-25 00:56:35 +08:00 |
|
jif2.zhang
|
51256335ba
|
ci: 优化构建速度与资源消耗
Docker Build and Push / build-image (push) Failing after 39s
- docker-build: 停用 docker system prune --volumes (保住 build 层缓存), 改为 image prune -f
- 新增 .dockerignore, node_modules/.git/src-tauri 等不再进 build context
- 前端只构建一次: CI 构建 dist 供 OTA 与镜像复用 (PREBUILT_DIST 构建参数)
- Dockerfile: npm install → npm ci + BuildKit cache mount
- setup-node 开启 npm 缓存; master/android-* 加 concurrency 取消旧 run
- android: 只构建 aarch64; tauri target 缓存 key 按 Cargo.lock hash
- minisign 改为静态二进制下载, 去掉 apt-get
|
2026-10-25 00:48:50 +08:00 |
|
jif2.zhang
|
20a5105c23
|
refactor(V0.2): 详情页精简 + 列表行样式调整
Docker Build and Push / build-image (push) Successful in 4m20s
- 任务详情: 移除底部「拷贝到其他项目 / 删除任务」按钮 (⋯ 菜单仍保留入口), 清理相关死代码
- 列表子任务: 改为与普通任务同构的两行布局 (标题 + 左侧状态点/状态文字, 字体略小)
- 列表任务卡片第二行不再显示看板分组标签
|
2026-10-25 00:23:01 +08:00 |
|
jif2.zhang
|
9467d4c242
|
feat(V0.2): 列表拖动修复 + 打卡项组内拖动排序
- 任务列表/看板拖动: 激活后用非 passive touchmove preventDefault 拦截浏览器滚动接管, 修复列表长按抬起后 pointercancel 导致无法真正拖动
- 打卡: 列表按周期分组展示(每天/每周/每月/每年), 长按拖动组内排序(上下落点指示), 新增 POST /checkin/habits/reorder 重写 sortOrder; 新建项排到末尾
- 打卡卡片加 touch-action/user-select 防长按误触; 拖动结束 350ms 内抑制点击余波
|
2026-10-25 00:06:44 +08:00 |
|
jif2.zhang
|
d6ca7573f3
|
fix(V0.2): 三轮反馈 5 项 —— 回滚键盘方案 / 列表卡片拖动 / 看板防误触 / 横滑整屏 / 详情页恢复
Docker Build and Push / build-image (push) Successful in 4m9s
1. 回滚键盘遮挡统一方案 (真机测试不通过, 需求搁置): 恢复 TaskDetail/
UserPicker/CopyTaskPopup/ProjectManage 与 useKeyboardInset 到 9fea1a5^,
删除 useKeyboardInsetWatcher / .kb-safe / interactive-widget=resizes-content
2. 任务详情页样式随 1 一并恢复提交前状态 (含底部拷贝/删除按钮)
3. 列表视图换列改为卡片拖动: 新 useRowDrag (长按 400ms 行抬起, 左右
80px/列步进, 行尾徽标显示目标列, 松手落列), 移除长按 ActionSheet
—— 旧长按与复选框/行点击互相误触, 抬手合成 click 落在控件上触发状态切换
4. 看板拖动防误触: 任务区禁长按文字选择与系统菜单 (输入框除外);
pointercancel 只放弃不提交; 拖动结束 350ms 内抑制 click 误开详情;
状态点/⋯/子任务行 pointerdown 不冒泡, 不发起拖动
5. 看板横滑扩展到整屏: .page-transition 补 height:100% 打通
app-main → page-with-navbar 百分比链, board-wrap 撑满剩余高度
已验证: kb-safe/Watcher/onLongPress 残留引用清零, 逐文件 diff 审阅通过;
本机无 Node 运行时, 未跑 vite build
|
2026-10-24 23:24:31 +08:00 |
|
jif2.zhang
|
9fea1a5a3a
|
fix(V0.2): 二轮评审 6 项 —— BUILD_ID 格式 / 菜单与详情精简 / 拖动重做 / 键盘统一方案
Docker Build and Push / build-image (push) Successful in 4m5s
1. BUILD_ID 改为 yyyyMMddHHmmss (去掉中间点), 仍 UTC+8
2. 任务 ⋯ 菜单去掉顶部任务名标题
3. 任务详情去掉底部「拷贝到其他项目」「删除任务」按钮 (⋯ 菜单已有)
4+6. 键盘遮挡统一方案 (重点设计 §7.2):
- index.html 加 interactive-widget=resizes-content
- App 级 useKeyboardInsetWatcher 写 --kb-inset (visualViewport+window 双源)
- 底部弹层统一 .kb-safe 类 (安全区+20px+键盘插入量, dvh 收缩+内部滚动)
- TaskDetail/UserPicker/CopyTaskPopup/信息块弹层全部迁移, 删除 per-component hook
- 信息块 textarea 补 focus scrollIntoView 兜底
5. 拖动方案重做 (重点设计 §7.1):
- 新 useColumnDrag: Pointer Events + setPointerCapture, 长按400ms原位抬起,
elementFromPoint 高亮目标列, 边缘 rAF 自动横滚; 移除手指跟随浮层(任务名)
- 列表行长按 500ms → 「移动到列」ActionSheet (不做自由拖动)
- 移除「拖到卡片转子任务」误触路径, 统一走详情页层级区
- 删除旧 useLongPressDrag
已验证: 99 文件语法 0 错误、导入 0 缺失
|
2026-10-24 22:15:52 +08:00 |
|
jif2.zhang
|
506db0795b
|
feat(V0.2): 任务操作菜单 / 状态指示 / 移动与转子任务 / 移除扩展信息
Docker Build and Push / build-image (push) Successful in 4m13s
1. 任务 ⋯ 菜单 (列表行与看板卡片): 编辑 / 拷贝到其他项目 / 删除
(antd-mobile ActionSheet, 带任务名标题; 拷贝抽出为 CopyTaskPopup 复用)
2. 点击任务非按钮区域 = 打开编辑页 (原本即如此, ⋯ 不再误触为编辑)
3. 修复状态选择器堆成三行: 此前 .seg 只有 .pv-head 作用域样式,
详情弹层裸用导致纵向堆叠; 新增通用 .seg 分段样式, 当前项高亮点按即切
4. 移除任务的扩展信息 UI (T-TK-04~07 标注已取消, 决策 35):
ExtrasCard 组件删除, DB extras 字段保留不再使用;
项目相关长文本由项目信息块 (T-PJ-13) 承载
5. 任务移动入口: 详情页新增「看板列」ActionSheet 换列(联动裁决不变)
与「层级」区(转为子任务=选父任务 / 转为顶层), 覆盖无法拖拽的场景
6. 列表页移除「+ 子任务」入口: 添加子任务只在详情页, 或经转子任务
已验证: 99 文件语法 0 错误、导入 0 缺失、文档 149 条/决策 35 连续
|
2026-10-24 21:51:26 +08:00 |
|
jif2.zhang
|
b71ceca3f2
|
fix(V0.2): BUILD_ID 时区 / 新建弹框残留 / 项目信息块
Docker Build and Push / build-image (push) Successful in 4m19s
1. BUILD_ID 改用 UTC+8 生成: CI runner 是 UTC 时区, 原来取本地时间会错位;
统一偏移 +8h 后按 UTC 读取 (vite.config.js makeBuildId)
2. 修复「我的项目」页反复弹新建框: createSignal 一次性消费,
ProjectList 处理后回调清零 (此前 TaskPage 状态在 /task 与 /task/list
间保留, 信号残留导致每次进入都触发)
3. 新增项目信息块 (T-PJ-13):
- Project.notes Json ([{title,content}], <=50 块 / 标题<=50 字 / 内容<=20000 字)
- 迁移 20261024130000: 加列(NULL)->回填'[]'->收紧 NOT NULL, 存量行安全
- GET 详情返回 notes; PUT 接受 notes 整体替换
- 项目管理新增「信息块」分区: 列表预览 + 底部弹层独立编辑(标题+多行
textarea+删除), 键盘弹出复用 useKeyboardInset 抬升
- 文档: 需求 T-PJ-13 (149 条) + 功能设计对应行
已验证: 109 文件语法 0 错误、文档 149/149 覆盖
|
2026-10-24 21:37:05 +08:00 |
|
jif2.zhang
|
1fd7522fa6
|
fix(V0.2): 任务模块 4 个 bug —— 覆盖层安全区/返回键/项目列表排序/键盘遮挡
Docker Build and Push / build-image (push) Successful in 4m17s
1. 项目管理等 cs-page 覆盖层与系统状态栏重合:
.cs-page 补 padding-top: var(--safe-top) (复用 main.jsx 实测校准的变量)
2. 项目管理按返回键跑到上一个 Tab:
新增 useOverlayBack —— 覆盖层打开时 pushState 哨兵, 返回键先关覆盖层
应用于 项目管理(内层视图先回主区) 与 任务详情弹层
3. 更多项目页:
- 头部补「+ 新建」入口
- 项目列表支持长按拖动排序(纵向), 顺序存设备端, 与首屏最近项目共用 recentOrder
- 顺带修复首屏 RecentProjects 拖动排序的闭包缺陷(监听器读到旧下标, 首次移动
会 splice(-1)); 两处均改为 ref 取当前下标
4. 任务详情输入子任务被键盘遮挡:
新增 useKeyboardInset (visualViewport 差值), 键盘弹出时抬升弹层内容并收缩
maxHeight; 输入框聚焦后再 scrollIntoView 到可视区中部 (双保险)
已验证: 99 文件语法 0 错误、相对导入 0 缺失
|
2026-10-24 21:09:19 +08:00 |
|
jif2.zhang
|
0cdbfb434f
|
feat(V0.2): 任务模块界面调整 —— 首屏/项目管理/底部安全距离
Docker Build and Push / build-image (push) Successful in 4m8s
按 2026-10-24 评审的 5 条调整实现 (需求 T-VW-08~10 / T-PJ-11/12 / T-UI-11):
首屏 (T-VW-08/09):
- /task 改为「上=最近项目条(3 个+更多入口), 下=当前项目任务管理」
- 完整项目列表迁至 /task/list, 从「更多项目」进入; /task/:pid 保留供深链
最近项目排序 (T-VW-10):
- 卡片长按 300ms 拖动换位, 结果存设备端 prefs.recentOrder
- 顺序 = 手动排序 > 最近访问(recentIds) > 列表序, 归档项目不展示
项目管理 (T-PJ-11/12):
- 新增 ProjectManage: 成员 / 看板列 / 项目信息 三分区统一入口
- 项目信息含 改名 / 归档切换 / 删除(个人项目隐藏) / 退出(仅创建人)
- 项目页头部只留「项目管理 + 新增」, 移除散置的成员/列设置按钮
底部安全距离 (T-UI-11):
- 任务详情 / 人员选择 / 拷贝弹层 padding-bottom = 安全区 + 20px
- 小屏下弹层 maxHeight + 内部滚动, 底部按钮完整可见
已验证: 97 文件语法 0 错误、相对导入 0 缺失
|
2026-10-24 20:32:44 +08:00 |
|
jif2.zhang
|
6153b9db99
|
fix(V0.2): 清除 schema.prisma 中段 BOM, 修复 CI prisma generate 失败
Docker Build and Push / build-image (push) Successful in 4m24s
追加任务模块模型时临时文件带入 U+FEFF, Prisma 解析在 383 行报 Validation Error (run 200)
|
2026-10-24 17:43:30 +08:00 |
|
jif2.zhang
|
6c9cd3fd99
|
feat(V0.2): 任务模块 —— 项目 / 列表与看板 / 列-状态绑定 / 一级子任务
Docker Build and Push / build-image (push) Failing after 3m51s
需求 142 条 (T-*), 设计见 docs/V0.2/任务模块/
数据层:
- 新增 6 张表: Project / ProjectMember / BoardColumn / Task / TaskMember / TaskTag
- 看板列是实体(可增删改排序), Task.columnId 外键 RESTRICT 防误删列丢任务
- Task.status(todo/doing/done) 与 columnId 双落库, 二者正交
领域层 server/task-domain/ (唯一口径, 前后端不重复实现):
- resolveStatus: 列决定状态(只看目标列, 无拖出回退); 状态与列不匹配时按列序取第一个绑定该状态的列自动归位, 无匹配列则不移动; 子任务完全豁免
- retention: 逐列 6 档保留窗口(永不显示/当天/3天/本周/本月/永久显示), 以 doneAt 判定
- copyTask: 跨项目深拷贝, 人员按目标项目成员过滤并回报丢弃名单
接口: /api/projects, /api/columns, /api/tasks (均校验项目成员)
前端:
- 底部 Tab 插入「任务」, 位于「打卡」之后; 默认首页仍为打卡
- 列表视图(子任务缩进+折叠) / 看板视图(长按拖拽换列、拖到卡片降为子任务)
- 列设置(列管理+状态绑定+保留选项) / 任务详情(扩展信息卡片默认收起) / 成员管理
- 视图记忆与上次项目存设备端
已验证: 95 文件语法 0 错误、相对导入 0 缺失、领域逻辑用例全部通过
|
2026-10-24 11:21:16 +08:00 |
|
jif2.zhang
|
42acf72f1e
|
合并 dev-0.2 到 master: 修复打卡按钮点不动
Docker Build and Push / build-image (push) Successful in 4m9s
|
2026-10-24 09:53:14 +08:00 |
|
jif2.zhang
|
e57b7902be
|
修复打卡页所有打卡/再打一次按钮点不动
回归原因: 合并视图引入 doCheck 时加了 `if (!item.canCheck || isFuture) return`.
但 canCheck 字段**只有 /day 接口返回**, 本视图数据取自 /habits, 该接口
不返回 canCheck → item.canCheck === undefined → !undefined === true
→ 每个按钮点击都在第一行直接 return, 表现为"点不动".
修复: doCheck 只按 isFuture 拦截, 与后端 POST /habits/:id/check 的校验
口径一致 (后端只拒绝未来日期与超过补打窗口的日期).
影响范围: 打卡按钮、再打一次按钮、环形点击 (三处共用 doCheck).
|
2026-10-24 09:53:08 +08:00 |
|
jif2.zhang
|
6a48b7311b
|
合并 dev-0.2 到 master: 打卡页新建按钮调整
Docker Build and Push / build-image (push) Successful in 4m4s
|
2026-10-24 08:40:15 +08:00 |
|
jif2.zhang
|
7e229ecc84
|
打卡页: 「点环即打卡」提示换成新建按钮, 去掉底部歪掉的按钮
问题:
- 当日栏右侧的「点环即打卡」是纯文字提示, 看着像可点但实际无交互, 容易误导
- 分组列表底部另有一个「+ 新建打卡项」按钮, 带内联 margin,
与卡片左右边距不一致, 视觉上是歪的
改动:
- 当日栏右侧改为「+ 新建」按钮 (antd-mobile Button, mini) 右对齐,
复用原有 openCreate, 一个入口完成新建
- 删除底部「+ 新建打卡项」按钮及其 .mv-add-wrap 样式
- .mv-daybar 移除废弃的 .sum 样式, 新增 .mv-new-btn (margin-left:auto 右对齐)
空态「创建第一个打卡项」保留 (无任何打卡项时的引导)。
|
2026-10-24 08:40:09 +08:00 |
|
jif2.zhang
|
3250b94bc6
|
合并 dev-0.2 到 master: 打卡与日历合并视图 (按天/周/月分组)
Docker Build and Push / build-image (push) Successful in 4m1s
|
2026-10-24 08:30:53 +08:00 |
|