# AGENTS.md > 一个轻量、精美、移动端优先的个人加油记录与车辆燃油成本分析工具。 > > 中英别名: FuelLog / 加油记 ## 项目目标 10 秒完成一笔加油记录,自动算出实际油价、百公里油耗、每公里成本;移动端 + PWA 优先;架构简单、不堆中间件,后续可扩展到充电、保养、停车、保险等车辆综合成本。 完整产品/技术决策见 `FuelLog_PLAN.md`,本文件是给 Agent 的工程操作手册。 --- ## 仓库结构(单仓双工程,推荐) 仓库根 = 整个项目,内含前端与后端两个 Go module 风格的子工程: ``` FuelLog/ ├── fuellog-web/ # Vue 3 + TS + Vite 前端 ├── fuellog-api/ # Go + Gin + GORM 后端 ├── deploy/ # docker-compose / Nginx / PWA manifest 等 ├── docs/ # 设计稿、API 文档、截图 ├── data/ # SQLite 文件(开发期;部署期挂 volume) ├── AGENTS.md # 本文件 ├── README.md └── .gitignore ``` > 若 Agent 决定使用 `frontend/` `backend/` 之类的别名,在该子目录里再放一份本地 `AGENTS.md` 明确路径即可,根目录命令按本文件执行。 --- ## Setup commands ### 准备环境 - Node.js ≥ 20,pnpm ≥ 9(优先 pnpm,无则 npm) - Go ≥ 1.22 - Docker / Docker Compose(部署) - `git`、`make`(可选,`make help` 查看快捷命令) ### 后端 ```bash cd fuellog-api go mod tidy cp .env.example .env # 本地 SQLite 默认 ./data/fuellog.db go run ./cmd/server # 监听 :8080 go test ./... # 核心计算单测 go vet ./... ``` ### 前端 ```bash cd fuellog-web pnpm install # 或 npm install pnpm dev # 启动 Vite,默认 :5173,自动代理 /api -> :8080 pnpm build pnpm preview # 预览构建产物 pnpm typecheck # vue-tsc pnpm lint # eslint + prettier ``` ### 整体(开发期) ```bash docker compose -f deploy/docker-compose.dev.yml up # API + Web + 反代 一把起 ``` ### 部署 ```bash docker compose -f deploy/docker-compose.yml up -d ``` `data/` 目录必须挂载 volume,SQLite 不可随容器删除。 --- ## 技术栈(锁定,不要临时换) ### Frontend - Vue 3 + TypeScript + Vite - Vue Router / Pinia - Tailwind CSS(主题通过 CSS Variables / Tailwind Theme,不在组件里写死颜色) - Naive UI(优先,不适合时退到 Element Plus) - ECharts(统计图表) - vite-plugin-pwa(PWA: manifest + service worker + 添加到主屏) ### Backend - Go + Gin - GORM(默认;若团队更熟 sqlc 允许,需在 PR 写理由) - SQLite(默认,代码层用 GORM 抽象,后续能切 Postgres) - 金额:使用 `decimal` 库或按"分"为单位的整数,避免 float 累计误差 ### Infra - Docker / Docker Compose - Nginx / Nginx Proxy Manager 反代 - 单一 SQLite 文件 + volume 持久化 ### MVP 禁止引入 Kubernetes / 微服务 / Kafka / Redis / RabbitMQ / Elasticsearch / GraphQL / Service Mesh / CQRS / Event Sourcing —— 出现真实需求前不要上。 --- ## 项目布局 ### 后端 `fuellog-api/` ``` fuellog-api/ ├── cmd/server/ # main.go ├── internal/ │ ├── handler/ # Gin handler,只做 HTTP │ ├── service/ # 业务逻辑(油价/油耗/成本/统计) │ ├── repository/ # 数据库访问 │ ├── model/ # 实体 │ ├── dto/ # 入参/出参 │ ├── middleware/ # 日志/错误/恢复 │ └── router/ # 路由注册 ├── migrations/ # GORM AutoMigrate 或 goose 脚本 ├── config/ ├── pkg/ # 通用工具(decimal 封装、错误码等) ├── go.mod └── Dockerfile ``` 硬性分层:**Handler 不允许写业务逻辑**。Service 持有 Repository 抽象,便于单测。 ### 前端 `fuellog-web/` ``` fuellog-web/ ├── src/ │ ├── api/ # 类型化 API client(基于 openapi 后再生成) │ ├── assets/ │ ├── components/ │ ├── layouts/ # 移动端 Bottom Nav + 桌面侧栏 │ ├── pages/ │ │ ├── dashboard/ │ │ ├── refuel/ # 列表 + 新增 + 编辑 │ │ ├── statistics/ │ │ └── vehicle/ │ ├── router/ │ ├── stores/ # Pinia │ ├── types/ │ ├── utils/ # decimal 工具、单位转换 │ ├── App.vue │ └── main.ts ├── public/ # PWA manifest 图标 ├── package.json └── vite.config.ts ``` --- ## Code style ### 通用 - 文件名、变量、commit 用英文;用户可见文案、注释、commit message 用简体中文。 - Conventional Commits 强制:`feat:` `fix:` `docs:` `refactor:` `style:` `test:` `chore:` `perf:`。 - 提交前 `pnpm lint` + `go vet` 必须 0 错 0 警。 - 金额、加油量、里程统一用 decimal 或显式单位,严禁直接 `==` 比较 float。 ### 前端 - TypeScript `strict: true`;不写 `any`,能用 `unknown` / 联合类型收口。 - Vue SFC `