無法找到新鮮在地的農產品?想直接支持小農卻找不到管道?現在就上「Farmly」,購買在地新鮮食材,讓小農的心意直達您的餐桌!
「Farmly」是一個專為小農設計的銷售與交流平台,主要目的是幫助小農解決銷售渠道有限、無法直接接觸終端消費者等問題,也讓消費者可以買到最新鮮的食材。此平台讓小農能夠直接面向消費者銷售其農產品,並在固定的市集活動中展示其農產品。透過這個平台,我們希望縮短供應鏈,讓消費者能夠以更合理的價格購買到最新鮮的農產品,同時支持小農的生計與發展。
🔗 展示影片連結
-
註冊帳號
- 小農輸入基本資訊(如:使用者名稱、密碼、手機號碼、電子郵件等),系統會分配一個 farmer_id 給每位小農。
-
登入系統
- 使用手機號碼與密碼登入系統。
-
上架農產品
- 小農可以上架農產品,輸入產品種類、單位、重量、採收日期、有效日期、數量、價格等資訊。
-
查詢農產品上架記錄
- 小農可以查詢自己過去的上架農產品資訊。
-
參加農夫市集
- 小農可以查詢開放中的市集,並登記參加。
-
檢視獲得的評分
- 小農可以檢視消費者給自己的評分(1-5)。
-
註冊帳號
- 消費者輸入基本資訊(如:使用者名稱、密碼、手機號碼、電子郵件等),系統會分配一個 consumer_id 給每位消費者。
-
登入系統
- 使用手機號碼與密碼登入系統。
-
查詢農產品
- 消費者可以輸入產品種類與有效日期,查詢所有平台上的農產品。
-
調整購物車數量
- 加入:指定產品編號與數量,將其加入購物車。
- 刪除:指定產品編號與數量,將從購物車中刪除。
-
透過購物車下訂單
- 選擇欲下單的產品編號與數量,並輸入付款資訊與配送資訊。
-
查詢訂單歷史紀錄
- 消費者可以查詢自己過去的訂單記錄。
-
評價小農
- 消費者可以對小農評分與評論。
-
使用備份檔
farmly.backup
復原資料庫 -
輸入以下指令
pip install -r requirements.txt
-
輸入以下指令
cp .env.example .env
-
修改
.env
中的資料庫資訊,包含資料庫名稱 (DB_NAME)、使用者名稱 (DB_USER)、主機位置 (DB_HOST) 、通訊埠 (DB_PORT) 及密碼 (DB_PASSWORD)DB_NAME="farmly" DB_USER="postgres" DB_HOST="127.0.0.1" DB_PORT=5432 DB_PASSWORD="your_password"
-
預設連線通道如下,可至 server.py 及 client.py 修改
IP = 127.0.0.1 PORT = 8888
-
先執行
server.py
啟動伺服器:python server.py
-
再透過
client.py
向伺服器連線:python client.py
-
開始使用 Farmly!
- 使用 Socket 建立 client-server 連線,搭配 Multithreading 達成多人同時連線
- 資料庫使用 PostgreSQL,使用套件 Psycopg2 對資料庫進行操作
-
小農登記市集
- 在此功能中,系統將檢查市集是否符合可供登記之條件(市集尚未開始,且市集中尚有剩餘攤位未被分配)。
- 若條件不符,系統將使用
db.rollback()
方法撤回該次交易,防止在登記記錄中插入無效數據。 - 若條件符合,系統會在插入登記記錄後執行
db.commit()
提交交易,確保登記操作的完整性與正確性。
-
消費者增加/減少購物車數量
- 在此功能中,系統將檢查該商品庫存/購物車數量是否充足。
- 若庫存/購物車數量不足,系統將使用
db.rollback()
方法撤回該次交易,避免插入/刪除不合理的購物車數據。 - 充足時則增加/減少購物車數量,並執行
db.commit()
提交交易。
-
消費者購買商品
- 在此功能中,系統將逐一檢查每個商品的庫存,確保所有商品的存量足以滿足消費者的購買需求。
- 若有任一商品庫存不足,系統將立即使用db.rollback()方法撤回該次交易,避免生成不完整的訂單。
- 若所有商品庫存皆充足,系統將計算訂單總金額,插入訂單紀錄及相應商品記錄,並從購物車中減少相應商品數量,最後執行 db.commit()提交交易,完成整個購買流程。
-
小農登記市集
- 系統在查詢市集中可登記攤位數量時,使用 FOR UPDATE 鎖定相關記錄,鎖定的範圍包括該市集的所有攤位及其分配記錄。
- 此機制可以確保在當前交易完成之前,其他交易無法修改該市集的相關數據,避免因攤位不足導致的數據不一致問題。
-
消費者增加/減少購物車數量
- 系統在檢查商品庫存的查詢中使用了 FOR UPDATE 鎖定庫存相關的記錄。
- 此機制能有效阻止其他交易在當前交易完成之前修改同一商品的庫存數據,避免多個交易同時檢查庫存時可能發生的競爭問題,如超賣或數據錯誤,確保商品庫存數據在併行操作下的一致性。
-
消費者購買商品
- 系統在檢查商品庫存的查詢中使用了 FOR UPDATE 鎖定 Product_upload_Batch 和 Order_contain_product 表中的相關記錄。
- 此機制能確保在當前交易完成之前,其他交易無法修改相同商品的庫存數據,從而防止超賣或訂單錯誤。
- 檢查完成後,鎖定範圍會延續至交易提交,以確保插入訂單及商品記錄時仍維持數據的一致性。
-
server.py
- 包含伺服器端的主要功能。
- 在連接資料庫後,透過 socket 建立監聽服務,接收來自客戶端的連線請求。
- 每當接收到一個客戶端連線,會啟動一個獨立的執行緒(thread) 處理該連線,確保伺服器能並行處理多個客戶端。
-
client.py
- 包含客戶端的主要功能。
- 持續從伺服器接收訊息並顯示於終端機。
- 當訊息包含特定標籤(tag)時,根據標籤執行對應的操作,例如讀取使用者輸入、解析 CSV 檔案、關閉 socket 連線並結束程式。
-
action_handler.py
- 處理客戶端的所有需求,決定要呼叫哪些
db_utils.py
中的 function,及返回哪些結果給客戶端。
- 處理客戶端的所有需求,決定要呼叫哪些
-
db_utils.py
- 封裝與資料庫相關的功能,包含資料庫連線管理與查詢操作。
-
role
資料夾- 為支援未來擴展更多角色類型(如 Farmer 和 Consumer 之外的角色),將角色實作為類別,並繼承基底類別 Role。
- 每個角色類別共享基底類別的通用功能,並可擴展定義角色特有的行為與權限。
- macOS 14.5
- Python: 3.11.6
- psycopg2: 2.9.10
- tabulate: 0.9.0
- python-dotenv: 1.0.1
- PostgreSQL: 14.13