昨天已經完成了50 % 左右的登次系統,
今天我們來把功能做得更完善~
login.ejs  頁面的時候,是不是有打一個 POST /login 的方法,將帳號和密碼資料傳給 /login,    // routes/modules/login.js
    // 處理 POST 請求,驗證登入
    router.post('/', (req, res) => {
      const { username, password } = req.body // 從 POST 請求中獲取用戶名和密碼
      // 在這裡您可以實現用戶驗證邏輯,例如檢查用戶名和密碼是否有效
        // 先寫死帳號密碼做測試
      if (username === 'abby' && password === 'abby') {
        // 登入成功
        req.session.user = username // 在會話中存儲用戶信息
        res.redirect('/') // 登入成功後重定向到主頁或其他頁面
      } else {
        // 登入失敗
        res.render('login', { error: 'Invalid username or password' }) // 顯示錯誤信息
      }
    })
現在,我們可以正式來測試一下了!
我們在瀏覽器打上 http://localhost:3000,因為我們還沒有登入過,所以應該在按 Enter 的時候,會被導轉到 login 頁。
在瀏覽器打上 http://localhost:3000。

按 Enter 後因為 middleware 會先判斷是否有登入狀態,因為沒有登入過所以被導轉。

打上我們剛剛寫死的帳號密碼 。
→ 以我為例就是帳號密碼都是 abby 。

可以順利的登入我們的首頁了~
因為我們設定的 session 已經有記住我們的登入狀態,所以我們可以在瀏覽器重整,
都不會再導去登入頁。

現在確認了我們的頁面沒問題後,可以再加入記錄使用者資訊的資料庫。
創建名為 user 的資料庫。
    CREATE TABLE `user` (
      `id` int NOT NULL AUTO_INCREMENT,
      `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
      `password` varchar(255) 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,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
在我們的註冊和登入頁面,加上與使用者資料與資料庫使用者比對的相關程式。
// routes/modules/login.js
router.post('/', async (req, res) => {
  const { username, password } = req.body // 從 POST 請求中獲取用戶名和密碼
  let userData
  try{
		// 查詢是否已有註冊過
    userData = await user.findOne({
      where: {
        username: username,
      }
    ,raw: true})
  }catch(error){
    console.error("An error occurred:", error)
  }
	// 如果沒註冊過,拋出錯誤
  if(!userData){
    res.render('login', { 'error': 'Account not found' }) 
  } 
	// 如果有註冊過,但帳號密碼比對有誤,拋出錯誤
  if (username !== userData.username && password !== userData.password){
    res.render('login', { 'error': 'Invalid username or password.' }) 
  }
  if (username === userData.username && password === userData.password) {
    // 登入成功
    req.session.userId = userData.id
    req.session.user = userData.username 
    res.redirect('/') // 登入成功後重定向到主頁或其他頁面
  } else {
    // 登入失敗
    res.render('login', { 'error': 'Invalid username or password' }) // 顯示錯誤信息
  }
})
    // routes/modules/signIn.js
    router.post('/', async(req, res) => {
      const { username, password } = req.body // 從 POST 請求中獲取用戶名和密碼
      let userData
      try {
            // 查詢是否已有註冊過
        userData = await user.findOne({
          where: {
            username: username,
          }
        ,raw: true})
      }catch(error){
        console.error("An error occurred:", error)
      }
        // 如果有註冊過,拋出錯誤
      if(userData) res.render('signIn', { 'error': 'This account is already registered.' }) 
        // 如果沒有註冊過,新增新使用者資料
      await user.create({ username: username, password, password }, { raw: true })
      res.render('signIn', { 'error': 'Registration successful. Please go to the login page to log in again.' }) 
    })
以上就完成了哦!可以完整試一次流程,並檢查是否可以寫入使用者資料。

以上其實功能已經完成了,但查看資料庫都可以看到使用者帳號密碼,
不是很奇怪嗎?這樣誰敢存資料在我們的網站XD
所以們需要增加我們資料的安全,這部分我們明天再說啦~