從零開始用react + tailwindcss + express + mongodb實現一個聊天程序(五) 實現登錄功能

1.登錄頁面

? 完善登錄頁面? 和注冊差不多 直接copy signUpPage 內容 再稍微修改下

import { useState } from "react";
import { useAuthStore } from "../store/useAuthStore";
import { MessageSquare,Mail,Lock,Eye, EyeOff,Loader2} from "lucide-react";
import {Link} from "react-router-dom"const LoginPage = () => {const [showPassword, setShowPassword] = useState(false)const[formData,setFormData] = useState({email:"",password:""})const {login,isLogging} = useAuthStore()const handleSubmit = async (e) => {e.preventDefault()await login(formData)}return (<div className="min-h-screen grid lg:grid-cols-2">{/*left side*/}<div className="flex flex-col justify-center items-center p-6 sm:p-12"><div className="w-full mt-10">{/* logo */}<div className="text-center mb-8"><div className="flex flex-col items-center gap-2 group"><div className="size-12 rounded-xl bg-primary/10 flex items-center justify-centergroup-hover:bg-primary/20 transition-colors"><MessageSquare className="size-6 text-primary"></MessageSquare></div><h1 className="text-2xl font-bold mt-2">歡迎回來</h1><p className="text-base-content/60">登錄賬戶</p></div></div>{/* form */}<form onSubmit={handleSubmit} className="space-y-6"><div className="form-control"><label className="label"><span className="label-text font-medium">郵箱</span></label>{/* 輸入框 */}<div className="relative"><div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"><Mail className="size-5 text-base-content/40" /></div><input type="text"className={`input input-bordered w-full pl-10`}placeholder="請輸入郵箱地址"value={formData.email}onChange={(e)=> setFormData({...formData,email:e.target.value})}></input></div></div><div className="form-control"><label className="label"><span className="label-text font-medium">密碼</span></label>{/* 輸入框 */}<div className="relative"><div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"><Lock className="size-5 text-base-content/40" /></div><input type={showPassword ? "text" : "password"}className={`input input-bordered w-full pl-10`}placeholder="請輸入密碼"value={formData.password}onChange={(e)=> setFormData({...formData,password:e.target.value})}></input><buttontype="button"className="absolute inset-y-0 right-0 pr-3 flex items-center"onClick={()=> setShowPassword(!showPassword)}>{showPassword ? (<EyeOff className="size-5 text-base-content/40" />) : (<Eye className="size-5 text-base-content/40" />)}</button></div></div><button type="submit"className="btn btn-primary w-full"disabled={isLogging}>{isLogging ? (<><Loader2 className="size-5 animate-spin"/>Loading...</>):("登錄")}</button></form><div className="text-center"><p className="text-base-content/60">沒有賬號?{""}<Link to="/signup" className="link link-primary">去注冊</Link></p></div></div></div>{/* right side */}</div>)
}export default LoginPage

這時我們的前端頁面就有了

?

2.測試

輸入我們注冊號的賬號 登錄 提示登錄成功!

3.頁面完善

?現在我們登錄和注冊右側缺一部分 我們補充上

在web下 新建components文件夾 再創建AuthImagePattern.jsx

const AuthImagePattern = ({title, subTitle}) => {return (<div className="hidden lg:flex items-center justify-center bg-base-200 p-12"><div className="max-w-md text-center mt-10"><div className="grid grid-cols-3 gap-3 mb-8">{[...Array(9)].map((_,i)=>(<div key={i}className={`aspect-square rounded-2xl bg-primary/10 ${i%2===0?"animate-pulse":""}`}></div>))}</div><h2 className="text-2xl font-bold mb-4">{title}</h2><p className="text-base-content/40">{subTitle}</p></div></div>)}export default AuthImagePattern

然后在singUpPage 和 LoginPage? 引入即可

import AuthImagePattern from "@/components/AuthImagePattern" 在right side使用

?{/* right side */}

? ? ? ? <AuthImagePattern title="加入我們" subTitle="發現新朋友,分享瞬間,享受樂趣,與你最心愛的人們保持聯系。"/>

效果如圖

4.認證優化?

問題思考? 當我們用戶已經登錄了 登錄token沒有過期 這時候我們應該讓用戶跳到首頁 如果token過期了 就重定向到login 頁面? 這時獲取用戶信息之前就需要進行用戶是否登錄的驗證 使用中間件來實現此功能

?回到后端server? 新建文件夾middleware 新建auth.middleware.js

在auth.route.js? 中新增一個路由

// 身份驗證

router.get('/check', protectRoute, checkAuth)

在auth.controller.js中 增加 checkAuth 方法 獲取返回的用戶信息

// 獲取登錄信息

export const checkAuth = ?(req,res) => {

? ? try {

? ? ? ? res.status(200).json(req.user)

? ? } catch (err) {

? ? ? ? res.status(500).json({ message: '內部服務器錯誤' })

? ? }

}

useAuthStore.js 補充

? isCheckingAuth: false, // 是否在獲取用戶信息中狀態

//? 獲取用戶信息方法

? ? checkAuth: async() => {

? ? ? ? // 獲取當前用戶信息

? ? ? ? try {

? ? ? ? ? ? const res = await axiosInstance.get('/auth/check')

? ? ? ? ? ? set({authUser: res.data})

? ? ? ? ? ? // 刷新頁面 判斷是否登錄

? ? ? ? ? ? get().connectSocket()

? ? ? ? } catch (error) {

? ? ? ? ? ? console.log("useAuthStore checkAuth error",error.message)

? ? ? ? ? ? set({authUser: null})

? ? ? ? } finally {

? ? ? ? ? ? set({isCheckingAuth: false})

? ? ? ? }

? ? },

?修改App.jsx

驗證結果 如圖checkAuth接口 獲取到了用戶信息跳轉到了 homePage

?

ok? ?這篇 就這樣把? 有問題歡迎評論留言!!喜歡的來個3連 謝謝!! 下篇 咱實現導航欄和 修改個人信息?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896458.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot電影評論網站系統設計與實現

隨著互聯網和娛樂產業的發展&#xff0c;電影評論網站逐漸成為人們分享觀影體驗、交流影評的重要平臺。本文將介紹一個基于Spring Boot框架開發的電影評論網站系統的功能設計與實現方案。 功能模塊概述 該電影評論網站系統分為管理員模塊和用戶模塊兩大核心部分&#xff0c;以…

XFeat:輕量級的深度學習圖像特征匹配

一、引言&#xff1a;圖像特征匹配的挑戰與XFeat的突破 在計算機視覺領域&#xff0c;圖像特征匹配是視覺定位&#xff08;Visual Localization&#xff09;、三維重建&#xff08;3D Reconstruction&#xff09;、增強現實&#xff08;AR&#xff09;等任務的核心基礎。傳統方…

【TVM教程】為 NVIDIA GPU 自動調度神經網絡

Apache TVM 是一個深度的深度學習編譯框架&#xff0c;適用于 CPU、GPU 和各種機器學習加速芯片。更多 TVM 中文文檔可訪問 →https://tvm.hyper.ai/ 作者&#xff1a;Lianmin Zheng 針對特定設備和工作負載的自動調優對于獲得最佳性能至關重要。本文介紹如何使用 auto-sched…

postgresql postgis擴展相關

項目 下載地址 http://rpmfind.net/linux/rpm2html/search.php?queryprotobuf(x86-64) Postgis Index of /postgis/source/ proj4 Index of /proj/ geos Index of /geos/ libxml2 ftp://xmlsoft.org/libxml2/ Index of /sources Json-c Releases json-c/json-c G…

解鎖健康密碼,擁抱養生生活

在快節奏的現代生活中&#xff0c;健康養生愈發重要&#xff0c;它是我們保持活力、預防疾病、享受美好生活的關鍵。那究竟如何開啟健康養生之旅呢&#xff1f; 合理飲食是養生基石。遵循 “食物多樣&#xff0c;谷類為主” 原則&#xff0c;每日攝入谷薯類、蔬菜水果、畜禽魚蛋…

JavaWeb中的cookie使用

Cookie 1、Cookie是服務端向客戶端響應的一小段數據&#xff0c;最終存放在客戶端中&#xff1b;之后客戶端每次向服務端發送請求&#xff0c;都會在請求頭中攜帶cookie 2、cookie是有時效性的&#xff0c;默認是Session級別&#xff08;整個瀏覽器關閉才會消失&#xff0c;內存…

el-input實現金額輸入

需求&#xff1a;想要實現一個輸入金額的el-input&#xff0c;限制只能輸入數字和一個小數點。失焦數字轉千分位&#xff0c;聚焦轉為數字&#xff0c;超過最大值&#xff0c;紅字提示 效果圖 失焦 聚焦 報錯效果 // 組件limitDialog <template><el-dialog:visible.s…

AcWing 藍橋杯集訓·每日一題2025·密接牛追蹤2

密接牛追蹤2 農夫約翰有 N 頭奶牛排成一排&#xff0c;從左到右依次編號為 1~N。 不幸的是&#xff0c;有一種傳染病正在蔓延。 最開始時&#xff0c;只有一部分奶牛受到感染。 每經過一個晚上&#xff0c;受感染的牛就會將病毒傳染給它左右兩側的牛&#xff08;如果有的話…

30 分鐘從零開始入門 CSS

HTML CSS JS 30分鐘從零開始入門拿下 HTML_html教程-CSDN博客 30 分鐘從零開始入門 CSS-CSDN博客 JavaScript 指南&#xff1a;從入門到實戰開發-CSDN博客 前言 最近也是在復習&#xff0c;把之前沒寫的博客補起來&#xff0c;之前給大家介紹了 html&#xff0c;現在是 CSS 咯…

LabVIEW圖像識別抗干擾分析

問題描述 在基于LabVIEW的探針定位系統中&#xff0c;存在兩個核心技術難點&#xff1a; 相機畸變導致初始定位誤差&#xff1a;非線性畸變使探針無法通過坐標變換直接精確定位&#xff0c;需采用粗定位圖像修正的兩段式控制策略。 圖像識別可靠性不足&#xff1a;復雜背景&a…

淺顯易懂HashMap的數據結構

HashMap 就像一個大倉庫&#xff0c;里面有很多小柜子&#xff08;數組&#xff09;&#xff0c;每個小柜子可以掛一串鏈條&#xff08;鏈表&#xff09;&#xff0c;鏈條太長的時候會變成更高級的架子&#xff08;紅黑樹&#xff09;。下面用超簡單的例子解釋&#xff1a; ?壹…

drupal如何支持多語言

Drupal 支持多語言的功能強大&#xff0c;可以幫助網站實現多語言內容管理。以下是如何在 Drupal 中配置和啟用多語言支持的步驟&#xff1a; 1. 啟用多語言模塊 首先&#xff0c;您需要確保已啟用 Drupal 的相關模塊。這些模塊包括&#xff1a; Language&#xff08;語言&a…

【HarmonyOS Next】鴻蒙應用折疊屏設備適配方案

【HarmonyOS Next】鴻蒙應用折疊屏設備適配方案 一、前言 目前應用上架華為AGC平臺&#xff0c;都會被要求適配折疊屏設備。目前華為系列的折疊屏手機&#xff0c;有華為 Mate系列&#xff08;左右折疊&#xff0c;華為 Mate XT三折疊&#xff09;&#xff0c;華為Pocket 系列…

SE注意力機制詳解:從原理到應用,全面解析Squeeze-and-Excitation模塊

Squeeze-and-Excitation (SE) 模塊的原理與應用 1. 引言&#xff1a;注意力機制的意義 在深度學習領域&#xff0c;注意力機制&#xff08;Attention Mechanism&#xff09;通過模擬人類視覺的“聚焦”特性&#xff0c;賦予模型動態調整特征重要性的能力。傳統卷積神經網絡&a…

Python基礎大全:Python變量詳解

以下是 Python 變量的詳細解析&#xff1a; 1. 變量的本質 Python 變量本質上是一個 指向對象的引用&#xff08;類似標簽&#xff09;&#xff0c;而不是存儲數據的容器。 變量賦值 a 10 時&#xff0c;Python 會創建一個整數對象 10&#xff0c;然后讓變量 a 指向這個對象…

減少內存占用的兩種方法|torch.no_grad和disable_torch_init

方法區別 在 PyTorch 中&#xff0c;disable_torch_init 和 torch.no_grad() 是兩種完全不同的機制&#xff0c;它們的作用和目的不同&#xff0c;以下是它們的區別&#xff1a; 1. disable_torch_init 作用&#xff1a;disable_torch_init 通常用于某些特定的框架或庫中&am…

數據挖掘工程師的技術圖譜和學習路徑

數據挖掘工程師的技術圖譜和學習路徑: 1.基礎知識 數據挖掘工程師是負責從大量數據中發現潛在模式、趨勢和規律的專業人士。以下是數據挖掘工程師需要掌握的基礎知識: 數據庫知識:熟悉關系數據庫和非關系數據庫的基本概念和操作,掌握SQL語言。 統計學基礎:了解統計學的基…

UE5 Computer Shader學習筆記

首先這里是綁定.usf文件的路徑&#xff0c;并聲明是用聲明著色器 上面就是對應的usf文件路徑&#xff0c;在第一張圖進行鏈接 Shader Frequency 的作用 Shader Frequency 是 Unreal Engine 中用于描述著色器類型和其執行階段的分類。常見的 Shader Frequency 包括&#xff1a…

提示學習(Prompting)

提示學習&#xff08;Prompting&#xff09;是一種利用預訓練語言模型&#xff08;Pre-trained Language Models, PLMs&#xff09;來完成特定任務的方法。它的核心思想是通過設計特定的提示&#xff08;Prompt&#xff09;&#xff0c;將任務轉化為預訓練模型能夠理解的形式&a…

解決單元測試 mock final類報錯

文章目錄 前言解決單元測試 mock final類報錯1. 報錯原因2. 解決方案3. 示例demo4. 擴展 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0…