今天是鐵人賽第五天,主要在請AI同事建構後端功能。
遇到了一些容易忽略的眉角,例如你手動修的地方要提醒AI同事,不然他會幫你改回來XD
還有在請他計劃的時候,記得要補一句,等你確認了再執行。
不然你還來不及修改計劃跟你預計不符合的地方他就開始做了,是一件困擾的事情。
而在跟帳號密碼與ip等比較敏感的資料相關上,最好請他寫在一個檔案去引用。
這樣除了方面管理,也不容易出現敏感資料外洩的情況。
除此之外,今天也遇到了跟Python相關錯誤,引用時沒在正確地方放置__init__.py,AI同事一出錯就想用硬解的方式去處理,這也讓我覺得雖然AI同事給我很多幫助,但工程師本身不能被AI帶著跑,要思考一下錯誤的地方真的只能硬解嗎,還是只是錯誤用法造成而已。
最後,終於將pytest環境架設完成,沒有出現pytest相關的錯誤。
明天,則開始處理pytest測試出來的問題。
以下為今天的研究流程
首先一樣先請AI同事了解應用的進度
我給AI的指令:
@ai_context.md @README.md @軟體核心架構規劃.md @功能需求總覽.md 了解目前現況
了解了之後,我請他告訴我計劃優先開發哪些功能
我給AI的指令:
@agents/engineering/backend-architect.md 請告訴我你計劃優先開發哪些後端功能
AI同事給出的回應為
階段一:基礎架構與核心使用者管理
- 專案初始化與環境設定
- 使用者與權限管理
階段二:核心專案與任務管理
- 專案管理
- 任務管理 (依賴於「專案管理」)
- 時間追蹤 (與「任務管理」緊密相關)
看來他還記得我們昨天討論的內容
接下來我請他告訴我他階段一的建構計劃
我給AI的指令:
請先專注在階段一,告訴我你計劃如何建構
✦ 好的,針對「階段一:基礎架構與核心使用者管理」,我將分兩部分進行建構:
第一部分:專案初始化與環境設定
我將執行以下步驟來建立後端專案的基礎環境:
- 建立後端資料夾:在專案根目錄下建立 backend 資料夾。
- 建立 Python 虛擬環境:在 backend 資料夾內建立一個獨立的 Python 虛擬環境,以隔離專案依賴。
- 安裝核心依賴套件:安裝 FastAPI (Web 框架)、Uvicorn (ASGI 伺服器)、SQLModel (ORM)、Psycopg2 (PostgreSQL
資料庫驅動)、python-dotenv (環境變數管理)、passlib (密碼雜湊) 和 python-jose (JWT 處理)。- 產生
requirements.txt
:將所有已安裝的依賴套件及其版本記錄到 backend/requirements.txt 檔案中。- 建立 FastAPI 應用程式骨架:建立 backend/main.py 作為 FastAPI
應用程式的入口點,並加入一個簡單的測試路由以驗證服務是否正常啟動。- 建立
.env
檔案:用於儲存資料庫連線字串和 JWT 密鑰等敏感資訊。第二部分:使用者與權限管理
在基礎環境建立完成後,我將著手實作使用者與權限管理功能:
- 定義資料庫模型 (SQLModel):
- 建立 User 模型,包含使用者 ID、使用者名稱、電子郵件、雜湊密碼、啟用狀態、是否為超級使用者等欄位。
- 建立 Role 模型,用於定義不同的使用者角色(例如:管理員、普通使用者),並建立 User 與 Role 之間的關聯。
- 資料庫連線與初始化:
- 設定 PostgreSQL 資料庫連線。
- 建立一個工具函數,用於在應用程式啟動時自動建立所有定義的資料庫表格。
- 實作認證與授權邏輯:
- 密碼雜湊:使用 passlib 庫對使用者密碼進行安全雜湊處理。
- JWT 認證:實作基於 JWT (JSON Web Token) 的使用者認證機制,包括:
- 生成 JWT 令牌。
- 驗證 JWT 令牌並從中提取使用者資訊。
- 使用者相關 API 路由:
- 註冊使用者:提供一個 API 端點供新使用者註冊。
- 登入:提供一個 API 端點供使用者登入,成功後返回 JWT 令牌。
- 取得當前使用者:建立依賴項,用於從 JWT 令牌中獲取當前已認證的使用者資訊。
- 權限檢查:建立依賴項,用於檢查使用者是否具有特定角色或權限(例如:只有超級使用者才能存取的路由)。
- 模組化路由:將使用者相關的 API 路由組織到獨立的檔案中(例如:routers/users.py 和 routers/auth.py),並在
main.py 中引入。
這時有一些失誤,我本來想他把計劃列出來討論完再開始,但由於我指令沒有下好,導致他計劃完就直接執行了
不過由於看起來沒有特別的問題,我就沒阻止他繼續
他建構資料夾與一些功能後
我先去.env修改一些敏感資料例如SECRET_KEY和資料庫帳密
將資料修改成你自己的內容確保安全
接下來我打算測試他建構的功能,不過首先避免他又擅自執行,我先告訴AI同事等我說好再執行
我給AI的指令:
先暫停,等我說階段二繼續開發再繼續
但要測試前,由於功能需要依附資料庫才能正常運作,我請AI同事先幫我建構一個資料庫容器
我給AI的指令:
請先幫我先用容器建構一個postgredb,並在裡面建立一個測試用資料庫,@backend/.env 在裡面寫入測試資料庫的連線資料,供測試使用
不過這邊,由於我之前有安裝docker desktop所以可以直接執行,如果沒有就要先建構自己電腦的容器環境
等待他把相關image的檔案下載後,應該就會啟動了
結果他忘記我說在postgredb測試,他直接寫了用sqlite測試的程式,結果就出錯了,而且他還把資料庫帳密直接放在docker-compose.yml裡面,這之後如果想做github上傳會有很大的資安風險
還有就是由於我之前沒跟他說我手動更新了資料,結果他又把資料還原成舊的
我只好跟AI同事好好說明,請他把敏感資訊都放在.env,因為檔案之後我會叫他不會上傳,並跟他說我的測試資料庫是postgredb不是sqlite
我給AI的指令:
首先,我更新了帳密 @backend/.env 請不要去蓋過我的資料,第二,@docker-compose.yml 帳密相關請將開一個.env的檔案去存放敏感資料。第三,我測試的資料庫是postgredb不是sqlite,請修正程式內容
還有為了他以後記得這件事,我特別請AI同事去記住敏感資料要另外放
我給AI的指令:
請記得,像ip、帳密、key...等敏感資料,不能放在程式裡面,而是外部寫一個.env去引用
之後AI同事給了我測試用指令
請你幫我檢查目前功能需要的套件,並幫我安裝
然後出現下一個問題,他出現無法import的問題
from backend.main import app
E ModuleNotFoundError: No module named 'backend'
我直接貼錯誤碼給他,他想要硬解用 sys.path去把路徑添加近來,而且還說這可能不是最佳實踐
我覺得這不是好的做法,於是我提示AI同事檢查__init__.py的用法,是不是有資料夾沒有
AI同事才想起來我的tests資料夾也要放__init__.py才能正確被解析
(我覺得這個操作已經需要一點程式經驗了,因此我認為與AI共事,還是要學習,不然很容易被AI偷埋奇怪的用法)
解決完這個問題,再加上後面出現的有些相依套件安裝後,pytest環境到此終於架構完成,可以執行了。
比想像中花了更多的時間在處理建置的問題,不過一開始能把這些相關建置好,之後在處理功能上的問題就能排除掉相關因素~
今天時間差不多了,明天進度應該是處理pytest測試的錯誤訊息