timeTableFix - 纯前端 ICS 日历整理器

浏览器内解析、去重、编辑 ICS 日历文件,全程无需后端服务。拖入 .ics -> 整理去重 -> 编辑 -> 下载。

功能

  • 拖入即用:拖拽或选择 .ics 文件,浏览器内直接解析
  • 智能去重:检测事件间隔(每周 / 每两周 / 每 N 天),将扁平事件合并为 RRULE 重复事件 + EXDATE交错的多班次自动拆分为多个系列
  • 自动保存:所有编辑即时生效,下载时兜底序列化最新状态,无需手动保存
  • 可视化编辑:编辑标题/地点/时间/重复规则,点击网格切换排除日期
  • 拆分事件:把一个重复事件按日期拆成前后两段
  • 增删事件:新增单次/重复事件,删除任意事件
  • 导出 ICS下载整理后的 .ics,可直接导入日历应用

项目结构

timeTableFix/
├── index.html                  Vite 入口
├── package.json
├── vite.config.js              构建配置(含 preview.allowedHosts
├── vitest.config.js
├── .npmrc                      npmmirror 镜像加速
├── src/
│   ├── main.js                 应用挂载
│   ├── App.vue                 布局装配
│   ├── composables/
│   │   └── 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         间隔去重 + 链拆分算法
│   │   ├── event-factory.js    事件构造工厂
│   │   └── split.js            事件拆分逻辑
│   └── components/
│       ├── HeaderBar.vue       顶栏:整理/导入/下载
│       ├── DropZone.vue        拖拽/选择文件
│       ├── EventList.vue       侧栏事件列表
│       ├── EventDetail.vue     编辑表单 + 拆分
│       ├── OccurrenceGrid.vue  排除日期网格
│       ├── MonthPreview.vue    月预览
│       └── WeekPreview.vue     周预览
├── test/                       Vitest 单元测试
│   ├── golden-org.ics          测试用例61 事件的真实课表)
│   ├── weekday.test.js
│   ├── ical-io.test.js
│   ├── recur.test.js
│   └── organize.test.js
└── docs/                       设计文档
    ├── organize-algorithm.md   间隔合并与链拆分算法详解
    └── auto-save-design.md     自动保存设计

Ubuntu 从零安装

1. 安装 Node.js 18+

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
node --version   # 确认 v18.x

2. 克隆并安装依赖

git clone https://git.zikai.wang/zikai/timeTableFix.git
cd timeTableFix
npm install        # 已配 npmmirror 镜像加速

3. 构建生产版本

npm run build      # 产物输出到 dist/
npm test           # (可选)运行单元测试

4. 集成到主页

本项目作为 mainPage 的一个页签集成展示,采用构建期组件集成 + git submodule

  • mainPage 通过 git submodule 把本项目作为子目录(third_party/timeTableFix)引入,并直接 import 本项目的 src/App.vue 作为懒加载路由组件。
  • 集成时共享 mainPage 的构建、依赖(ical.js)与 KeepAlive 缓存,不再是 iframe无运行期割裂。
  • 本项目 App.vue 已做样式隔离scoped + ttf- 前缀类名),设计令牌与 mainPage 对齐;全局重置仅在独立 appmain.js)加载,作为组件嵌入时不污染宿主。

本项目无独立线上入口,仅通过主页 https://zikai.wang/timetable 访问。升级流程见 mainPage 的 docs/submodule-timeTableFix.md

开发

cd timeTableFix
npm install
npm run dev       # 开发服务器 http://localhost:5173
npm test          # 单元测试42 项)
npm run build     # 构建到 dist/(独立预览用,非线上入口)

技术栈

选择
框架 Vue 3.5SFC<script setup>
构建 Vite 6
ICS 库 ical.js 2.x
状态管理 composable 单例 store
测试 Vitest
包源 npmmirror.com中国镜像加速
Description
No description provided
Readme 377 KiB
Languages
JavaScript 59.7%
Vue 38.7%
CSS 1.3%
HTML 0.3%