Flutter 框架跨平台鸿蒙开发 - 药品有效期提醒
运行效果图。
药品有效期提醒应用
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
守护家庭用药安全
扫码录入 · 分类管理 · 过期预警 · 用药提醒
一、应用概述
运行效果图





1.1 产品定位
药品有效期提醒是一款专注于家庭药品管理的健康应用。通过扫码录入药品信息,实现药品分类管理、过期预警、用药提醒等功能,帮助家庭科学管理药品,保障用药安全。
1.2 核心价值
1.3 功能架构
二、数据模型设计
2.1 药品分类枚举
应用支持多种药品分类:
| 分类 | 图标 | 颜色 | 描述 | 常见药品 |
|---|---|---|---|---|
| 感冒发烧 | 🤒 | #F44336 | 感冒、退烧类药物 | 感冒灵、布洛芬 |
| 肠胃消化 | 💊 | #FF9800 | 肠胃、消化类药物 | 胃舒平、健胃消食片 |
| 外用药品 | 🩹 | #4CAF50 | 外用、消毒类药物 | 创可贴、碘伏 |
| 慢性病药 | 💉 | #9C27B0 | 慢性病长期用药 | 降压药、降糖药 |
| 维生素类 | 💊 | #2196F3 | 维生素、保健品 | 维生素C、钙片 |
| 儿童用药 | 👶 | #E91E63 | 儿童专用药品 | 小儿感冒颗粒 |
| 妇科用药 | 🌸 | #E91E63 | 妇科专用药品 | 益母草颗粒 |
| 五官用药 | 👁️ | #00BCD4 | 眼耳鼻喉用药 | 眼药水、滴耳液 |
| 急救药品 | 🚑 | #F44336 | 急救备用药品 | 速效救心丸 |
| 其他药品 | 📦 | #607D8B | 其他类型药品 | - |
2.2 药品状态枚举
| 状态 | 图标 | 颜色 | 描述 | 处理建议 |
|---|---|---|---|---|
| 正常 | ✅ | #4CAF50 | 在有效期内 | 正常使用 |
| 临期 | ⚠️ | #FFC107 | 30天内过期 | 优先使用 |
| 即将过期 | 🔶 | #FF9800 | 7天内过期 | 尽快使用 |
| 已过期 | ❌ | #F44336 | 已过有效期 | 立即处理 |
| 已用完 | 📭 | #9E9E9E | 库存为零 | 及时补充 |
2.3 核心数据模型
class Medicine {
final String id;
final String name;
final MedicineCategory category;
final String? barcode;
final String? specification;
final String? manufacturer;
final DateTime productionDate;
final DateTime expiryDate;
final int quantity;
final int remaining;
final String? location;
final String? notes;
final List<UsageRecord> usageRecords;
final List<Reminder> reminders;
}
class UsageRecord {
final String id;
final DateTime time;
final double dosage;
final String? notes;
final String? member;
}
class Reminder {
final String id;
final ReminderType type;
final TimeOfDay time;
final List<int> repeatDays;
final double dosage;
final bool enabled;
final String? notes;
}
class ExpiryAlert {
final String medicineId;
final String medicineName;
final ExpiryStatus status;
final int daysRemaining;
final DateTime expiryDate;
}
2.4 提醒类型
| 提醒类型 | 图标 | 触发条件 | 提醒内容 |
|---|---|---|---|
| 用药提醒 | 💊 | 定时触发 | 该吃药了 |
| 临期提醒 | ⚠️ | 30天内过期 | 药品即将过期 |
| 过期提醒 | ❌ | 已过期 | 药品已过期,请处理 |
| 库存提醒 | 📦 | 库存不足 | 药品库存不足 |
| 补货提醒 | 🛒 | 库存为零 | 需要购买药品 |
三、界面设计
3.1 页面结构
3.2 药品首页
核心组件:
| 组件 | 功能 | 交互 |
|---|---|---|
| 状态概览 | 显示药品总数、临期数、过期数 | 点击查看详情 |
| 临期药品 | 显示即将过期的药品列表 | 点击查看详情 |
| 今日提醒 | 显示今日用药提醒 | 点击确认用药 |
| 快速操作 | 扫码录入、手动添加 | 弹出操作面板 |
| 最近添加 | 显示最近添加的药品 | 点击查看详情 |
3.3 药品录入流程
3.4 过期预警页
预警等级展示:
┌─────────────────────────────────────┐
│ ⚠️ 临期预警 (30天内) │
│ ───────────────────────────────── │
│ 感冒灵颗粒 剩余15天 [优先使用] │
│ 布洛芬胶囊 剩余23天 [优先使用] │
│ │
│ 🔶 即将过期 (7天内) │
│ ───────────────────────────────── │
│ 维生素C片 剩余3天 [尽快使用] │
│ 眼药水 剩余5天 [尽快使用] │
│ │
│ ❌ 已过期 │
│ ───────────────────────────────── │
│ 创可贴 过期2天 [立即处理] │
│ 碘伏 过期15天 [立即处理] │
└─────────────────────────────────────┘
四、核心功能实现
4.1 药品录入功能
class MedicineService {
Future<Medicine?> scanBarcode() async {
final barcode = await _barcodeScanner.scan();
if (barcode != null) {
final info = await _fetchMedicineInfo(barcode);
return info;
}
return null;
}
Future<void> addMedicine(Medicine medicine) async {
await _database.insert(medicine);
_scheduleExpiryAlerts(medicine);
_scheduleReminders(medicine);
}
}
4.2 过期预警算法
过期状态判断:
Status={正常if D>30临期if 7<D≤30即将过期if 0<D≤7已过期if D≤0 \text{Status} = \begin{cases} \text{正常} & \text{if } D > 30 \\ \text{临期} & \text{if } 7 < D \leq 30 \\ \text{即将过期} & \text{if } 0 < D \leq 7 \\ \text{已过期} & \text{if } D \leq 0 \end{cases} Status=⎩ ⎨ ⎧正常临期即将过期已过期if D>30if 7<D≤30if 0<D≤7if D≤0
其中 DDD 为距离过期天数。
预警优先级计算:
Priority=1D+1×Wc \text{Priority} = \frac{1}{D + 1} \times W_c Priority=D+11×Wc
其中 WcW_cWc 为药品分类权重(急救药品权重更高)。
4.3 用药提醒功能
class ReminderService {
void scheduleReminder(Reminder reminder) {
for (var day in reminder.repeatDays) {
_scheduler.schedule(
day: day,
time: reminder.time,
callback: () => _showNotification(reminder),
);
}
}
void _showNotification(Reminder reminder) {
_notification.show(
title: '用药提醒',
body: '请按时服用 ${reminder.medicineName},剂量:${reminder.dosage}',
);
}
}
4.4 库存管理
库存计算:
Remaining=Initial−∑i=1nUsagei \text{Remaining} = \text{Initial} - \sum_{i=1}^{n} \text{Usage}_i Remaining=Initial−i=1∑nUsagei
补货提醒触发:
Alert={库存不足if R≤Tl需要补货if R=0 \text{Alert} = \begin{cases} \text{库存不足} & \text{if } R \leq T_l \\ \text{需要补货} & \text{if } R = 0 \end{cases} Alert={库存不足需要补货if R≤Tlif R=0
其中 RRR 为剩余数量,TlT_lTl 为库存阈值。
五、数据可视化
5.1 药品分类分布
5.2 有效期分布
正常 (30天以上) ████████████████░░░░ 75%
临期 (30天内) ████░░░░░░░░░░░░░░░░ 15%
即将过期 (7天内) ██░░░░░░░░░░░░░░░░░░ 7%
已过期 █░░░░░░░░░░░░░░░░░░░ 3%
5.3 用药记录统计
六、安全与隐私
6.1 数据安全
6.2 隐私保护
| 措施 | 说明 |
|---|---|
| 本地存储 | 所有数据存储在用户设备 |
| 数据加密 | 敏感信息加密存储 |
| 权限最小化 | 仅申请必要权限 |
| 数据导出 | 支持数据导出备份 |
| 安全删除 | 支持数据彻底删除 |
七、技术实现细节
7.1 状态管理
class MedicineState extends ChangeNotifier {
List<Medicine> _medicines = [];
List<ExpiryAlert> _alerts = [];
List<Reminder> _reminders = [];
Map<ExpiryStatus, List<Medicine>> get medicinesByStatus {
return {
ExpiryStatus.normal: _medicines.where((m) => m.status == ExpiryStatus.normal).toList(),
ExpiryStatus.expiringSoon: _medicines.where((m) => m.status == ExpiryStatus.expiringSoon).toList(),
ExpiryStatus.expired: _medicines.where((m) => m.status == ExpiryStatus.expired).toList(),
};
}
void addMedicine(Medicine medicine) {
_medicines.add(medicine);
_updateAlerts();
notifyListeners();
}
void _updateAlerts() {
_alerts = _medicines
.where((m) => m.status != ExpiryStatus.normal)
.map((m) => ExpiryAlert.fromMedicine(m))
.toList();
}
}
7.2 过期检测
class ExpiryChecker {
static ExpiryStatus checkStatus(DateTime expiryDate) {
final now = DateTime.now();
final days = expiryDate.difference(now).inDays;
if (days <= 0) return ExpiryStatus.expired;
if (days <= 7) return ExpiryStatus.aboutToExpire;
if (days <= 30) return ExpiryStatus.expiringSoon;
return ExpiryStatus.normal;
}
static int daysRemaining(DateTime expiryDate) {
return expiryDate.difference(DateTime.now()).inDays;
}
}
八、应用截图示意
8.1 首页
┌─────────────────────────────────────┐
│ 药品有效期提醒 📷 ⚙️ │
├─────────────────────────────────────┤
│ ┌─────────────────────────────┐ │
│ │ 📦 药品概览 │ │
│ │ 总计: 28 临期: 3 过期: 1 │ │
│ └─────────────────────────────┘ │
│ │
│ ⚠️ 临期预警 │
│ ┌─────────────────────────────┐ │
│ │ 🤒 感冒灵颗粒 剩余15天 │ │
│ │ 💊 布洛芬胶囊 剩余23天 │ │
│ │ 💊 维生素C片 剩余28天 │ │
│ └─────────────────────────────┘ │
│ │
│ 💊 今日提醒 │
│ ┌─────────────────────────────┐ │
│ │ 08:00 降压药 1片 [确认] │ │
│ │ 12:00 维生素C 1片 [确认] │ │
│ │ 20:00 降压药 1片 [待服用]│ │
│ └─────────────────────────────┘ │
│ │
│ [📷 扫码录入] [➕ 手动添加] │
└─────────────────────────────────────┘
│ 📋药品 ⚠️预警 ⏰提醒 📊统计 │
└─────────────────────────────────────┘
8.2 添加药品页
┌─────────────────────────────────────┐
│ ← 添加药品 │
├─────────────────────────────────────┤
│ 药品名称 │
│ ┌─────────────────────────────┐ │
│ │ 感冒灵颗粒 │ │
│ └─────────────────────────────┘ │
│ │
│ 药品分类 │
│ 🤒感冒 💊肠胃 🩹外用 💉慢性 │
│ │
│ 规格 │
│ ┌─────────────────────────────┐ │
│ │ 10g × 9袋 │ │
│ └─────────────────────────────┘ │
│ │
│ 有效期 │
│ ┌─────────────────────────────┐ │
│ │ 2025-06-30 📅 │ │
│ └─────────────────────────────┘ │
│ │
│ 数量 存放位置 │
│ ┌───────┐ ┌───────────┐ │
│ │ 2 盒 │ │ 药箱-上层 │ │
│ └───────┘ └───────────┘ │
│ │
│ 备注 │
│ ┌─────────────────────────────┐ │
│ │ 饭后服用,一日三次 │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ 保 存 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
九、后续规划
9.1 功能迭代
| 版本 | 功能 | 状态 |
|---|---|---|
| v1.0 | 基础药品管理、过期预警 | ✅ 已完成 |
| v1.1 | 用药提醒、记录统计 | 🚧 开发中 |
| v1.2 | 扫码录入、药品信息库 | 📋 计划中 |
| v1.3 | 多设备同步 | 📋 计划中 |
| v2.0 | 家庭共享、智能推荐 | 📋 计划中 |
9.2 技术优化
- 接入真实扫码功能
- 药品信息数据库对接
- 后台提醒推送
- 数据云端备份
- 多语言支持
守护家庭用药安全
更多推荐




所有评论(0)