想租書又怕手忙腳亂?ReadMe! 是你的閱讀好幫手!會員可查書況、預約、續借、查罰金、看歷史紀錄,還有搜尋紀錄與熱門排行榜超貼心。店員也能輕鬆管理書籍、處理借還書與儲值,營運分析一次搞定!
在開始之前,請確保您的系統已安裝以下軟體:
- Node.js: 14.0 或更高版本(建議使用 18+)
- npm: 隨 Node.js 一起安裝
- PostgreSQL 資料庫: 使用 Supabase(免費)或本地 PostgreSQL
- MongoDB: 使用 MongoDB Atlas(免費)或本地 MongoDB
# 檢查 Node.js 版本
node --version
# 檢查 npm 版本
npm --version
# 檢查 Git 版本
git --versiongit clone <repository-url>
cd README本專案包含三個 package.json 檔案,分別用於不同用途:
- 根目錄
package.json:用於資料庫腳本和範例程式碼(僅用於測試連接) backend/package.json:後端應用程式依賴(必需)frontend/package.json:前端應用程式依賴(必需)
# 安裝後端依賴(必需)
cd backend
npm install
# 安裝前端依賴(必需)
cd ../frontend
npm install
# 安裝根目錄依賴(可選,僅用於資料庫連接測試腳本)
cd ..
npm install在專案根目錄複製 .env.example 為 .env 檔案:
cp .env.example .env然後編輯 .env 檔案,填入實際的資料庫連接資訊。詳細說明請參考 環境變數設定 章節。
請參考 詳細安裝步驟 章節完成資料庫初始化。
開啟兩個終端視窗:
終端 1 - 啟動後端:
cd backend
npm run dev終端 2 - 啟動前端:
cd frontend
npm run dev在瀏覽器中打開:http://localhost:5173
請先完成資料庫帳號註冊和專案建立:
- Supabase: 前往 Supabase 註冊並建立新專案
- MongoDB Atlas(可選): 前往 MongoDB Atlas 註冊並建立免費 M0 叢集
然後參考 環境變數設定 章節取得連接字串並填入 .env 檔案。
- 登入 Supabase Dashboard
- 進入專案的 SQL Editor
- 依序執行以下遷移檔案(複製檔案內容到 SQL Editor 並執行):
database/relational/migrations/001_initial_schema.sqldatabase/relational/migrations/002_alter_book_publisher.sqldatabase/relational/migrations/003_add_top_up_table.sqldatabase/relational/migrations/004_fix_rental_price.sqldatabase/relational/migrations/005_fix_loan_rental_fee.sqldatabase/relational/migrations/006_add_reserved_status.sqldatabase/relational/migrations/007_fix_member_sequence.sql
如果使用
.backup檔案還原資料(步驟 3),通常已包含 Schema,可跳過此步驟。但建議先執行migration 確保 Schema 正確,再還原資料。
# 確保已設定 MONGODB_URI 環境變數
node database/non-relational/migrations/init_collections.js本專案根目錄已包含 .backup 檔案。
.backup 檔案是 PostgreSQL 的備份檔案,包含完整的資料庫結構和資料。還原方式如下:
方法 1: 使用 Supabase Dashboard(推薦)
- 登入 Supabase Dashboard
- 進入專案的 SQL Editor
- 在 SQL Editor 中,點擊右上角的 ... 選單
- 選擇 Restore from backup 或 Import SQL
- 上傳
.backup檔案(如果 Supabase 支援直接上傳) - 或使用以下 SQL 命令(如果備份是 SQL 格式):
-- 在 SQL Editor 中貼上 .backup 檔案的內容並執行
方法 2: 使用命令列
# 確保已設定 DATABASE_URL 環境變數
# 或在命令中直接使用連接字串
# 方法 A: 使用 pg_restore(適用於 .backup 格式)
pg_restore -d "postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres" \
--clean --if-exists .backup
# 方法 B: 使用 psql(適用於 SQL 格式的備份)
psql "postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres" < .backup
# 方法 C: 如果已設定環境變數
pg_restore -d $DATABASE_URL --clean --if-exists .backup
# 或
psql $DATABASE_URL < .backup重要提示:
- 還原備份會覆蓋現有資料,請在還原前確認
- 如果
.backup檔案是 SQL 格式,使用psql;如果是二進位格式,使用pg_restore- 如果還原失敗,請確認資料庫 Schema 已初始化(步驟 2)
如果不想使用 .backup 檔案,也可以:
匯入初始資料:
# 在 Supabase SQL Editor 中執行 database/relational/seed.sql
# 或使用命令列
psql $DATABASE_URL -f database/relational/seed.sql生成測試資料:
# 在 Supabase SQL Editor 中執行 database/relational/generate_mock_data.sql
# 或使用命令列
psql $DATABASE_URL -f database/relational/generate_mock_data.sql
generate_mock_data.sql會生成約 12,000 筆借閱記錄,執行時間可能較長。
在專案根目錄建立 .env 檔案,包含以下變數:
# DATABASE_URL 的 key
# 從 Supabase Dashboard → Settings → Database → Connection string (URI) 取得
# 將 [YOUR-PASSWORD] 替換為您的資料庫密碼
# 將 [PROJECT-REF] 替換為您的 Supabase 專案參考 ID
DATABASE_URL=postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres# MongoDB 連接字串(搜尋歷史功能需要)
# 從 MongoDB Atlas Dashboard → Connect → Connect your application 取得
# 將 XXXX 替換為您的 MongoDB 使用者名稱和密碼
MONGODB_URI=mongodb+srv://XXXX@read-me.XXXX.mongodb.net/?appName=read-me&retryWrites=true&w=majority
# MongoDB 資料庫名稱
MONGODB_DATABASE=read-me- 登入 Supabase Dashboard
- 選擇您的專案
- 進入 Settings → Database
- 在 Connection string 區塊選擇 URI
- 複製連接字串(格式:
postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres) - 將
[YOUR-PASSWORD]替換為您的資料庫密碼(在建立專案時設定的密碼) - 將
[PROJECT-REF]替換為您的 Supabase 專案 ID(連接字串中已包含,通常是專案名稱的一部分)
- 登入 MongoDB Atlas Dashboard
- 選擇您的叢集
- 點擊 Connect → Connect your application
- 複製連接字串(格式:
mongodb+srv://username:password@cluster.mongodb.net/) - 將連接字串中的使用者名稱和密碼替換為實際值
- 根據您的 MongoDB 設定,連接字串可能包含額外參數(如
appName、retryWrites等) - 確認
MONGODB_DATABASE設定為read-me(或您使用的資料庫名稱)
系統使用以下主要資料表:
MEMBERSHIP_LEVEL- 會員等級ADMIN- 管理員/店員MEMBER- 會員BOOK- 書籍基本資訊CATEGORY- 書籍分類BOOK_CATEGORY- 書籍與分類關係CONDITION_DISCOUNT- 書況折扣BOOK_COPIES- 書籍複本BOOK_LOAN- 借閱交易LOAN_RECORD- 借閱記錄詳情ADD_FEE- 額外費用RESERVATION- 預約記錄RESERVATION_RECORD- 預約與書籍關係TOP_UP- 儲值記錄
詳細 Schema 說明請參考:database/docs/schema_reference.md
search_history- 搜尋記錄(用於分析搜尋趨勢)
建議使用兩個終端視窗同時啟動前後端:
終端 1 - 啟動後端:
cd backend
npm run dev後端將運行在:http://localhost:3000
終端 2 - 啟動前端:
cd frontend
npm run dev前端將運行在:http://localhost:5173
啟動完成後,在瀏覽器中訪問 http://localhost:5173 即可使用系統。
- 訪問系統首頁
http://localhost:5173 - 選擇「會員登入」
- 輸入會員 ID 和密碼完成登入
情境:會員想要借閱《Python 程式設計》這本書(時機資料庫可能沒這本書...)
-
搜尋書籍:
- 在搜尋頁面輸入關鍵字「Python」或「程式設計」
- 系統會顯示相關書籍列表,包含書名、作者、出版社等資訊
- 點擊書籍卡片可查看詳細資訊
-
查看書籍詳情:
- 在書籍詳情頁面可以看到:
- 書籍基本資訊(書名、作者、出版社、價格)
- 書籍分類標籤
- 不同書況的複本數量(全新、良好、普通等)
- 各書況的租金價格(已套用會員等級折扣)
- 目前可借閱的複本數量
- 在書籍詳情頁面可以看到:
-
加入預約購物車:
- 如果書籍目前沒有可借複本,點擊「加入預約購物車」
- 系統會檢查會員餘額是否足夠支付預估租金
- 可以繼續瀏覽其他書籍,將多本書加入購物車
-
送出預約:
- 進入「預約購物車」頁面查看所有待預約的書籍
- 確認無誤後點擊「送出預約」
- 系統會為每本書分配一個
Reserved狀態的複本 - 預約成功後,可以在「我的預約」頁面查看預約記錄
-
查看借閱中:
- 在「借閱中」頁面可以看到目前所有借閱的書籍
- 顯示每本書的借出日期、應還日期、剩餘天數
- 如果尚未到期,可以點擊「續借」按鈕延長借閱期限(需支付續借費用)
-
查看借閱歷史:
- 在「借閱歷史」頁面可以查看所有過去的借閱記錄
- 包含已歸還和已取消的借閱
- 可以看到每筆借閱的完整資訊,包括是否有額外費用(逾期費、損壞費等)
-
取消預約:
- 在「我的預約」頁面可以看到所有預約記錄
- 每個預約以區塊(block)形式顯示,點擊可展開查看該預約包含的書籍
- 如果預約狀態為「進行中」,可以點擊「取消預約」
- 取消後,對應的
Reserved複本會自動變回Available狀態
- 熱門排行榜:
- 在「熱門排行榜」頁面可以查看當月最受歡迎的書籍
- 系統會顯示借閱次數最多的前 10 本書籍
- 可以了解目前最熱門的閱讀趨勢
- 訪問系統首頁
http://localhost:5173 - 選擇「管理員登入」
- 輸入管理員 ID 和密碼完成登入
情境:新會員註冊並儲值
-
新增會員:
- 在「會員管理」頁面點擊「新增會員」
- 填入會員基本資料(姓名、電話、電子郵件)
- 設定初始儲值金額(系統會自動根據儲值金額分配會員等級)
- 建立成功後,系統會顯示會員 ID 和初始餘額
-
搜尋會員:
- 可以使用會員 ID、姓名、電話或電子郵件搜尋
- 搜尋結果會顯示會員基本資訊、等級、餘額、狀態等
-
為會員儲值:
- 在會員列表中找到目標會員,點擊「新增儲值」
- 輸入儲值金額
- 系統會更新會員餘額,並根據儲值金額自動升級會員等級(如果符合條件)
情境:新增新書到系統
-
新增書籍:
- 在「書籍管理」頁面點擊「新增書籍」
- 填入書籍資訊(書名、作者、出版社、價格)
- 選擇書籍分類(可以選擇多個分類)
- 建立成功後,系統會顯示書籍 ID
-
新增書籍複本:
- 在書籍詳情頁面點擊「新增複本」
- 選擇書況(全新、良好、普通、差)
- 系統會根據書況自動計算租金價格
- 可以一次新增多個複本
-
更新複本狀態:
- 在複本列表中可以看到每個複本的序號、書況、狀態、租金
- 可以更新複本的書況或狀態(Available、Borrowed、Reserved、Lost)
- 更新書況時,系統會自動重新計算租金
情境:會員到店借書
-
確認會員身份:
- 在「櫃檯借書」頁面輸入會員 ID,點擊「確認會員」
- 系統會顯示會員資訊(姓名、等級、餘額、可借天數)
-
加入借書列表:
- 輸入書籍 ID 和複本序號,點擊「加入列表」
- 系統會驗證複本是否可借,並顯示該複本的租金
- 可以繼續加入多本書籍到借書列表
-
辦理借書:
- 確認借書列表無誤後,點擊「辦理借書」
- 系統會檢查:
- 會員餘額是否足夠支付總租金
- 是否超過會員可借閱本數上限
- 如果餘額不足,會顯示錯誤訊息(此時可以為會員儲值後再試)
- 借書成功後,系統會:
- 扣除會員餘額
- 更新複本狀態為
Borrowed - 建立借閱記錄
- 如果該會員有預約該書,會自動更新預約狀態為
Fulfilled
情境:會員歸還書籍
-
單筆還書:
- 在「櫃檯還書」頁面輸入借閱 ID、書籍 ID 和複本序號
- 選擇歸還時的書況(如果與借出時不同)
- 選擇是否遺失
- 點擊「辦理還書」
- 系統會自動計算:
- 逾期費用(如果超過應還日期)
- 損壞費用(如果書況變差)
- 遺失費用(如果標記為遺失)
- 從會員餘額扣除額外費用,更新複本狀態為
Available
-
批次還書:
- 可以一次處理多筆還書
- 系統會逐筆處理,顯示每筆的成功或失敗狀態
- 如果某筆還書失敗(例如餘額不足),不會影響其他筆的處理
情境:查看營運數據
-
選擇月份:
- 在「報表/統計」頁面選擇要查看的月份
- 系統會顯示該月的所有統計數據
-
查看統計摘要:
- 總借閱次數:該月的借閱總數
- 總收入:該月的租金和額外費用總和
- 活躍會員數:該月有借閱記錄的會員數量
- 借閱書籍種類數:該月被借閱的不同書籍數量
-
查看詳細統計:
- 按會員等級統計:顯示各等級(金、銀、銅)的借閱次數和參與會員數
- 熱門書籍:該月借閱次數最多的書籍排名
- 熱門類別:該月借閱次數最多的書籍分類排名
- 類別按等級分組:各類別在不同會員等級的借閱情況
EADME/
├── backend/ # 後端應用 (Express + TypeScript)
│ ├── src/
│ │ ├── routes/ # API 路由
│ │ ├── middleware/ # 中間件
│ │ ├── db.ts # PostgreSQL 連接
│ │ ├── mongodb.ts # MongoDB 連接
│ │ └── server.ts # 伺服器進入點
│ ├── dist/ # 編譯後的程式碼
│ └── package.json
├── frontend/ # 前端應用 (React + TypeScript)
│ ├── src/
│ │ ├── pages/ # 頁面元件
│ │ ├── components/ # 共用元件
│ │ ├── api/ # API 調用
│ │ ├── context/ # React Context
│ │ └── config/ # 配置檔案
│ └── package.json
├── database/ # 資料庫相關檔案
│ ├── relational/ # PostgreSQL 相關
│ │ ├── migrations/ # 資料庫遷移檔案
│ │ └── seed.sql # 初始資料
│ └── non-relational/ # MongoDB 相關
│ └── migrations/ # 遷移腳本
├── docs/ # 文檔
├── examples/ # 範例程式碼
├── .env # 環境變數(自己建立)
└── .backup # 資料庫備份檔案
解決方法:
- 確認已在專案根目錄創建
.env檔案 - 確認
.env檔案中包含DATABASE_URL - 確認連接字串格式正確
解決方法:
- 確認後端已啟動並運行在
http://localhost:3000 - 檢查
.env檔案中的VITE_API_BASE_URL(如果已設定) - 檢查瀏覽器控制台是否有 CORS 錯誤
解決方法:
- 確認 MongoDB Atlas 的 Network Access 已允許您的 IP
- 確認連接字串中的密碼已正確替換
- 如果不需要搜尋歷史功能,可以跳過 MongoDB 設定
解決方法:
- 確認已按順序執行所有遷移檔案
- 檢查是否有外鍵約束錯誤
- 確認資料庫使用者有足夠權限
解決方法:
- 檢查瀏覽器控制台的錯誤訊息
- 確認後端 API 正常運行
- 清除瀏覽器快取並重新載入
解決方法:
- 在 Supabase Dashboard 的 SQL Editor 中執行:
-- 刪除所有資料表(注意:這會刪除所有資料) DROP SCHEMA public CASCADE; CREATE SCHEMA public;
- 重新執行所有遷移檔案
解決方法:
請參考 步驟 3: 匯入資料 章節的詳細說明。本專案根目錄已包含 .backup 檔案,建議使用該檔案還原資料。
- 後端: Node.js + Express + TypeScript
- 前端: React + TypeScript + Vite
- 資料庫: PostgreSQL (Supabase) + MongoDB (Atlas)
MIT License
Copyright (c) 2025 陳竑齊、曾文儀、莊孟芸
如有問題,請聯絡團隊成員。
