7.8 KiB
7.8 KiB
保质期提醒小程序 - 产品需求文档 (PRD)
1. 产品概述
1.1 产品定位
一款家庭物品保质期管理小程序,帮助用户记录食品、药品、化妆品等物品的保质期,提供临期提醒,减少浪费。
1.2 核心价值
- 快速记录:扫码/手动添加物品保质期
- 智能提醒:临期自动提醒,避免过期浪费
- 分类管理:按类别查看,一目了然
- 统计分析:了解消费习惯,优化采购
1.3 目标用户
- 家庭主妇/主夫
- 注重健康的年轻人
- 有囤货习惯的用户
2. MVP 功能范围
2.1 核心功能(必做)
✅ 物品管理
- 添加物品(名称、分类、生产日期、保质期天数)
- 编辑物品
- 删除物品
- 标记已使用/已丢弃
✅ 提醒系统
- 临期提醒(提前 7 天、3 天、1 天)
- 已过期标记
- 首页展示即将过期物品列表
✅ 分类查看
- 预设分类:食品、药品、化妆品、其他
- 按分类筛选
- 按过期时间排序
✅ 基础统计
- 当前物品总数
- 即将过期数量(7天内)
- 已过期数量
2.2 暂不实现(后续迭代)
- ❌ 拍照识别生产日期
- ❌ 家庭成员共享
- ❌ 购物清单联动
- ❌ 消费习惯分析
- ❌ 推送通知(小程序订阅消息)
3. 页面结构
3.1 首页 (home)
核心目标:快速查看即将过期物品
| 元素 | 说明 | 数据来源 |
|---|---|---|
| 统计卡片 | 总数/即将过期/已过期 | GET /expiry/summary |
| 即将过期列表 | 7天内过期的物品 | GET /expiry/items?status=expiring |
| 快速添加按钮 | 浮动按钮 | 跳转添加页 |
| 分类筛选 | 全部/食品/药品/化妆品/其他 | 前端筛选 |
列表项展示:
- 物品名称
- 分类图标
- 剩余天数(红色:已过期,橙色:3天内,黄色:7天内)
- 过期日期
3.2 添加/编辑页 (add_edit_item)
表单字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | ✅ | 物品名称 |
| category | enum | ✅ | 分类:food/medicine/cosmetic/other |
| production_date | date | ❌ | 生产日期 |
| expiry_date | date | ✅ | 过期日期 |
| shelf_life_days | int | ❌ | 保质期天数(与过期日期二选一) |
| quantity | int | ❌ | 数量(默认1) |
| location | string | ❌ | 存放位置(冰箱/柜子等) |
| remark | string | ❌ | 备注 |
交互逻辑:
- 如果填写生产日期 + 保质期天数,自动计算过期日期
- 如果直接填写过期日期,则不需要生产日期
3.3 全部物品页 (all_items)
核心目标:查看所有物品,支持筛选和排序
| 功能 | 说明 |
|---|---|
| 状态筛选 | 全部/即将过期/已过期/正常 |
| 分类筛选 | 全部/食品/药品/化妆品/其他 |
| 排序方式 | 按过期时间/按添加时间 |
| 列表展示 | 同首页列表项 |
| 左滑操作 | 编辑/删除/标记已用 |
3.4 个人中心 (profile)
功能:
- 用户信息(头像、昵称)
- 提醒设置(提前天数:7/3/1天)
- 数据统计(累计添加、已使用、已过期)
- 关于小程序
4. 数据模型
4.1 物品表 (expiry_items)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| user_id | bigint | 用户ID(关联 users 表) |
| mini_program_id | bigint | 小程序ID |
| name | varchar(100) | 物品名称 |
| category | varchar(20) | 分类:food/medicine/cosmetic/other |
| production_date | date | 生产日期(可选) |
| expiry_date | date | 过期日期 |
| shelf_life_days | int | 保质期天数(可选) |
| quantity | int | 数量(默认1) |
| location | varchar(50) | 存放位置(可选) |
| remark | varchar(255) | 备注(可选) |
| status | varchar(20) | 状态:normal/used/expired/discarded |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
| deleted_at | timestamp | 软删除 |
索引:
idx_user_expiry(user_id, expiry_date)idx_user_category(user_id, category)idx_user_status(user_id, status)
4.2 用户设置表 (expiry_user_settings)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| user_id | bigint | 用户ID(唯一) |
| remind_days | json | 提醒天数数组 [7,3,1] |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
5. API 设计
5.1 物品管理
获取物品列表
GET /api/expiry/items
Query:
- status: string (expiring/expired/normal/used/all)
- category: string (food/medicine/cosmetic/other/all)
- sort: string (expiry_date/created_at)
- page: int
- page_size: int
Response:
{
"code": 0,
"data": {
"items": [
{
"id": 1,
"name": "牛奶",
"category": "food",
"expiry_date": "2026-03-10",
"days_left": 6,
"status": "normal",
"quantity": 2,
"location": "冰箱"
}
],
"total": 10,
"page": 1,
"page_size": 20
}
}
获取首页汇总
GET /api/expiry/summary
Response:
{
"code": 0,
"data": {
"total_items": 15,
"expiring_soon": 3, // 7天内
"expired": 2,
"normal": 10
}
}
添加物品
POST /api/expiry/items
Body:
{
"name": "牛奶",
"category": "food",
"production_date": "2026-02-01", // 可选
"expiry_date": "2026-03-10", // 必填
"shelf_life_days": 37, // 可选
"quantity": 2,
"location": "冰箱",
"remark": ""
}
Response:
{
"code": 0,
"data": {
"id": 1,
"name": "牛奶",
...
}
}
更新物品
PUT /api/expiry/items/:id
Body: 同添加物品
Response:
{
"code": 0,
"data": { ... }
}
删除物品
DELETE /api/expiry/items/:id
Response:
{
"code": 0,
"message": "删除成功"
}
标记物品状态
POST /api/expiry/items/:id/status
Body:
{
"status": "used" // used/discarded
}
Response:
{
"code": 0,
"message": "标记成功"
}
5.2 用户设置
获取设置
GET /api/expiry/settings
Response:
{
"code": 0,
"data": {
"remind_days": [7, 3, 1]
}
}
更新设置
POST /api/expiry/settings
Body:
{
"remind_days": [7, 3, 1]
}
Response:
{
"code": 0,
"message": "更新成功"
}
6. 用户流程
6.1 新用户流程
启动小程序
↓
微信登录 (wx.login)
↓
进入首页(空状态)
↓
点击"添加物品"
↓
填写表单
↓
提交成功 → 返回首页
6.2 日常使用流程
打开首页
↓
查看即将过期物品
↓
[需要添加新物品]
↓
点击浮动按钮
↓
填写表单 → 提交
↓
[物品已使用]
↓
左滑 → 标记已用
↓
[查看所有物品]
↓
切换到"全部"Tab
7. 技术实现要点
7.1 过期状态计算
后端统一计算:
days_left = expiry_date - todaystatus:days_left < 0: expired0 <= days_left <= 7: expiringdays_left > 7: normal
7.2 提醒逻辑(MVP 暂不实现推送)
前端展示提醒:
- 首页红点:有即将过期物品时显示
- 列表颜色标记:
- 红色:已过期
- 橙色:3天内
- 黄色:7天内
- 绿色:正常
7.3 性能优化
缓存策略:
- summary 数据:进入首页时刷新
- items 列表:按页加载,支持下拉刷新
索引优化:
- 按 user_id + expiry_date 查询(最常用)
- 按 user_id + category 筛选
8. 待扩展功能(后续版本)
V2.0
- 拍照识别生产日期和保质期
- 小程序订阅消息推送
- 常用物品模板(快速添加)
V3.0
- 家庭成员共享
- 购物清单联动
- 消费习惯分析
V4.0
- 社区分享(保质期知识)
- 积分系统(减少浪费奖励)