我如何构建了一个 Flutter + Gemini AI 应用来‘Hack’我的大学考勤(开源)
Source: Dev.to
如果你是像我一样在莫拉图瓦大学的工程专业学生,你一定了解 80 % 规则 的恐怖。
这很简单的数学公式: 出勤率达到 80 % 或被禁止参加考试。
实际上,这是一场噩梦。
- “如果我今天逃课,我的出勤率会降到 79.9 % 吗?”
- “老师会把那天的病假算进去吗?”
- “我还能睡懒觉吗?”
我常常在凌晨 2 点做复杂的代数运算,只是为了决定是否可以缺掉早上的课程。我需要一个不仅能 记录 习惯,而是能够 为我制定策略 的工具。
于是我打造了 The 80 Percent。
下面是我使用 Flutter、Google Gemini AI 以及高度优化的 Firebase 后端(全部在免费套餐内)构建的全栈解决方案的完整演示。
1. 策略引擎:“安全跳过”逻辑
大多数习惯追踪器只会说 “你当前是 75 %。” 这信息毫无用处。我需要 可操作的建议。
“缓冲”公式
如果你的出勤率高于目标,还能缺席多少堂课才会进入危险区?
// The Magic Formula
int calculateSafeSkips(int present, int total, double target) {
// Formula: floor((present / target) - total)
int skips = ((present / target) - total).floor();
return skips < 0 ? 0 : skips;
}
情景: 你参加了 18/20 节课。目标 = 80 %。
结果: 你可以安全地再缺席 2 节课。
为什么重要: 它可以防止学生因恐慌而参加不必要的课程,避免倦怠。
“恢复”公式
如果你 表现不佳,需要连续参加多少堂课才能重新达到安全状态?
// The Recovery Formula
int calculateRecovery(int present, int total, double target) {
// Formula: ceil((target * total - present) / (1 - target))
return ((target * total - present) / (1 - target)).ceil();
}
这点至关重要,因为当学生的出勤率为 70 % 时,需要 准确 知道何时能够再次安全。
2. AI 挑战:使用 Gemini 2.5 解析课程表
任何学生应用中最大的摩擦点是 设置。没有人想手动输入 15 门课程及其时间段。
为什么选择 Gemini 2.5 Flash?
| 原因 | 好处 |
|---|---|
| 速度 & 成本 | 适合免费学生应用——低延迟、低成本推理。 |
| 多模态智能 | 可直接接受 PDF/图片输入。 |
| 零样本能力 | 无需冗长的 few‑shot 示例;只需一个结构良好的系统指令即可。 |
实现(零样本提示)
final model = GenerativeModel(
model: 'gemini-2.5-flash',
apiKey: apiKey,
);
final prompt = """
You are an intelligent assistant that extracts university timetable data.
**GOAL**: Extract timetable metadata, modules, and classes into structured JSON.
**SCHEMA**:
{
"modules": [{"code": String, "name": String, ...}],
"classes": [{"day": String, "time": String, "location": String, ...}]
}
""";
final response = await model.generateContent([
Content.text(prompt),
Content.data('image/png', timetableImageBytes),
]);
应用会解析 JSON 响应并批量写入本地数据库中的课程信息。此 “零样本” 方法保持请求负载小且响应快速。
3. 架构:在 Firebase 免费层中生存
作为学生,我的预算为 $0。Firebase 很棒,但 Firestore 的限制(每天 50 000 次读取)是个陷阱。如果有 500 名用户每天打开应用 10 次并各获取 10 条记录,你将在第 1 天就用完配额。
我的 “离线‑优先” 方案
| 组件 | 功能说明 |
|---|---|
| 本地缓存 | 在启动时立即从设备加载数据。 |
| 懒同步 | 仅在用户明确更改内容时(例如标记出勤)才写入 Firestore。 |
| 数据库不存图片 | 跳过头像同步,以避免付费的 “Blaze” 计划或笨重的 Base64 方案。 |
使用仓库模式,应用可以在不花一分钱的情况下扩展到数千用户。
4. 结果:可投入生产的 Beta
“80 %” 不仅是一个计算器;它是一个全栈学术工具。
- 技术栈: Flutter、Firebase Auth / Firestore、Provider、Gemini API。
- 状态: 开源且 Beta 已上线。
构建这个项目让我明白 工程是关于权衡取舍——我为了稳定性(免费层限制)牺牲了花哨的功能(云端图片),并用精确的数学取代了简单的逻辑,使得应用真正有用。
截图
试用
我正在寻找来自其他开发者和学生的反馈。
- 👉 Notion 文档 (原文链接被截断;可在可用时替换为正确的 URL)
欢迎克隆仓库、提交问题或提出改进建议!
[The 80% Attendance Strategy for Undergrads](https://ill-grenadilla-8a4.notion.site/The-80-Attendance-Strategy-for-Undergrads-2d4d8852a123808c900cd5c78f7de104?pvs=74)
👉 [Demo code and APK file](https://github.com/inusha-thathsara/attendance-tracker-demo/tree/main)
*(Star the repo if you think the project is cool! ⭐)* 