課程概述
本次課程以三種不同技術方式製作個人記帳應用程式,分別為 MIT App Inventor(AI2)、PWA + Python Flask 以及結合 Firebase Hosting 上線部署,深入體驗從行動端到網頁端的完整 App 開發流程。
搭配 TinyDB 本地儲存
網頁前端介面設計
一鍵部署上線
MIT App Inventor 實作
▸ 實作截圖紀錄
介面元件設計
| 元件名稱 | 類型 | 功能說明 |
|---|---|---|
| HorizontalArrangement1 | Layout | 類別選擇列容器 |
| Label1 / 下拉式選單1 | UI | Spinner 類別選擇(請選擇、其他、早餐、午餐、晚餐) |
| HorizontalArrangement2 | Layout | 明細輸入列容器 |
| Label2 / TextBox_輸入明細 | UI | 明細文字輸入欄位 |
| HorizontalArrangement3 | Layout | 金額輸入列容器 |
| Label3 / TextBox_輸入金額 | UI | 金額數字輸入欄位 |
| 水平配置1 | Layout | 按鈕列容器 |
| 儲存按鈕 / 清空按鈕 | UI | 觸發儲存或清空動作 |
| 資料查詢 Label | UI | 顯示所有帳目列表 |
| 對話框1 | Non-vis | 顯示通知訊息(儲存成功 / 請選擇類別) |
| 微型資料庫1 | Non-vis | TinyDB 本地資料儲存 |
| 計時器1 | Non-vis | Clock 取得日期(格式:MMM d, yyyy) |
程式積木邏輯說明
① 宣告變數與初始化
initialize global dataList to create empty list
when Screen1.Initialize
if not is empty ( TinyDB.GetValue tag:"data" valueIfTagNotThere:"" )
then
set global dataList to TinyDB.GetValue tag:"data"
set 資料查詢.Text to get global dataList
② 儲存帳目資料
when 儲存按鈕.Click
if compare texts 下拉式選單1.Selection ≠ "請選擇"
then
if not is empty 輸入金額.Text
then
add items to list global dataList
item: join ( Clock.FormatDate instant:Clock.Now
pattern:"MMM d, yyyy" )
"," 下拉式選單1.Selection
"," 輸入明細.Text
"," 輸入金額.Text "
"
TinyDB.StoreValue tag:"data" value:global dataList
對話框1.ShowAlert notice:"儲存成功"
else
對話框1.ShowAlert notice:"請輸入金額"
else
對話框1.ShowAlert notice:"請選擇類別"
③ 清空資料
when 清空按鈕.Click
set global dataList to create empty list
set 資料查詢.Text to ""
TinyDB.ClearAll
PWA + Flask 開發
▸ 專案目錄結構
budget_app/
├── app.py # Flask 後端主程式
├── requirements.txt # Python 套件清單
├── templates/
│ └── index.html # 主介面(含 PWA 設定)
└── static/
├── manifest.json # PWA 設定檔
├── sw.js # Service Worker(離線支援)
└── script.js # 前端邏輯(含 Firebase 互動)
▸ 後端核心程式(app.py)
from flask import Flask, render_template, send_from_directory
import os
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/sw.js')
def serve_sw():
return send_from_directory('static', 'sw.js',
mimetype='application/javascript')
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
▸ 執行過程截圖
▸ 啟動步驟
執行 pip install flask firebase-admin 安裝必要套件
執行 python app.py,伺服器運行於 0.0.0.0:5000
輸入 192.168.x.x:5000 即可使用 PWA 記帳介面
Firebase 雲端資料庫整合
| 欄位 | 範例值 | 說明 |
|---|---|---|
| amount | "400" | 消費金額 |
| category | "早餐" | 消費類別 |
| date | "5月 13, 2026" | 記帳日期 |
| detail | "永和豆漿" | 消費明細 |
▸ 部署至 Firebase Hosting
# 安裝 Firebase CLI(需先安裝 Node.js)
npm install -g firebase-tools
# 確認版本
firebase --version
# 登入 Firebase 帳號
firebase login
# 一鍵部署至 Hosting
firebase deploy
優化專案(Antigravity AI 擴充)
利用 VS Code 內建的 Antigravity AI 助理,對現有記帳 App 進行功能擴充,另存新目錄 20260514_app。
請優化專案內程式(記帳APP)
1. 增加可上傳發票選項
2. 自動將上傳項目區分(其他、早餐、午餐、晚餐)
3. 統計明細表格,再增加統計圖表
相關修改程式另存至目錄夾 20260514_app
心得與感想
第一次使用積木式程式設計製作行動應用程式,感覺非常直觀。TinyDB 的概念讓我理解了本地資料儲存的原理。透過 BlueStacks 模擬器可以即時看到執行結果,大幅降低了學習門檻,對程式邏輯的理解也更加深刻。
利用 Gemini AI 生成完整專案架構,體驗了 AI 輔助開發的強大效率。Flask 後端結合前端 HTML/CSS 讓我了解了 Web App 的完整架構。Service Worker 的離線支援功能讓 PWA 真正具備原生 App 的體驗。
Firebase Realtime Database 的即時同步功能令人印象深刻,資料能在毫秒內更新至雲端。透過 firebase deploy 一鍵部署的體驗讓我感受到現代 DevOps 的便利,未來可以將此技術應用於更多實際專案。