內部管理與自動化任務派發系統
類別:Internal Tooling · Python · Security技術棧:Python · PyQt · PostgreSQL · Enterprise NAS · Discord API · SQL Security
背景
過去團隊使用 Google Sheets 追蹤任務,這個方案有幾個根本性的問題:
- 沒有權限控管:任何人都可以修改任何人的資料
- 沒有狀態通知:任務完成了、被分派了,都要靠口頭通知
- NAS 文件管理脫鉤:Sheets 上的任務跟 NAS 上的實際檔案沒有連結
- 維護困難:Sheets 格式容易被不小心破壞
我從零獨立開發了這套集中化管理平台來取代它。
系統功能
1. 圖形化介面(PyQt GUI)
考量到使用者以非技術背景的人員為主,前端採用 PyQt 開發桌面應用程式,提供直覺的圖形化介面,無需使用命令列或學習任何技術工具。
2. 角色權限控管(RBAC)
系統實作了基於角色的存取控制:
- 管理員:可查看所有任務、分派任務、修改任務狀態、管理使用者
- 一般使用者:只能看到被分派給自己的任務,無法修改他人資料
- 唯讀角色:僅能查看特定資料,適合外部協作者
每個操作都會驗證當前使用者的權限,防止越權存取。
3. 強制版本檢查與自動更新
為了降低後續維護成本,我設計了強制版本更新機制:
- 應用程式啟動時,自動向內部伺服器查詢最新版本號
- 若版本落後,強制進入更新流程,自動下載新版安裝包
- 安裝完成後重新啟動,進入最新版本
這確保了所有人的操作環境一致,排除「我的版本跟你的不一樣」的問題。
4. NAS 文件整合與一鍵上傳
使用者可以直接在介面中管理 NAS 上的文件:
- 瀏覽 NAS 目錄結構(依權限過濾顯示)
- 一鍵上傳本地檔案至 NAS 指定目錄
- 任務與 NAS 上的相關文件自動關聯
5. SQL Injection 防護
所有資料庫操作一律採用參數化查詢(Parameterized Queries):
python
# 錯誤示範(字串拼接,有 SQL Injection 風險)
cursor.execute(f"SELECT * FROM tasks WHERE user_id = '{user_input}'")
# 正確做法(參數化查詢)
cursor.execute("SELECT * FROM tasks WHERE user_id = %s", (user_input,))無論使用者輸入什麼,都不會被解釋為 SQL 指令,徹底阻絕 SQL Injection 風險。
6. Discord API 即時通知
這是最受團隊歡迎的功能。後端實作了資料庫狀態監聽邏輯:
- 任何任務的狀態發生變更(新增、分派、完成、逾期)
- 後端 Python 腳本偵測到變更
- 自動透過 Discord API 向指定頻道或指定使用者發送通知
python
import requests
def notify_discord(webhook_url, message):
payload = {"content": message}
requests.post(webhook_url, json=payload)
# 任務狀態更新時觸發
notify_discord(WEBHOOK_URL, f"任務「{task_name}」已被 {assignee} 完成 ✅")團隊不再需要手動追蹤任務狀態,Discord 頻道變成了自動更新的工作看板。
成果
- 取代 Google Sheets,成為團隊唯一的任務管理工具
- 權限控管解決了資料安全問題
- Discord 通知讓跨部門溝通達到零時差
- 自動更新機制確保維護成本極低
反思
這個專案讓我意識到:內部工具的設計品質直接影響團隊效率。一個設計不好的內部系統,每天都在浪費每個人幾分鐘,累積起來是巨大的成本。投資在正確的地方做好,長遠的效益遠超過開發成本。
