「家庭記帳本」專案心得

  1. 專案介紹

    功能:

    • 使用者能註冊、登入、登出。
    • 登入後,可以新增、刪除、修改、查詢自己的支出紀錄。
    • 可以紀錄支出的用途、金額、日期,並且為支出分類。
    • 可以用分類和月份,篩選要顯示的支出紀錄。

    Heroku 網址:https://still-oasis-68074.herokuapp.com/

    程式碼:https://github.com/Flora2020/expense-tracker

  2. 你為何會選擇這個專案?

    自己本身就有在記帳,管理收支狀況。因為想對這些紀錄有比較高的掌控權,所以我是自己用 LibreOffice 設計表格,而不是使用現成的記帳軟體。但使用起來還是很不方便,例如:

    我每個月新增一個 LibreOffice 表格,然後把不同帳戶的收支狀況(例如各個銀行的帳戶、悠遊卡、現金、借貸等等)都獨立成一張表格分頁,分頁之間設定連動關係,以便紀錄跨帳戶的情況,例如從郵局領錢放到錢包裡。但光是為了設定連動關係,表格就變得非常複雜,日後如果增加帳戶,又要額外設定非常多欄位。

    果然還是自己設計記帳軟體,比較一勞永逸。不過目前只有紀錄支出,沒有紀錄收入,也沒有紀錄支出來自哪個帳戶,需要增加的功能還很多。

  3. 你使用了什麼技術?

    在 Node.js 環境下,使用 Express 框架和 Handlebars 的模板引擎。CSS 套用了 Bootstrap 的框架。

    資料庫則是用 Mongoose 操作 MongoDB。

    用 passport 套件實作使用者驗證。

  4. 哪部分你相對能掌握?哪裡花了最多時間?
    • 較能掌握:

      沒有使用 passport 套件的地方,我大致明白收到瀏覽器的請求後,請求在伺服器中,按照什麼順序通過哪些 middleware。

    • 花最多時間:

      前端切版,以及調整 RWD。對 CSS 語法規則仍然不熟練,有時候寫了指令,卻沒有效果,而且完全不明白為什麼沒有效果。對於 Bootstrap 的框架到底設定了哪些東西,也了解得不夠全面。也覺得 class 的命名方式毫無規律,日後如果要維護,會是個災難。

  5. 過程中碰到什麼困難?又如何克服?(例如:查找網路文件)
    • 目標:

      想自訂 handlebars 的 helper,用來實作「使用者用月份篩選支出時,能保留使用者選擇的月份」。

    • 為什麼想用這個方式實作:

      月份和分類的 input type 都是下拉選單,都是使用 handlebars 的 each 方法,產生每個選項。但因為 each 方法的限制,無法判斷現在要產生的選項,是否就是使用者選擇的選項,所以無法在正確的地方加上 selected 屬性。

      最後,保留「選擇的分類」的實作方式,是把使用者所選擇的分類,紀錄在分類下拉選單中的 dataset。等瀏覽器畫完 DOM tree,再用引入的 .js 檔,將使用者選擇的選項加上 selected 屬性。但我覺得這麼做滿迂迴的,希望可以在畫 DOM tree 時就一併完成這個工作。所以想嘗試自訂 handlebars 的 helper。

    • 碰到的困難:

      參考[handlebars筆記]基本介紹與helper應用這篇文章,但是看不太懂 operators 在做什麼。這個問題解決後,另一個問題是,明明已經把「使用者選擇的月份」,傳入自訂 helper 的參數,但參數仍是 undefined。

    • 克服的方式:

      當我遇到看不懂的內容,其中一個嘗試是,多找幾篇類似文章來看,留意不同文章中的相同部分,幫助我篩選出重點,才不會花了時間,結果卻都是在枝微末節打轉。

      至於第二個問題,後來我發現,因為我是在 each 方法裡使用 helper,所以 helper 的參數來源,只能來自於 each 每次迭代的陣列元素。所以,把「使用者選擇的月份」加進陣列元素裡就可以了。

  6. 過程中你有對哪個技術有特別深刻的學習?

    增加使用者驗證功能時,有特別去了解跟資訊安全有關的概念,例如

    • 不要相信前端來的資料,後端一定要驗證一次資料:

      但是實際上要怎麼驗,我就不太清楚了。在「家庭記帳本」專案裡,目前有做後端驗證的,只有使用者輸入的日期,和註冊時填的 eamil(登入時的 email 沒有驗),而且我不確定我驗得夠不夠。

    • xss 攻擊:

      我去玩了 xss game,破完前三關,後面三關我就越來越不明白發生什麼事了。

      針對「家庭記帳本」專案,我目前的猜測是,使用者輸入的資料,我都是用 handlebars 的 {{}} 輸出,而不是 {{{}}},而且我是使用 mongoose 語法操作資料庫,不是使用原生資料庫查詢,所以可能有某種程度的安全性?

    • CSRF 攻擊:

      這完全超出我目前的能力範圍,我連 Request Header 都沒研究過。

    對於資訊安全,我需要學習的東西還有好多好多呢!

Comments

Popular posts from this blog

Alpha Camp 全端開發課程學習心得

在 javascript 用 regular expression 為金額加上千位數分隔符號

shop_platform - sqlalchemy.exc.TimeoutError