feat: 自动保存/移除撤销与红点, 间隔合并改进(DAILY/稀疏/交错拆分), 删死代码, 更新测试与文档

- organize: seriesKey 移除 weekday, 解锁每3天等 DAILY 序列合并
- organize: fitSeries 放宽阈值(稀疏序列如 BUS LAW Workshop 合并)
- organize: 新增 splitIntoChains, GCD=1 的交错多班次拆为多个系列
- useCalendar: 移除 dirty/history/undo/snapshot/markSaved 死代码
- HeaderBar: 移除撤销按钮与红点●, 下载兜底序列化当前状态
- 测试: 42 项(原32), 覆盖 DAILY/稀疏/交错拆分/两两和候选等场景
- 文档: README 精简, 新增 docs/organize-algorithm.md 与 auto-save-design.md
- 保留移动端 CSS 适配
This commit is contained in:
zikai
2026-07-22 06:32:47 +00:00
parent b49dbd46eb
commit 037b70deec
13 changed files with 617 additions and 137 deletions

View File

@@ -5,11 +5,11 @@
## 功能
- 拖入即用:拖拽或选择 `.ics` 文件,浏览器内直接解析
- 智能去重:自动检测重复模式,将扁平事件合并为 RRULE 重复事件 + EXDATE
- 智能去重:检测事件间隔(每周 / 每两周 / 每 N 天),将扁平事件合并为 RRULE 重复事件 + EXDATE;交错的多班次自动拆分为多个系列
- 自动保存:所有编辑即时生效,下载时兜底序列化最新状态,无需手动保存
- 可视化编辑:编辑标题/地点/时间/重复规则,点击网格切换排除日期
- 拆分事件:把一个重复事件按日期拆成前后两段
- 增删事件:新增单次/重复事件,删除任意事件
- 撤销重做:快照式 undo/redo最多 50 步
- 导出 ICS下载整理后的 `.ics`,可直接导入日历应用
## 项目结构
@@ -25,21 +25,25 @@ timeTableFix/
│ ├── main.js 应用挂载
│ ├── App.vue 布局装配
│ ├── composables/
│ │ └── useCalendar.js 中心 store + 快照 undo/redo
│ │ └── useCalendar.js 中心 store(自动保存,无 undo
│ ├── lib/
│ │ ├── weekday.js 星期常量与工具
│ │ ├── date.js 日期工具
│ │ ├── colors.js 事件配色
│ │ ├── uuid.js UUID 生成(含非安全上下文回退)
│ │ ├── ical-io.js ICS 文本 <-> plain model
│ │ ├── recur.js RRULE 网格展开
│ │ ├── organize.js GCD 去重算法
│ │ ├── organize.js 间隔去重 + 链拆分算法
│ │ ├── event-factory.js 事件构造工厂
│ │ └── split.js 事件拆分逻辑
│ └── components/
│ ├── HeaderBar.vue 顶栏:整理/撤销/重做/导入/下载
│ ├── HeaderBar.vue 顶栏:整理/导入/下载
│ ├── DropZone.vue 拖拽/选择文件
│ ├── EventList.vue 侧栏事件列表
│ ├── EventDetail.vue 编辑表单 + 拆分
── OccurrenceGrid.vue 排除日期网格
── OccurrenceGrid.vue 排除日期网格
│ ├── MonthPreview.vue 月预览
│ └── WeekPreview.vue 周预览
├── test/ Vitest 单元测试
│ ├── golden-org.ics 测试用例61 事件的真实课表)
│ ├── weekday.test.js
@@ -47,6 +51,8 @@ timeTableFix/
│ ├── recur.test.js
│ └── organize.test.js
└── docs/ 设计文档
├── organize-algorithm.md 间隔合并与链拆分算法详解
└── auto-save-design.md 自动保存设计
```
## Ubuntu 从零安装