Compare commits
1 Commits
960657a251
...
78d7afe699
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78d7afe699 |
86
README.md
86
README.md
@@ -1,16 +1,6 @@
|
|||||||
# timeTableFix - 纯前端 ICS 日历整理器
|
# timeTableFix - 纯前端 ICS 日历整理器
|
||||||
|
|
||||||
浏览器内解析、去重、编辑 ICS 日历文件,全程无需后端服务。拖入 `.ics` -> 整理去重 -> 编辑 -> 下载。
|
浏览器内解析、去重、编辑 ICS 日历文件,全程无需后端服务。拖入 `.ics` -> 整理去重 -> 编辑 -> 下载。独立可维护,亦可作为 [mainPage](https://git.zikai.wang/zikai/zMainPage) 的子模块集成展示。
|
||||||
|
|
||||||
## 功能
|
|
||||||
|
|
||||||
- 拖入即用:拖拽或选择 `.ics` 文件,浏览器内直接解析
|
|
||||||
- 智能去重:检测事件间隔(每周 / 每两周 / 每 N 天),将扁平事件合并为 RRULE 重复事件 + EXDATE;交错的多班次自动拆分为多个系列
|
|
||||||
- 自动保存:所有编辑即时生效,下载时兜底序列化最新状态,无需手动保存
|
|
||||||
- 可视化编辑:编辑标题/地点/时间/重复规则,点击网格切换排除日期
|
|
||||||
- 拆分事件:把一个重复事件按日期拆成前后两段
|
|
||||||
- 增删事件:新增单次/重复事件,删除任意事件
|
|
||||||
- 导出 ICS:下载整理后的 `.ics`,可直接导入日历应用
|
|
||||||
|
|
||||||
## 项目结构
|
## 项目结构
|
||||||
|
|
||||||
@@ -18,14 +8,17 @@
|
|||||||
timeTableFix/
|
timeTableFix/
|
||||||
├── index.html Vite 入口
|
├── index.html Vite 入口
|
||||||
├── package.json
|
├── package.json
|
||||||
├── vite.config.js 构建配置(含 preview.allowedHosts)
|
├── vite.config.js
|
||||||
├── vitest.config.js
|
├── vitest.config.js
|
||||||
├── .npmrc npmmirror 镜像加速
|
├── .npmrc npmmirror 镜像加速
|
||||||
|
├── README.md
|
||||||
├── src/
|
├── src/
|
||||||
│ ├── main.js 应用挂载
|
│ ├── main.js 应用挂载(i18n + 全局样式)
|
||||||
│ ├── App.vue 布局装配
|
│ ├── App.vue 便携式根组件(嵌入与独立两用)
|
||||||
|
│ ├── i18n/ 独立 vue-i18n 实例 + 中英 locale
|
||||||
│ ├── composables/
|
│ ├── composables/
|
||||||
│ │ └── useCalendar.js 中心 store(自动保存,无 undo)
|
│ │ ├── useCalendar.js 中心 store(自动保存,无 undo)
|
||||||
|
│ │ └── useLocale.js 语言辅助(直读自身 i18n 实例)
|
||||||
│ ├── lib/
|
│ ├── lib/
|
||||||
│ │ ├── weekday.js 星期常量与工具
|
│ │ ├── weekday.js 星期常量与工具
|
||||||
│ │ ├── date.js 日期工具
|
│ │ ├── date.js 日期工具
|
||||||
@@ -45,59 +38,29 @@ timeTableFix/
|
|||||||
│ ├── MonthPreview.vue 月预览
|
│ ├── MonthPreview.vue 月预览
|
||||||
│ └── WeekPreview.vue 周预览
|
│ └── WeekPreview.vue 周预览
|
||||||
├── test/ Vitest 单元测试
|
├── test/ Vitest 单元测试
|
||||||
│ ├── golden-org.ics 测试用例(61 事件的真实课表)
|
|
||||||
│ ├── weekday.test.js
|
|
||||||
│ ├── ical-io.test.js
|
|
||||||
│ ├── recur.test.js
|
|
||||||
│ └── organize.test.js
|
|
||||||
└── docs/ 设计文档
|
└── docs/ 设计文档
|
||||||
├── organize-algorithm.md 间隔合并与链拆分算法详解
|
|
||||||
└── auto-save-design.md 自动保存设计
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Ubuntu 从零安装
|
## 外部依赖
|
||||||
|
|
||||||
### 1. 安装 Node.js 18+
|
| 项 | 说明 |
|
||||||
|
|----|------|
|
||||||
```bash
|
| Node.js | ≥ 18 |
|
||||||
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
| ical.js | ICS 解析库(npm 依赖) |
|
||||||
sudo apt-get install -y nodejs
|
|
||||||
node --version # 确认 v18.x
|
> 纯前端应用,无运行期后端依赖。
|
||||||
```
|
|
||||||
|
## 如何使用
|
||||||
### 2. 克隆并安装依赖
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# 克隆并安装
|
||||||
git clone https://git.zikai.wang/zikai/timeTableFix.git
|
git clone https://git.zikai.wang/zikai/timeTableFix.git
|
||||||
cd timeTableFix
|
cd timeTableFix
|
||||||
npm install # 已配 npmmirror 镜像加速
|
npm install # 已配 npmmirror 镜像加速
|
||||||
```
|
|
||||||
|
|
||||||
### 3. 构建生产版本
|
npm run dev # 开发服务器 http://localhost:5173
|
||||||
|
npm run build # 构建到 dist/
|
||||||
```bash
|
npm test # 单元测试(42 项)
|
||||||
npm run build # 产物输出到 dist/
|
|
||||||
npm test # (可选)运行单元测试
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 集成到主页
|
|
||||||
|
|
||||||
本项目作为 [mainPage](https://git.zikai.wang/zikai/zMainPage) 的一个页签集成展示,采用**构建期组件集成 + git submodule**:
|
|
||||||
|
|
||||||
- mainPage 通过 git submodule 把本项目作为子目录(`third_party/timeTableFix`)引入,并直接 `import` 本项目的 `src/App.vue` 作为懒加载路由组件。
|
|
||||||
- 集成时共享 mainPage 的构建、依赖(`ical.js`)与 KeepAlive 缓存,不再是 iframe,无运行期割裂。
|
|
||||||
- 本项目 `App.vue` 已做样式隔离(scoped + `ttf-` 前缀类名),设计令牌与 mainPage 对齐;全局重置仅在独立 app(`main.js`)加载,作为组件嵌入时不污染宿主。
|
|
||||||
|
|
||||||
本项目无独立线上入口,仅通过主页 `https://zikai.wang/timetable` 访问。升级流程见 mainPage 的 [`docs/submodule-timeTableFix.md`](https://git.zikai.wang/zikai/zMainPage/src/branch/main/docs/submodule-timeTableFix.md)。
|
|
||||||
|
|
||||||
## 开发
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd timeTableFix
|
|
||||||
npm install
|
|
||||||
npm run dev # 开发服务器 http://localhost:5173
|
|
||||||
npm test # 单元测试(42 项)
|
|
||||||
npm run build # 构建到 dist/(独立预览用,非线上入口)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 技术栈
|
## 技术栈
|
||||||
@@ -107,6 +70,13 @@ npm run build # 构建到 dist/(独立预览用,非线上入口)
|
|||||||
| 框架 | Vue 3.5(SFC,`<script setup>`) |
|
| 框架 | Vue 3.5(SFC,`<script setup>`) |
|
||||||
| 构建 | Vite 6 |
|
| 构建 | Vite 6 |
|
||||||
| ICS 库 | ical.js 2.x |
|
| ICS 库 | ical.js 2.x |
|
||||||
|
| 国际化 | vue-i18n 9(中文同步,英文懒加载) |
|
||||||
| 状态管理 | composable 单例 store |
|
| 状态管理 | composable 单例 store |
|
||||||
| 测试 | Vitest |
|
| 测试 | Vitest |
|
||||||
| 包源 | npmmirror.com(中国镜像加速) |
|
| 包源 | npmmirror.com(中国镜像加速) |
|
||||||
|
|
||||||
|
## 了解更多
|
||||||
|
|
||||||
|
- [嵌入 mainPage(i18n prop 桥接 / 样式隔离)](./docs/integration.md)
|
||||||
|
- [间隔合并与链拆分算法](./docs/organize-algorithm.md)
|
||||||
|
- [自动保存设计](./docs/auto-save-design.md)
|
||||||
|
|||||||
30
docs/integration.md
Normal file
30
docs/integration.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# 嵌入 mainPage
|
||||||
|
|
||||||
|
timeTableFix 可作为 [mainPage](https://git.zikai.wang/zikai/zMainPage) 的子模块(git submodule)经构建期组件集成展示,位于 mainPage 的 `third_party/timeTableFix`。
|
||||||
|
|
||||||
|
## 集成方式
|
||||||
|
|
||||||
|
- mainPage 通过 git submodule 把本项目作为子目录引入,并直接 `import` 本项目的 `src/App.vue` 作为懒加载路由组件。
|
||||||
|
- 构建期集成(非 iframe),共享 mainPage 的构建与 KeepAlive 缓存,无运行期割裂。
|
||||||
|
- 本项目无独立线上入口,仅通过主页 `https://zikai.wang/timetable` 访问。
|
||||||
|
|
||||||
|
## 便携式 App.vue
|
||||||
|
|
||||||
|
`src/App.vue` 是嵌入与独立两用的根组件:
|
||||||
|
|
||||||
|
- **嵌入时**:mainPage 侧包装器 `import` 本项目 `src/App.vue`,把父项目当前语言经 `:locale` prop 传入。`App.vue` 内 `watch` 该 prop,同步到本项目独立的 `vue-i18n` 实例 `locale`,从而跟随父项目语言开关响应式切换。文案来自本项目自有 locale 文件,不共享父项目的 messages。
|
||||||
|
- **独立运行时**:不接收 prop,默认中文。
|
||||||
|
|
||||||
|
## i18n 桥接关键点
|
||||||
|
|
||||||
|
组件内用 `useLocale` composable **直接读自身模块级 i18n 实例**(`i18n.global`),而非 `useI18n({ useScope: 'global' })`。
|
||||||
|
|
||||||
|
原因:`useI18n({ useScope: 'global' })` 解析的是「当前运行 app 已安装的全局 i18n」。嵌入 mainPage 时那是父项目的实例(不含本项目文案),会导致文案回退成 i18n key(显示 ID 而非文字)。改为直接引用本项目实例的 `.global`,无论是否 `app.use()` 都拿到本项目的 `t`。
|
||||||
|
|
||||||
|
## 样式隔离
|
||||||
|
|
||||||
|
`App.vue` 已做样式隔离(scoped + `ttf-` 前缀类名),设计令牌与 mainPage 对齐;全局重置仅在独立 app(`main.js`)加载,作为组件嵌入时不污染宿主。
|
||||||
|
|
||||||
|
## 集成 / 升级 / 移除
|
||||||
|
|
||||||
|
详见 mainPage 仓库的 [`docs/submodule-timeTableFix.md`](https://git.zikai.wang/zikai/zMainPage/src/branch/main/docs/submodule-timeTableFix.md)(克隆含子模块、升级 gitlink、移除页签等流程)。
|
||||||
Reference in New Issue
Block a user