Vibe Coding 作品 — 从浏览器原型演进为原生 macOS 应用。
将 Garmin / WorkOutDoors 等 App 导出的 .fit 骑行文件拖入 macOS 应用任意位置,自动解析并展示地图路线、骑行数据和分析统计;右上角「+」菜单也可选择导入文件或记录保养。
本项目的 Web 版本 已归档在
web/目录,功能完整但不再迭代。
| 功能 | 说明 |
|---|---|
| 地图首屏 | 进入即见所有路线总览,MapKit 全屏展示 |
| 统计卡片 | 距离/用时/均速/极速/爬升/消耗/心率一目了然 |
| 月度图表 | 柱线双轴图,月度里程趋势 + 均速 |
| 智能路线命名 | 自动识别起点终点,三种命名模式 + 地标辅助 |
| 绕圈检测 | 起点终点相同时自动进入绕圈模式,途经点标记 + 圈数统计 |
| 路线对比 | 选中同路线所有骑行,统一缩放聚焦 |
| 排序筛选 | 骑行列表按日期/距离/均速/爬升排序,统计区按月筛选 |
| 深色模式 | 明暗切换,系统跟随可选 |
| 保养提醒 | 日常自维护、小保养、大保养三类提醒,按里程/日期/骑行小时自动计算剩余周期 |
| 保养记录 | 右上角「+」可记录保养,支持补录历史时间并显示上次保养记录 |
| 保养设置 | 可配置干性油/湿性油/蜡性润滑周期、项目启用状态、侧边栏显示和主题 |
| 分享图导出 | 1:1 / 3:4 比例,5 预设渐变 + 纯色 + 自定义背景 |
| Obsidian 同步 | Cmd+Shift+S 一键同步到知识库 |
主界面侧边栏底部会显示已启用且选择展示的保养项目。每一行包含上次保养时间、剩余周期百分比和剩余里程/日期/骑行小时;任一条件达到周期后会标记为到期。
- 右上角「+」菜单可以选择「记录保养」或「导入 FIT 文件」。记录保养时可以选择项目和实际完成时间,也支持补录过去的保养记录。
- 默认内置三类项目:日常自维护、小保养(车店清洁、检查和基础调校)、大保养(长期全面维护)。
- 设置中可以选择干性油、湿性油或蜡性润滑,并分别调整链条润滑提醒间隔;也可以单独控制每个项目是否启用、是否显示在侧边栏。
- 第一次使用且尚未记录真实保养时,周期从第一条骑行记录的时间开始计算。
- 保养数据保存在项目文件夹的
data/maintenance.json,不会修改已有的rides.json。
# 系统要求: macOS 14 (Sonoma) 或更高
cd CyclingDashboard
# 日常验收(增量编译)
./build-app.sh debug
# 发布
./build-app.sh
# 从 Finder 打开 .build/release/CyclingDashboard.app
# 首次运行通过「项目 > 选择项目文件夹」指向仓库根目录也可用 Xcode 直接打开 Package.swift,Cmd+R 增量编译 + SwiftUI Preview。
日常修改后运行一次完整验收:
cd CyclingDashboard
./verify-app.sh这个命令会先运行自动测试,再生成调试版 .build/debug/CyclingDashboard.app。
在 Xcode 中:
Cmd+U:运行全部自动测试Cmd+R:编译并启动应用,进行界面验收
自动测试覆盖核心算法、旧版 JSON 兼容、三类保养规则迁移、保养周期计算、圈数优先级、骑行排序及路线趋势数据。地图交互、FIT 导入、保养记录、重命名、删除和分享仍需在发布前人工走查。
cd CyclingDashboard
./package-dmg.sh脚本会构建自带图标的 Release App,并覆盖生成最新的 .build/CyclingDashboard-macOS.dmg。
当前工程是 Swift Package,Xcode 的 Archive 会将它视为可执行程序归档到 Products/usr/local/bin,不会自动生成标准 macOS App 或 DMG。日常开发仍可使用 Xcode;发布时使用上述脚本。
cycling-dashboard/
├── CyclingDashboard/ # macOS 应用主工程
│ ├── Package.swift
│ ├── Tests/ # XCTest 自动测试
│ ├── verify-app.sh # 自动测试 + 调试构建
│ ├── Sources/
│ │ └── CyclingDashboard/
│ │ ├── App.swift # 入口 + 菜单栏 + 快捷键
│ │ ├── DashboardView.swift # 主布局
│ │ ├── MapView.swift # MapKit 地图
│ │ ├── ImportView.swift # .fit 导入
│ │ ├── StatsSection.swift # 统计卡片
│ │ ├── MonthlyChartView.swift # 月度图表
│ │ ├── RideDetailView.swift # 骑行详情
│ │ ├── DataStore.swift # 数据层
│ │ ├── Models.swift # 数据模型
│ │ ├── CoordinateTransform.swift # WGS-84 ←→ GCJ-02
│ │ ├── Theme.swift # 主题/配色
│ │ ├── MaintenanceModels.swift # 保养规则、周期和数据模型
│ │ ├── MaintenanceSection.swift # 侧边栏保养提醒
│ │ ├── MaintenanceRecordView.swift # 记录保养
│ │ ├── SettingsView.swift # 通用、保养和数据设置
│ │ ├── Utils.swift # 工具函数
│ │ └── ...
│ └── build-app.sh
├── web/ # 已归档浏览器版(不再迭代)
├── data/
│ ├── rides.json # 所有骑行数据
│ ├── locations.json # 地标列表
│ └── maintenance.json # 保养记录与提醒设置(本地生成)
├── scripts/ # 工具脚本
└── config.example.json # 配置模板
| 层 | 技术 |
|---|---|
| 语言 | Swift 6 |
| UI | SwiftUI |
| 地图 | MapKit |
| 图表 | Swift Charts |
| 数据 | SwiftData / JSON |
| .fit 解析 | Python fitparse(桥接) |
| 地理编码 | OpenStreetMap Nominatim API |
| App | 状态 |
|---|---|
| WorkOutDoors (iOS) | 完整支持 |
| Garmin Connect | 标准 FIT 协议 |
| Wahoo Fitness | 同上 |
| Strava 导出 | 同上 |
本项目始于 2026 年 5 月的一个浏览器原型,经多轮迭代演进为原生 macOS 应用。全程由 AI 对话驱动(Vibe Coding),零手工编码。Web 原型源码保留在 web/ 目录供参考。
MIT