# i — 个人生活操作系统 一个**单 Vue + 单 Express + 单 MySQL** 的生活操作系统平台,按子系统分代码目录和 API 路径,永远单用户。 第一个子系统是 [CarLog](https://gitea.img2img.com/wsh5485/CarLog)(洗车管理系统),将来可能加:健身、阅读、健康等(**用户还没决定下一子系统,本阶段不做**)。 ## 架构核心 ``` ┌────────────────────────────────────────────────────────┐ │ Vue SPA (一个壳子) │ │ │ │ ┌──────────────────────────────────────────────────────┐│ │ │ 总设置 / 子系统管理 / Dashboard (平台层) ││ │ └──────────────────────────────────────────────────────┘│ │ │ │ ┌──────────────────────────────────────────────────────┐│ │ │ 🚗 CarLog | 未来子系统 ││ │ └──────────────────────────────────────────────────────┘│ │ │ └────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────┐ │ Express (一个进程) │ │ ├── /api/platform/* (总设置 / 子系统管理 / Dashboard) │ │ ├── /api/carlog/* (CarLog 子系统, 全部带前缀) │ │ └── /api/{future}/* (将来加的子系统) │ └────────────────────────────────────────────────────────┘ │ ▼ ┌────────────────────────────────────────────────────────┐ │ MySQL @ 162.14.110.130:33306 / carlog │ │ │ │ 平台表 (无前缀): │ │ subsystems / platform_settings │ │ │ │ 子系统表 (有前缀): │ │ carlog_vehicles / carlog_wash_records / ... │ │ │ │ (将来加): │ │ fitness_workouts / fitness_plans / ... │ │ reading_books / reading_notes / ... │ └────────────────────────────────────────────────────────┘ ``` ## 物理隔离靠什么 | 维度 | 做法 | |---|---| | 数据 | 表前缀 `{subsystem}_*`(同一 DB 内;CarLog 已加 `carlog_` 前缀,将来加 fitness/reading 直接走 `fitness_*` / `reading_*`) | | 路由 | 子系统自己的路径空间(`/api/carlog/*`) | | 代码 | 子系统独立目录(`server/src/subsystems/{name}/`、`client/src/views/subsystems/{name}/`) | | 设置 | 每个子系统有自己的 settings schema(JSON Schema,存 `platform_settings` 表,key 前缀 `{name}.*`) | | 菜单 | 每个子系统在 `subsystems` 表注册,平台层根据 `category` 分组渲染左侧导航 | **没有** JWT / SSO / iframe / 6 端点协议 / 独立 DB — 那些都是过度设计。 ## 实施路线 ### 当前阶段(Phase 1 平台基座 + Phase 2 CarLog 子系统化 + 表前缀迁移) **Phase 1 平台基座** - [ ] `server/migrations/019_platform.sql`(subsystems + platform_settings 表 + seed CarLog) - [ ] `server/src/routes/platform/{subsystems,settings,dashboard}.js` - [ ] `client/src/views/Platform/{GlobalSettings,SubsystemSettings,Subsystems}.vue` - [ ] `client/src/stores/platform.js` + `AppLayout.vue` 元数据驱动菜单 - [ ] 测试(12-20 个平台测试) **Phase 2 CarLog 子系统化** - [ ] CarLog 代码移到 `server/src/subsystems/carlog/`(13 个路由文件) - [ ] CarLog 路由全部 mount 到 `/api/carlog/*`(不再是 `/api/vehicles`) - [ ] CarLog 前端 view 移到 `client/src/views/subsystems/carlog/` - [ ] 前端 API 改用 `carlogApi` helper(自动加 `/api/carlog/` 前缀) **Phase 2.8 表前缀迁移**(用户决定) - [ ] `server/migrations/020_carlog_prefix.sql` — 21 张 CarLog 表加 `carlog_` 前缀 - [ ] **改前先 mysqldump 备份** - [ ] 13 个路由文件 + reset-all.js SQL 加前缀 - [ ] 数据完整性验证(行数不变) **Phase 3 验证** - [ ] 手动 E2E 14 步 + DB 数据完整 + 备份清理 ### 暂不做(用户没决定) - ❌ 加第二个子系统(健身 / 阅读 / 任何) - ❌ 跨子系统 dashboard widget - ❌ 多用户 / RBAC / 多租户 ## 路线原则 - **永远单用户**:不要 RBAC / 多租户 / 权限 scope - **一个进程一个 SPA**:不分部署不分 iframe - **元数据驱动 UI**:subsystem 的 settings_schema / nav_items 走 JSON,不硬编码 - **物理目录隔离**:subsystem 代码独立目录,加新子系统不会乱碰现有代码 - **永远向后兼容**:CarLog 的现有功能不破 详细见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) / [docs/DEV-PLAN.md](docs/DEV-PLAN.md) / [docs/UI-STYLE.md](docs/UI-STYLE.md)(UI 规范 — 平台层 100% 复用 CarLog UI)。 ## Git 仓库 - 仓库:https://gitea.img2img.com/wsh5485/i.git - 平台:Gitea - 推送:osxkeychain 自动记住 token - 推送:osxkeychain 自动记住 token