iT邦幫忙

0

Day 16 | 逾期標示與統計 API:路由順序又出現了

  • 分享至 

  • xImage
  •  

今天讓網站能一眼看出哪些事項已經逾期,並在清單上方顯示統計數字。

今天做的事
後端新增 GET /api/todos/stats,用一條 SQL 一次算出四個數字:

SELECT
  COUNT(*) AS total,
  COALESCE(SUM(done), 0) AS done,
  COALESCE(SUM(CASE WHEN done = 0 THEN 1 ELSE 0 END), 0) AS pending,
  COALESCE(SUM(CASE WHEN done = 0 AND due_date IS NOT NULL
                     AND due_date < date('now', 'localtime') THEN 1 ELSE 0 END), 0) AS overdue
FROM todos

前端在清單上方顯示「共幾筆|未完成幾筆|已完成幾筆|已逾期幾筆」,未完成且已過截止日的項目會顯示紅字和「⚠ 已逾期」。新增、完成、刪除之後,統計數字都會跟著更新。

觀察

  • /api/todos/stats必須寫在/api/todos/:id前面。如果順序反過來,Express會把stats當成:id的值,先匹配到/:id那支路由,回傳找不到這筆待辦事項。這跟第三天的先寫的先贏是同一個道理,只是這次是動態路由和固定路徑搶位置
  • SUM在資料表是空的時候會回傳NULL,要用COALESCE(..., 0)轉成0,不然前端會顯示null
  • date('now', 'localtime')的'localtime'不能省。SQLite預設用UTC,台灣比UTC快8小時,不加的話,每天凌晨0點到8點之間,今天的判斷會差一天
  • 前端判斷逾期用的是 toLocaleDateString('sv-SE'),這個語系剛好會輸出 2026-10-07 這種格式,可以直接跟資料庫裡的日期字串比大小

心得
資料庫算好數字再傳給前端,比前端把整份清單抓下來自己算更合理,資料多了也不會拖慢畫面。逾期的判斷牽涉到時區,一個小小的'localtime'就能差一天,這種細節不實際測試很難發現。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言