从零开始用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.mzph.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…