6c8f07071e
砍掉 AI 味的 emoji 功能树 / v2.2~v2.8 长 changelog / 详细部署步骤。 部署细节链到 docs/install/。踩坑清单保留(CSRF / Pinia / MiniMax / MySQL pool 4 个坑)。
85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
# 洗车管理系统
|
||
|
||
给我自己的私家车记账用的。
|
||
|
||
养车这件事最容易稀里糊涂——洗车/加油/充电/保养/保险,哪个花了多少全靠记性。这玩意儿就是把每笔账都记下来,顺带把天气、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](docs/install/INSTALL-BT-NODE.md)。
|
||
|
||
最简步骤:
|
||
|
||
```bash
|
||
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`。登录后到「设置 → 账户」改密码。
|
||
|
||
## 测试
|
||
|
||
```bash
|
||
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 连接会被 MySQL `wait_timeout` 杀掉,下次 query 报 ETIMEDOUT。已开 keepAlive + 自动 retry。
|
||
|
||
## 仓库
|
||
|
||
https://gitea.img2img.com/wsh5485/CarLog
|
||
|
||
## License
|
||
|
||
MIT |