接下來的兩天,
我們就依照我們先前學到的,
來實際做一個簡單的書單專案吧!
與之前所新增的 booktest 資料表有點差別的地方,
就是有新增了一個 memberId 的欄位,來存放我們登入使用者的 id,
這樣我們每次登入首頁時,都可以取到開使用者所有書單資訊。
CREATE TABLE `book` (
  `id` int NOT NULL AUTO_INCREMENT,
  `bookName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
  `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `memberId` int NOT NULL,
  PRIMARY KEY (`id`),
  KEY `memberId` (`memberId`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
index.ejs
因為我們需要將書單列表、新增和刪除書本的功能加到畫面上,
所以需要調整我們畫面的 HTML。
新增書籍
<!-- 新增書籍的表單 -->
      <form action="/book" method="post">
        <label for="title">Book Name:</label>
        <input type="text" id="bookName" name="bookName" placeholder="Book Name" required>
        <button type="submit">Add Book</button>
        <br>
      </form>
顯示該使用者所有書單內容
if…else 的文法,不然如果沒有查找到資料時伺服器會報錯。<ul>
        <% if (books && books.length > 0) { %>
          <% books.forEach(function(book) { %>
            <li><%= book.id %>.<%= book.bookName %></li>
          <% }); %>
        <% } else { %>
          <li>No books available</li>
        <% } %>
      </ul>
刪除書籍的表單
我們只有顯示已有的書籍 id
需要注意一下因為 Form 本身只有支援 GET / POST 的請求方式,
為了實現我們昨天所學到的 RESTful API 提到 DELETE 刪除資源的方法,
需要利用套件來將方法做轉換,這部分在後面實作時詳細提到。
<!-- 刪除書籍的表單 -->
      <form action="/book" method="delete">
        <label for="bookToDelete">Delete Book's Id:</label>
        <select id="bookToDelete" name="id">
          <% if (books && books.length > 0) { %>
            <% books.forEach(function(book) { %>
              <option value="<%= book.id %>"><%= book.id %></option>
            <% }); %>
          <% } %>
        </select>
        <button type="submit">Delete Book</button>
      </form>
使用者所有書單內容 GET /index
// routes\modules\index.js
router.get('/', requireLogin, async (req, res) => {
  try {
		// 到資料庫找我們登入時依我們存在 session.userId 使用者,查找是否有書單。
    const books = await book.findAll({where:{
      memberId: req.session.userId
    },raw: true})
		// 將結果回傳至畫面。
    res.render('index',{'username': req.session.user, books: books})
  } catch (error) {
    throw new Error(error)
  }
})
如果沒有查詢到結果就會呈現 No books available 的字樣。

如果有資料的話就會顯示出書名的 id + 書籍的名稱。

是不是會有人詢問還沒新增書籍哪來的書單列表XD
別急~這我們明天會再繼續介紹!
大家明天見啦~