v2.8
砍掉 AI 味的 emoji 功能树 / v2.2~v2.8 长 changelog / 详细部署步骤。 部署细节链到 docs/install/。踩坑清单保留(CSRF / Pinia / MiniMax / MySQL pool 4 个坑)。
洗车管理系统
给我自己的私家车记账用的。
养车这件事最容易稀里糊涂——洗车/加油/充电/保养/保险,哪个花了多少全靠记性。这玩意儿就是把每笔账都记下来,顺带把天气、Grocy 汽美用品库存、保养预测都塞进一个面板里。所有数据存自己服务器上,不上云。
跑了一年多,V2.8 还在迭代。下面是当前状态。
功能
- 车:CRUD + 软删除 + 健康卡片(油耗/电耗/保养预测)
- 洗车:CRUD + 4 种类型 + 自动抓天气 + AI 截图 OCR 自动填表 + 前后对比照
- 加油:CRUD + 自动算百公里油耗(仅加满记录)+ 油价趋势图
- 充电:CRUD + 自动算百公里电耗
- 保养:CRUD + 动态项目(机油/机滤/空滤...)+ OCR
- 保险:CRUD + 到期提醒 + 附件上传
- 化学品:Grocy 镜像同步 + 库存扣减 + 低库存预警
- 仪表盘:30 天频次 + 同比环比 + 油价 + 年均养护 + 季节频率 + 各车成本
- 月度报表:Excel(6 sheet)+ PDF
- 提醒中心:加油/保养/洗车超期阈值可配
- 全局搜索:跨 7 领域带高亮(车牌/商家/保单号...)
- 标签:给记录打 #打蜡 #通勤 之类的,可查频率
- 通知中心:OCR/同步/备份结果持久化
- 成就:14 个预置成就(洗车新手→狂魔,万里征程...)
- PWA:iOS/Android 可装到桌面 + 离线缓存
API 总共 60+ 端点,完整列表跑起来后看 /api/docs。
技术栈
后端 Node 18 + Express + MySQL 8(主)/ SQLite(回退)。前端 Vue 3 + Vite + Pinia。PWA 用 vite-plugin-pwa。OCR 接 MiniMax M3 多模态或任意 OpenAI 兼容端点。
部署
我自己在宝塔上跑。详见 docs/install/INSTALL-BT-NODE.md。
最简步骤:
cd /www/wwwroot/carwash
unzip 洗车管理系统-v2.8-源码.zip
npm install --prefix server
npm install --prefix client && npm run build --prefix client
node server/src/bin/migrate.js # 自动跑 18 个 SQL
pm2 start server/src/bin/serve.js --name carlog
# Nginx 反代 127.0.0.1:8787
数据库配置走 .env:
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=carlog
DB_PASSWORD=xxx
DB_NAME=carlog
SESSION_SECRET=random-32-bytes
默认账号
admin / carwash2026。登录后到「设置 → 账户」改密码。
测试
npm test
当前 101 个测试全过。覆盖 CSRF / 登录锁定 / IP 限流 / CRUD / 标签 / 通知 / 提醒 / 同比 / stats 等。
一些坑(避免后人踩)
- DB 用
mysql2 timezone: 'Z',所有 server 端 DATETIME 字符串必须用getUTCHours()等 UTC 方法,别用本地时区。否则锁定时间会错 8 小时。 - Pinia setup store 的 ref 在 store proxy 上自动解包,外部调用用
store.ref = x,别写store.ref.value = x。 - 1×1 透明 PNG(68 字节)会被 MiniMax 内容审查判敏感,OCR 测试图必须用真实上传图。
- mysql2 pool 默认不开
enableKeepAlive,idle 连接会被 MySQLwait_timeout杀掉,下次 query 报 ETIMEDOUT。已开 keepAlive + 自动 retry。
仓库
https://gitea.img2img.com/wsh5485/CarLog
License
MIT
Releases
1
Languages
JavaScript
52.8%
Vue
46.2%
CSS
0.7%
HTML
0.3%