Skip to content

內部管理與自動化任務派發系統

類別: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. 強制版本檢查與自動更新

為了降低後續維護成本,我設計了強制版本更新機制:

  1. 應用程式啟動時,自動向內部伺服器查詢最新版本號
  2. 若版本落後,強制進入更新流程,自動下載新版安裝包
  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 即時通知

這是最受團隊歡迎的功能。後端實作了資料庫狀態監聽邏輯:

  1. 任何任務的狀態發生變更(新增、分派、完成、逾期)
  2. 後端 Python 腳本偵測到變更
  3. 自動透過 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 通知讓跨部門溝通達到零時差
  • 自動更新機制確保維護成本極低

反思

這個專案讓我意識到:內部工具的設計品質直接影響團隊效率。一個設計不好的內部系統,每天都在浪費每個人幾分鐘,累積起來是巨大的成本。投資在正確的地方做好,長遠的效益遠超過開發成本。