「今天吃什麼」餐廳抽選器
建立自己的餐廳資料庫,透過隨機抽選與喜好程度加權,協助解決每天不知道要吃什麼的選擇困難。
舊版專案為「賽米,這餐吃什麼?」是大學時期使用Windows Form做的,並且沒有採用DI和MVVM等架構,亦無SQLite資料庫支持。
技術細節
本專案使用 C# / .NET 8 WPF 開發桌面應用程式,採用 MVVM 架構分離畫面、狀態與操作邏輯,讓 UI 顯示與餐廳資料處理保持清楚的責任邊界。
使用技術
- .NET 8 WPF:建立 Windows 桌面應用程式介面。
- MVVM 架構:以 ViewModel 管理畫面狀態與操作流程,降低 UI 與業務邏輯耦合。
- Entity Framework Core:負責餐廳資料的存取與資料庫操作。
- SQLite:作為本機資料庫,餐廳資料會儲存在使用者電腦中。
- Dependency Injection:透過
Microsoft.Extensions.DependencyInjection管理 ViewModel、Service 與 DbContext 的建立。 - RelayCommand:封裝 WPF 指令綁定,讓按鈕操作可以直接對應到 ViewModel 行為。
主要功能
- 新增餐廳資料
- 查詢餐廳清單
- 修改餐廳名稱、喜好程度與營業時間
- 刪除餐廳資料
- 依目前時間抽選正在營業的餐廳
- 依餐廳喜好程度進行加權隨機抽選
抽選邏輯
抽選時會先讀取資料庫中的所有餐廳,並依目前時間過濾出「現在可以吃」的店家。
如果餐廳沒有設定營業時間,系統會視為全天候可抽選;如果有設定營業時間,則會比對當天營業區間,並支援跨日營業時段,例如 22:00 ~ 02:00。
完成營業狀態篩選後,系統會根據餐廳的喜好程度進行加權隨機抽選。喜好程度越高,被抽中的機率越高;最低也會保留基本權重,避免餐廳完全無法被抽中。
資料儲存
餐廳資料使用 SQLite 儲存在本機端,資料庫路徑位於使用者的 Local Application Data 目錄下:
|
|
應用程式啟動時會自動建立或更新資料庫結構,確保資料表與目前程式版本一致。
專案架構
WhatToEat
├── Commands # WPF ICommand 實作
├── Data # EF Core DbContext 與資料實體
├── Helper # 表單與營業時間輔助邏輯
├── Models # 餐廳資料操作服務
├── ViewModels # MVVM 狀態與操作邏輯
├── Views # WPF 視窗與 XAML 介面
└── Migrations # EF Core 資料庫遷移紀錄
開發環境
- Visual Studio 2022 或以上
- .NET 8 SDK
- Windows 作業系統