Files
2026-03-04 16:31:30 +08:00

228 lines
5.2 KiB
Markdown

# 保质期提醒小程序 - 开发文档
## 项目概述
保质期提醒小程序是一款帮助用户管理家庭物品保质期的工具,支持食品、药品、化妆品等多种物品的记录和提醒。
---
## 文档索引
- **[PRD.md](./PRD.md)** - 产品需求文档(功能范围、页面设计、数据模型)
- **[API.md](./API.md)** - 接口文档(完整的 API 定义和示例)
- **[DEVELOPMENT.md](./DEVELOPMENT.md)** - 开发指南(技术实现细节)
- **[ISSUES.md](./ISSUES.md)** - 开发任务清单(按优先级拆分的 Issues)
---
## 快速开始
### 1. 数据库初始化
```sql
-- 创建物品表
CREATE TABLE expiry_items (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL,
mini_program_id BIGINT UNSIGNED NOT NULL,
name VARCHAR(100) NOT NULL,
category VARCHAR(20) NOT NULL,
production_date DATE,
expiry_date DATE NOT NULL,
shelf_life_days INT,
quantity INT DEFAULT 1,
location VARCHAR(50),
remark VARCHAR(255),
status VARCHAR(20) DEFAULT 'normal',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL,
INDEX idx_user_expiry (user_id, expiry_date),
INDEX idx_user_category (user_id, category),
INDEX idx_user_status (user_id, status),
INDEX idx_deleted_at (deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 创建用户设置表
CREATE TABLE expiry_user_settings (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL UNIQUE,
remind_days JSON DEFAULT '[7,3,1]',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
### 2. 后端开发
参考现有模块结构(如 `internal/smoke`),创建 `internal/expiry` 目录:
```
internal/expiry/
├── handler.go # HTTP 处理器
├── service.go # 业务逻辑
├── model.go # 数据模型
└── repository.go # 数据访问层
```
### 3. 路由注册
`internal/routes/routes.go` 中注册路由:
```go
expiry := r.Group("/api/expiry")
expiry.Use(middleware.AuthMiddleware())
{
expiry.GET("/summary", expiryHandler.GetSummary)
expiry.GET("/items", expiryHandler.GetItems)
expiry.POST("/items", expiryHandler.CreateItem)
expiry.PUT("/items/:id", expiryHandler.UpdateItem)
expiry.DELETE("/items/:id", expiryHandler.DeleteItem)
expiry.POST("/items/:id/status", expiryHandler.UpdateStatus)
expiry.GET("/settings", expiryHandler.GetSettings)
expiry.POST("/settings", expiryHandler.UpdateSettings)
}
```
### 4. 小程序端开发
参考 API 文档进行前端开发,主要页面:
- `pages/expiry/home` - 首页
- `pages/expiry/add` - 添加/编辑物品
- `pages/expiry/list` - 全部物品列表
- `pages/expiry/profile` - 个人中心
---
## MVP 功能清单
### Phase 1: 核心功能(2-3天)
- [x] 数据库表设计
- [ ] 后端 API 实现
- [ ] 物品 CRUD
- [ ] 汇总统计
- [ ] 用户设置
- [ ] 前端页面开发
- [ ] 首页(列表 + 统计)
- [ ] 添加/编辑页
- [ ] 全部物品页
### Phase 2: 优化完善(1-2天)
- [ ] 状态计算逻辑优化
- [ ] 列表分页加载
- [ ] 左滑操作
- [ ] 空状态提示
- [ ] 错误处理
### Phase 3: 测试上线(1天)
- [ ] 单元测试
- [ ] 接口测试
- [ ] 小程序端测试
- [ ] 部署上线
---
## 技术栈
**后端**:
- Go 1.23+
- Gin Web Framework
- GORM (MySQL)
- JWT 认证
**前端**:
- 微信小程序原生开发
- WeUI 组件库(可选)
**数据库**:
- MySQL 8.0+
---
## 开发规范
### 1. 代码风格
遵循项目现有代码风格:
- Go: 使用 `gofmt` 格式化
- 变量命名:驼峰命名法
- 错误处理:统一使用 `common.ErrorResponse`
### 2. 提交规范
```
feat: 添加物品管理接口
fix: 修复过期日期计算错误
docs: 更新 API 文档
test: 添加物品服务单元测试
```
### 3. 分支管理
- `main`: 生产环境
- `develop`: 开发环境
- `feature/expiry-*`: 功能分支
---
## 测试数据
### 测试物品
```json
[
{
"name": "伊利纯牛奶",
"category": "food",
"expiry_date": "2026-03-10",
"quantity": 6,
"location": "冰箱"
},
{
"name": "感冒灵颗粒",
"category": "medicine",
"expiry_date": "2027-12-31",
"quantity": 1,
"location": "药箱"
},
{
"name": "雅诗兰黛面霜",
"category": "cosmetic",
"production_date": "2025-06-01",
"shelf_life_days": 1095,
"quantity": 1,
"location": "梳妆台"
}
]
```
---
## 常见问题
### Q1: 如何计算过期状态?
后端统一计算 `days_left = expiry_date - today`,前端根据 `days_left` 显示颜色:
- `< 0`: 红色(已过期)
- `0-3`: 橙色(即将过期)
- `4-7`: 黄色(临期)
- `> 7`: 绿色(正常)
### Q2: 如何处理时区问题?
统一使用 UTC 时间存储,前端根据用户时区显示。
### Q3: 软删除如何实现?
使用 GORM 的 `deleted_at` 字段,查询时自动过滤已删除数据。
---
## 联系方式
如有问题,请查看:
- [Issues](./ISSUES.md) - 开发任务和问题追踪
- [API 文档](./API.md) - 接口详细说明
- [PRD](./PRD.md) - 产品需求细节