Vibe coding全紀錄-2

 A:

 那讓我們來開發一個「錢流」的個人財務管理app,功能包含:記帳,統計每月銀行、投資負債的統計,由每年的收支與投資結果來計算來年可支配的預算,建立專案進行特別的花費管理,請一步一步慢慢的分析,規劃此開發專案的計畫,謝謝

Q:

好的,這是一個非常棒的專案想法!「錢流」這個名字也很貼切。

作為你的專案夥伴,我們就從零開始,一步步規劃這個 App 的開發計畫。一個好的計畫能讓我們保持專注,確保每一步都穩固地建立在前一步的基礎之上。

我們的策略是採用 敏捷開發 的精神,從 最小可行性產品 (Minimum Viable Product, MVP) 開始,分階段擴充功能。這樣做的好處是:

  1. 快速驗證核心想法:先完成最核心的「記帳」功能,確保它好用。

  2. 降低初期複雜度:不用一開始就處理所有複雜的統計與預算邏輯。

  3. 持續交付價值:每完成一個階段,App 的功能就更完整一點。


「錢流」App 開發專案計畫

總體目標

打造一個幫助使用者記錄、理解並規劃個人財務的 Android App。

核心功能模組

  1. 記帳模組:記錄收入、支出。

  2. 統計模組:分析每月、每年的財務狀況。

  3. 預算模組:基於歷史數據預測未來可支配預算。

  4. 專案模組:追蹤特定目標的開銷。


第一步:規劃與基礎建設 (Phase 0)

在寫程式碼之前,我們要先打好地基。這一步的重點是「思考」而非「實作」。

1. 資料模型設計 (Data Model Design)

這是整個 App 的骨架。我們需要思考要「儲存」哪些資料。我會用 Kotlin 的 data class 來呈現,這和我們之後要用的 Room 資料庫結構非常接近。

交易 (Transaction): 每一筆收入或支出。

Kotlin
// 代表一筆交易紀錄的資料表
data class Transaction(
    val id: Long,                 // 唯一 ID
    val amount: Double,           // 金額
    val type: TransactionType,    // 交易類型 (收入/支出)
    val date: Long,               // 交易日期 (用時間戳儲存較方便)
    val category: String,         // 分類 (例如:餐飲、交通、薪水)
    val accountId: Long,          // 這筆錢是從哪個帳戶進出的
    val note: String?,            // 備註 (可選)
    val projectId: Long?          // 屬於哪個專案 (可選)
)

enum class TransactionType {
    INCOME, // 收入
    EXPENSE // 支出
}

帳戶 (Account): 使用者的各種資產與負債帳戶。

Kotlin
// 代表一個金融帳戶的資料表
data class Account(
    val id: Long,                 // 唯一 ID
    val name: String,             // 帳戶名稱 (例如:玉山銀行、富邦證券、房屋貸款)
    val type: AccountType,        // 帳戶類型
    val initialBalance: Double    // 初始金額
)

enum class AccountType {
    BANK,       // 銀行帳戶 (現金)
    INVESTMENT, // 投資帳戶
    LIABILITY   // 負債 (例如:信用卡、貸款)
}

專案 (Project): 用於追蹤特別花費。

Kotlin
// 代表一個專案的資料表
data class Project(
    val id: Long,                 // 唯一 ID
    val name: String,             // 專案名稱 (例如:日本旅遊、買新電腦)
    val budget: Double,           // 預算金額
    val description: String?      // 專案描述 (可選)
)

思考點: 這個資料結構奠定了所有功能的基礎。例如,「統計每月支出」就是去 Transaction 資料表裡,把某個月份 typeEXPENSE 的記錄加總起來。

2. 開發階段劃分

我們將整個專案拆分成以下幾個主要階段:

  • 階段一:核心記帳功能 (MVP)

    • 目標:讓使用者能手動新增、查看、編輯、刪除每一筆收支。

  • 階段二:統計與圖表化

    • 目標:將記錄的數據以列表和圖表(例如:圓餅圖)呈現,讓使用者一目了然。

  • 階段三:預算與專案管理

    • 目標:加入專案管理功能,並實作年度預算計算的邏輯。

  • 階段四:優化與進階功能

    • 目標:加入如資料備份、主題更換、定期記帳等使用者體驗優化的功能。


第二步:開始實作階段一 (MVP)

現在,讓我們專注於第一階段,把最核心的記帳功能做出來。

🎯 階段目標: 讓使用者能夠手動記錄每一筆收入與支出,並管理他們的帳戶。

⚙️ 主要功能:

  1. 建立/編輯/刪除不同類型的「帳戶」。

  2. 新增/編輯/刪除「交易」紀錄。

  3. 在主畫面上顯示最近的交易列表。

🛠️ 技術實作規劃:

  1. 專案初始化與依賴設定:

    • 在 Android Studio 建立一個新的 "Empty Activity with Jetpack Compose" 專案。

    • build.gradle 檔案中,加入我們之前討論過的函式庫依賴:

      • Room:用於資料庫。

      • Hilt:用於依賴注入。

      • ViewModelLifecycle 相關函式庫。

  2. 建立資料庫層 (Database Layer):

    • Entity: 將我們上面設計的 TransactionAccount data class 轉換成 Room 的 @Entity

    • DAO (Data Access Object): 建立 TransactionDaoAccountDao 介面,在裡面定義資料庫的操作函式,例如 insertTransaction(transaction: Transaction)getAllTransactions(): Flow<List<Transaction>>。Room 會自動幫我們實現這些函式。

    • Database: 建立一個繼承自 RoomDatabase 的抽象類別 AppDatabase,把 EntityDAO 連結起來。

  3. 設計 UI 畫面 (UI Layer - Jetpack Compose):

    • 主畫面 (HomeScreen):

      • 上方顯示總資產概覽(暫時先留白)。

      • 中間是一個 LazyColumn,用來顯示交易紀錄列表。

      • 右下角一個浮動按鈕 (Floating Action Button, FAB),點擊後可以新增交易。

    • 新增/編輯交易畫面 (TransactionScreen):

      • 一個表單,包含輸入金額、選擇收支類型、選擇日期、選擇分類、選擇帳戶、輸入備註等元件。

    • 帳戶管理畫面 (AccountScreen):

      • 顯示所有已建立的帳戶列表,並可以新增或點擊編輯。

  4. 實作視圖模型層 (ViewModel Layer):

    • MainViewModel:

      • 從資料庫讀取交易列表,並透過 StateFlow 將其提供給 HomeScreen

    • TransactionViewModel:

      • 處理新增或編輯交易的邏輯。例如,提供一個 saveTransaction() 函式,當使用者在畫面上點擊「儲存」時,ViewModel 就會把資料整理好並寫入資料庫。

    • AccountViewModel:

      • 處理帳戶管理的邏輯。

  5. 用 Hilt 串連一切:

    • 設定 Hilt,讓它可以自動建立 AppDatabase 的實例。

    • ViewModel 中,透過 Hilt 注入 Repository(一個負責與 DAO 溝通的中介層),這樣 ViewModel 就可以存取資料庫,而不用關心資料庫是怎麼建立的。


我們的下一步

我們已經有了一個清晰的藍圖和第一階段的具體執行計畫。

接下來,我建議我們從「建立資料庫層」開始。 這是所有功能的資料基礎,先把它定義好,後續的 UI 和邏輯開發才能順利進行。

你覺得這個計畫如何?如果沒問題,我們就可以開始著手編寫 RoomEntityDAO。別擔心,我會一步步引導你完成程式碼的建構。