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 |
|