返回作品列表
桌面應用 · 個人獨立開發

QuillNest

整合六大模組的 Windows 個人生產力桌面應用

一套整合便利貼、待辦、行事曆、記事本、專案管理與工作量追蹤的 Windows 桌面生產力套件。由單一開發者從零設計與實作,涵蓋架構設計、資料庫遷移、UI/UX 到打包發佈的完整流程。

類型
Windows 桌面應用(原生)
版本
3.1.8
技術
C# · WPF / XAML · MVVM
資料
SQLite · Entity Framework Core 10
程式規模
約 39,000 行原始碼 · 20 個 EF Core Migration
執行環境
.NET 10 · Windows 10 1809+
QuillNest 介面
專案概覽

集中管理日常工作與生活的一站式工具

QuillNest 是一款以 WPF + .NET 10 打造的 Windows 原生桌面應用,定位為「集中管理日常工作與生活的一站式生產力工具」。專案早期名為 PersonalAssistant,後期重新定位並更名為 QuillNest,同時重構了核心資料模型與部分模組架構。

整個專案由我獨立完成,從需求發想、系統設計、程式實作、資料庫遷移策略,到最終的安裝程式打包與發佈,皆一手包辦

核心功能

六大模組,圍繞一個應用

QuillNest 採模組化設計,整合六大生產力模組於單一應用中,每個模組皆可在設定中獨立開關。模組之間透過統一的標籤系統串接:早期分散的 Category / Tag / EventCategory 模型先整併為 AppLabel;v3.1.3 起再進一步遷移到以 Label / LabelMeta / LabelLink_* 為核心的結構,由我抽象成公開 NuGet 套件的 Cornhsu.Labeling 驅動,包含使用者正式資料的搬移 migration。

MODULE 01

便利貼Sticky Notes

桌面浮動便利貼,每張可獨立設定顏色、位置、大小、透明度、字級、置頂與摺疊,並提供多段鎖定層級防止誤改誤刪。

MODULE 02

待辦事項Todo List

任務管理,支援三段優先度、到期日、提前提醒、顏色標記與附件。透過統一包裝層,行事曆事件能以「虛擬待辦」形式出現在待辦清單。

MODULE 03

行事曆Calendar

事件排程,支援全天與重複事件展開;重複事件的每次發生可個別標記完成/取消/備註,也可「分離」為獨立事件單獨編輯。

MODULE 04

記事本Notepad

長篇筆記,富文本編輯(獨立編輯視窗、插入圖片與表格)並支援 Markdown 模式,可釘選、附加檔案、單選分類搭配多選標籤。

MODULE 05

專案管理Project Management

跨模組整合中樞:待辦、事件、筆記、便利貼皆能以多對多方式關聯到專案。含活動時間軸、附情緒標記的手動反思紀錄(1 小時內可編輯)、完成狀態與獨立封存開關。

MODULE 06

工作量追蹤Workload Tracker

完全使用者自定義的工作量統計系統:以「範本」為單位,自訂欄位、目標型態、統計週期。與行事曆雙向連動,完成事件時自動帶入紀錄。

橫向系統

貫穿全應用的基礎建設

密碼保護

可鎖定整個應用或指定模組,含安全問題重設精靈與「記住解鎖」時效模式。

主題系統

淺色 / 深色主題加自訂強調色,以 DynamicResource 全域即時切換。

新手引導

首次啟動的設定精靈,搭配遮罩式互動教學逐步導覽各模組。

備份 / 還原

備份檔內嵌版本 manifest,配合資料庫版本號機制,舊備份匯入時自動升級結構。

系統整合

系統匣常駐、開機自動啟動、Windows 原生 Toast 通知、單一實例控制(重複啟動時喚醒既有視窗)。

技術架構亮點

七件事,是這個應用真正的深度

1

完全泛用、零硬編碼的工作量追蹤系統

Workload Tracker 從零設計為使用者可自行定義的通用系統,不寫死任何特定業務邏輯。以「範本」為單位,自訂記錄欄位(文字/數字/勾選/日期)、項目列、服務對象與事件關鍵字;目標系統支援總量、分組總量、項目次數三種型態;規則引擎處理頻率限制與前置條件。報表經 ClosedXML 匯出 Excel,含西元 / 民國紀年格式選項。

2

雙重資料庫 Schema 管理策略

為了同時支援「全新安裝」與「舊版資料庫升級」兩種情境,設計雙軌 schema 管理:EF Core Migrations 維持遷移快照的有效性;執行期升級路徑透過 IF NOT EXISTS 檢查實際套用 schema 變更,並以冪等的啟動檢查作為安全網。再加上失效外鍵自動修復——手動升級刪掉舊表後,SQLite 無法直接移除仍指向它的外鍵約束(只能整表重建),殘留的死外鍵會在 foreign_keys=ON 下讓後續寫入靜默失敗;升級流程因此加入通用掃描,偵測任何失效外鍵並以標準表重建手法安全移除,同時修復先前版本已受影響的資料庫。這些設計都源於實際踩過的坑——遷移記錄被寫入卻未實際執行對應 schema 變更、還原舊版備份後新增資料靜默失敗——進而催生出更穩健的防呆與自我修復機制。

3

安裝版與可攜版雙模式

.portable 標記檔自動偵測模式,兩種模式各有獨立的建置組態與專屬圖示。安裝版資料存於使用者資料夾、以 Inno Setup 打包、不需系統管理員權限;可攜版資料與執行檔放在一起、自包含單檔、隨身碟即插即用。所有資料庫路徑解析集中在同一層,避免路徑邏輯散落各處。

4

統一的對話框與 UI 元件層

全應用的彈窗皆透過統一的對話框元件處理,並針對 WPF Dispatcher 執行緒問題設計安全呼叫包裝,解決備份匯入流程中的執行緒例外。

5

穩健的備份與還原機制

備份匯出針對 SQLite 的 WAL 模式特別處理:使用 PRAGMA journal_mode=DELETE 並一併處理 -wal / -shm 檔案,避免資料庫損毀。還原時同時相容新舊兩種備份檔名,確保升級使用者的歷史資料不遺失。

6

啟動流程的防禦性設計

啟動時以 Mutex 實作單一實例控制,第二個實例會透過具名事件喚醒既有視窗後靜默退出;啟動即掛載全域例外捕捉,再依序執行自動遷移檢查、設定載入與首次啟動精靈分流。診斷日誌採「附加+大小輪替」,跨重啟保留證據而非每次啟動覆寫;未預期的例外除了完整落檔,也會向使用者顯示可見的錯誤對話框,避免「按了沒反應」這類無跡可循的靜默失敗。

7

對真實資料庫跑的自動化測試

資料庫是這個專案最容易出事的地方,因此測試不用記憶體替身,而是把資料路徑導向暫存目錄,對真實的 SQLite 檔案跑完整流程:全新建庫、重複初始化、舊版資料庫升級後的遷移記錄完整性、殘留失效外鍵的自動移除,以及「新增事件並讀回」的端到端驗證。其中一條專門核對「手動升級路徑補登的遷移清單」與組件內實際 Migration 完全一致——這正是前述踩坑的成因,現在缺一筆就直接紅燈。

解決的技術挑戰(節錄)

具代表性的踩坑與解法

SQLite 保留字處理

Values 為 SQLite 保留字,所有原生 SQL 須以引號跳脫,EF Core 自動處理而原生 SQL 不會,需逐一檢核。

EF Core 快取一致性

全面採用 AsNoTracking() 搭配 ChangeTracker.Clear(),避免單例 Context 在刪除後讀到過期資料。

WPF 轉換器作用域

BoolToVisibilityConverter 等轉換器必須宣告於各 Window / UserControl,因 DataTrigger 的實例化早於 Visual Tree 建立。

WPF 捲動事件攔截

ComboBox、DataGrid 等控制項會吃掉捲動事件,透過 PreviewMouseWheel 重新導向至外層 ScrollViewer。

版面初次計算時序

可見性指派須在建構式中同步設定,確保 ScrollViewer 的 ExtentHeight 在首次版面 pass 即正確計算。

Mark of the Web 問題

解決 Windows 應用控制政策對未簽章 DLL 的封鎖,提供 Unblock-File 解法。

設計理念

選擇怎麼做,比選擇做什麼更重要

避免過度工程

對於單人維護的本地 SQLite 應用,刻意不導入完整的 DI / 介面抽象,在可維護性與複雜度之間取得平衡。

拒絕破壞性的「重置按鈕」式設計

刪除操作應自動串聯清理關聯資料(例如刪除工作量紀錄時連帶移除對應的事件映射),而非交由使用者手動善後。

本地優先、隱私優先

所有資料留在使用者裝置的 SQLite 中,不依賴任何雲端服務或帳號。

先理解、再驗證、後實作

採方法論式的開發節奏,每次只處理一個問題並在輪次之間進行建置驗證。

技術棧總覽

從框架到發佈的具體組成

核心.NET 10 · C# · WPF / XAML · MVVM(RelayCommand / AsyncRelayCommand)
資料層SQLite · Entity Framework Core 10 · dotnet ef CLI(遷移管理) · Cornhsu.Labeling(自行開發的多型標籤套件)
測試xUnit(對真實 SQLite 檔案跑初始化與升級流程)
UI 元件MaterialDesignThemes(UI 元件) · WebView2
內容處理Markdig(Markdown 渲染) · ClosedXML(Excel 匯出) · Microsoft.Toolkit.Uwp.Notifications(Toast)
發佈dotnet publish 自包含單檔(win-x64) · 安裝版(Inno Setup)+ 可攜版(自包含單檔)
我在這個專案中的角色

唯一開發者,一路到底

作為唯一開發者,我負責了:整體系統架構與模組化設計、資料模型設計與多版本資料庫遷移策略(20 個 Migration 的演進管理)、全部前端 WPF / XAML 介面與互動邏輯、備份/通知/主題/密碼保護/跨模組標籤等共用服務、將自製標籤系統抽象成公開 NuGet 套件後再把應用整個遷移回套件驅動、安裝程式打包與雙模式發佈流程,以及從 PersonalAssistant 到 QuillNest 的重構與重新定位。

下載 · Download
QuillNest v3.1.8

兩種發佈型態任選:安裝版透過 Inno Setup 安裝至使用者目錄(無需管理員);可攜版自包含單檔,隨身碟即插即用。所有資料一律留在本機。

安裝版 Setup.exe · 約 77 MB · 即將提供 可攜版 Portable.zip · 約 76 MB · 即將提供
安裝版與可攜版皆經數位簽章(發行者顯示為 YU-MING HSU)。新版本累積信譽前,Windows SmartScreen 仍可能跳出提示,點「其他資訊 → 仍要執行」即可。