laoyang
610d524e68
CalDAV 待办改为按分类拆成多本(对齐参照 DAViCal)
用户提供参照服务器 nas.yangyq.net/caldav/synccalendartest(DAViCal 1.1.9)并指出
「应该可以直接显示那个家庭的待办分类」。
## 参照实测结果
那台服务器的待办本结构:
/caldav/<user>/tfxnz/ 家庭计划 VTODO
/caldav/<user>/zlqlzm/ 工作任务 VTODO
/caldav/<user>/tdotbsnl/ 个人成长 VTODO
/caldav/<user>/home_todo/ Inbox VTODO
⇒ 每个分类是**独立的 calendar 集合**,各自 supported-calendar-component-set
只含 VTODO,客户端里显示成并列的多个待办列表。
VTODO 正文还带 CREATED / LAST-MOD / DTSTAMP / SEQUENCE / PRIORITY /
PERCENT-COMPLETE / STATUS / DESCRIPTION / LOCATION / TRANSP。
## 上一版的问题
第一版做成「一个「家庭待办」本装全部任务」,所有分类混在一起,
客户端里只有一个列表 —— 用户要的是分类可见。
## 这一版
### 本的组织
/dav/tasks-<categoryId>.ics/ 每个 task_categories 一行 = 一本
/dav/tasks-inbox.ics/ category_id 为空的任务(Inbox)
⚠️ 用 `tasks-<id>` 而不是裸 id:真实日历本是 `/dav/<id>.ics/`,
裸 id 会与它们撞号(calendar_events 与 task_categories 是两套独立序列)。
### 分类跟随「本」
客户端把资源 PUT 进哪一本,任务就归哪个分类。
这是「按分类拆本」的自然语义,也让「在客户端里移动任务到另一本」等价于改分类。
### 跨本隔离
GET/DELETE 单条时会校验「这条任务确实属于这个本」,
否则改一下 href 就能用 A 本读到 B 本的任务。
## 验证(39 项全过)
真实数据(5 个分类 / 32 条任务):
| 本 | 条数 |
|---|---|
| 家庭事务 | 6 |
| 工作相关 | 19 |
| 个人事务 | 2 |
| 党支部工作 | 1 |
| 轻舟相关 | 1 |
| 收件箱 | 3 |
每本 supported-calendar-component-set 均只含 VTODO,无 VEVENT。
PUT 到 tasks-1.ics 后 Location 返回 /dav/tasks-1.ics/task-40.ics,
GET 读回、更新、完成、删除全部正常。
回归:原有日历本(观影等)PROPFIND/GET 正常,组件类型仍是 VEVENT。
鉴权:无口令 401、不存在的分类本 404、非法段 404。
测试数据已清理,tasks 仍为 32 条。
## 文件
- app/TaskDav.php 重写为多本模型
- app/Ics.php VTODO 导出/解析(上一版已加,本版未改)
- dav.php 五处拦截改多本
## 已知限制
看板名(正在进行/等待反馈/等待结果)通过 CATEGORIES 输出给客户端,
但客户端改它不会反向改看板 —— 标准 VTODO 没有「看板列」概念。
分类则双向(由「在哪一本」决定)。
2026-11-02 15:41:54 +08:00
..
2026-10-14 01:20:40 +08:00
2026-09-30 00:49:53 +08:00
2026-09-30 13:24:26 +08:00
2026-10-19 12:51:17 +08:00
2026-10-19 12:51:17 +08:00
2026-10-18 03:34:47 +08:00
2026-11-01 19:55:40 +08:00
2026-10-18 03:34:47 +08:00
2026-10-22 16:40:52 +08:00
2026-11-01 19:55:40 +08:00
2026-10-02 09:28:07 +08:00
2026-10-03 08:18:05 +08:00
2026-10-05 10:58:17 +08:00
2026-10-05 10:58:17 +08:00
2026-10-05 10:58:17 +08:00
2026-11-01 19:55:40 +08:00
2026-10-15 20:19:09 +08:00
2026-10-30 23:43:10 +08:00
2026-10-13 11:53:58 +08:00
2026-10-06 20:41:04 +08:00
2026-10-01 00:12:04 +08:00
2026-10-13 11:53:58 +08:00
2026-10-17 00:15:06 +08:00
2026-09-30 00:49:53 +08:00
2026-09-30 00:49:53 +08:00
2026-10-19 23:41:15 +08:00
2026-10-05 13:26:49 +08:00
2026-10-18 20:14:50 +08:00
2026-10-30 08:11:47 +08:00
2026-10-25 14:52:43 +08:00
2026-11-02 08:51:34 +08:00
2026-10-18 03:34:47 +08:00
2026-10-24 04:25:02 +08:00
2026-10-05 10:58:17 +08:00
2026-11-02 15:29:36 +08:00
2026-10-05 10:58:17 +08:00
2026-10-03 08:18:05 +08:00
2026-10-20 21:35:47 +08:00
2026-09-30 09:44:55 +08:00
2026-10-18 11:35:13 +08:00
2026-10-07 18:22:55 +08:00
2026-10-19 23:41:15 +08:00
2026-10-01 00:12:04 +08:00
2026-10-11 10:12:11 +08:00
2026-10-28 12:48:47 +08:00
2026-10-28 12:48:47 +08:00
2026-09-30 13:24:26 +08:00
2026-10-05 16:45:10 +08:00
2026-10-28 16:03:36 +08:00
2026-10-09 07:25:08 +08:00
2026-10-15 23:04:25 +08:00
2026-10-19 17:27:37 +08:00
2026-10-19 15:27:08 +08:00
2026-10-03 19:27:14 +08:00
2026-10-18 03:34:47 +08:00
2026-10-15 23:04:25 +08:00
2026-10-17 00:15:06 +08:00
2026-10-03 11:30:48 +08:00
2026-10-07 11:35:31 +08:00
2026-10-02 22:08:13 +08:00
2026-10-03 11:30:48 +08:00
2026-10-03 15:01:38 +08:00
2026-11-01 19:55:40 +08:00
2026-09-30 00:49:53 +08:00
2026-10-06 03:14:18 +08:00
2026-10-12 15:31:03 +08:00
2026-11-02 15:41:54 +08:00
2026-10-22 10:14:54 +08:00
2026-10-02 09:28:07 +08:00
2026-09-30 11:06:22 +08:00
2026-10-13 11:53:58 +08:00
2026-10-05 16:45:10 +08:00
2026-11-01 19:55:40 +08:00
2026-10-14 01:20:40 +08:00
2026-10-08 10:54:43 +08:00