个人网站制作 Part 7 添加用户认证和数据库集成 | Web开发项目

文章目录

  • 👩‍💻 基础Web开发练手项目系列:个人网站制作
    • 🚀 用户认证与数据库集成
      • 🔨添加用户认证
        • 🔧步骤 1: 使用Passport.js
      • 🔨集成数据库
        • 🔧步骤 2: 使用MongoDB和Mongoose
    • 🚀 预览与保存
    • 🚀 下一步计划


👩‍💻 基础Web开发练手项目系列:个人网站制作

欢迎回到基础Web开发练手项目系列!

在前几篇博文中,我们已经创建了个人网站的基本结构、样式、导航栏、项目展示、联系信息、表单交互、动画效果、页面滚动效果、响应式设计、性能优化和页面动画。

在本篇中,我们将学习如何添加用户认证和数据库集成,进一步提升网站的功能性。

在这里插入图片描述

🚀 用户认证与数据库集成

🔨添加用户认证

🔧步骤 1: 使用Passport.js
  1. 安装Passport.js和相关策略。
npm install passport passport-local express-session
  1. server.js 文件中配置Passport.js。
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

// 添加Passport初始化和session支持
app.use(passport.initialize());
app.use(passport.session());

// 使用本地策略进行身份验证
passport.use(new LocalStrategy(
    (username, password, done) => {
        // 在这里进行用户身份验证逻辑
        // 示例:检查用户名和密码是否匹配数据库中的记录
        if (username === 'user' && password === 'password') {
            return done(null, { id: 1, username: 'user' });
        } else {
            return done(null, false, { message: '用户名或密码错误' });
        }
    }
));

// 将用户信息存储到session中
passport.serializeUser((user, done) => {
    done(null, user.id);
});

// 从session中恢复用户信息
passport.deserializeUser((id, done) => {
    // 示例:从数据库中获取用户信息
    const user = { id: 1, username: 'user' };
    done(null, user);
});
  1. 添加登录路由和身份验证中间件。
app.post('/login',
    passport.authenticate('local', {
        successRedirect: '/',
        failureRedirect: '/login',
        failureFlash: true
    })
);

app.get('/login', (req, res) => {
    res.send('登录页面');
});

app.get('/logout', (req, res) => {
    req.logout();
    res.redirect('/');
});

🔨集成数据库

🔧步骤 2: 使用MongoDB和Mongoose
  1. 安装Mongoose。
npm install mongoose
  1. server.js 文件中配置Mongoose。
const mongoose = require('mongoose');

// 连接MongoDB数据库
mongoose.connect('mongodb://localhost:27017/mywebsite', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

// 定义用户模型
const userSchema = new mongoose.Schema({
    username: String,
    password: String
});

const User = mongoose.model('User', userSchema);
  1. 修改Passport本地策略,从数据库中验证用户。
passport.use(new LocalStrategy(
    async (username, password, done) => {
        try {
            // 在数据库中查找用户
            const user = await User.findOne({ username });

            // 检查密码是否匹配
            if (!user || user.password !== password) {
                return done(null, false, { message: '用户名或密码错误' });
            }

            return done(null, user);
        } catch (error) {
            return done(error);
        }
    }
));

🚀 预览与保存

确保保存所有文件并在浏览器中预览你的网站。你现在应该看到一个拥有用户认证和数据库集成的更加功能强大的个人网站了!

🚀 下一步计划

在下一篇文章中,我们将学习如何添加更多高级功能,例如电子邮件通知、社交媒体集成等。记得继续关注本系列,为你的网站增添更多强大的功能!

通过这个项目,你已经学到了Web开发中许多重要的基础知识,并通过添加用户认证和数据库集成使你的网站更为完善。祝你编码愉快,不断拓展技能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328044.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

48 分布式id的生成策略

1.UUID 1.UUID (Universally Unique Identifier),通用唯一识别码。UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。UUID由以下几部分的组合: 1.当前日期和时…

Apache Solr <= 8.8.1任意文件读取漏洞复现CVE-2019-17558

一、环境准备 搭建环境vulhub,需要提前安装docker环境 docker安装:docker--安装docker-ce-CSDN博客 vulhub地址:https://github.com/vulhub/vulhub #创建靶场环境 mkdir /opt/vulhub cd /opt/vulhub git https://github.com/vulhub/vulhu…

<软考高项备考>《论文专题 - 71 风险管理(3)》

3 过程2-识别风险 3.1 问题 4W1H过程做什么是识别单个项目风险以及整体项目风险的来源,并记录风险特征的过程。作用:1、记录现有的单个项目风险,以及整体项目风险的来源:2、汇总相关信息,以便项目团队能够恰当地应对已识别的风险。为什么做…

编译原理1.3习题 程序设计语言的发展历程

图源:文心一言 编译原理习题整理~🥝🥝 作为初学者的我,这些习题主要用于自我巩固。由于是自学,答案难免有误,非常欢迎各位小伙伴指正与讨论!👏💡 第1版:自…

【Java SE语法篇】11.异常

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 文章目录 1. 异常的概念和体系结构1.1 异常的概念1.2 异常体系…

企业微信开发:自建应用:access_token

access_token 过期后接口响应 access_token 已经过期(2小时)后,调用接口的响应;本文中以发送消息接口为例,说明接口响应的情况。 官方开发文档链接:获取access_token access_token 过期后调用接口 响应体 …

大模型学习与实践笔记(六)

一、finetune 简介 两种微调模式:增量预训练 与指令跟随 1.增量预训练 2.指令微调 二、LoRA 与 QLoRA 介绍 三、XTuner 介绍 四、低显存玩转LLM的方法

ASP.NET Core 的 Web Api 实现限流 中间件

Microsoft.AspNetCore.RateLimiting 中间件提供速率限制(限流)中间件。 它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下: RateLimiterOptionsExtensions 类提供下列用…

【jupyter添加虚拟环境内核(pytorch、tensorflow)- 实操可行】

jupyter添加虚拟环境内核(pytorch、tensorflow)- 实操可行 1、查看当前状态(winR,cmd进入之后)2、激活虚拟环境并进入3、安装ipykernel5、完整步骤代码总结6、进入jupyter 添加pytorch、tensorflow内核操作相同,以下内容默认已经安…

Python - 深夜数据结构与算法之 Sort

目录 一.引言 二.排序简介 1.排序类型 2.时间复杂度 3.初级排序 4.高级排序 A.快速排序 B.归并排序 C.堆排序 5.特殊排序 三.经典算法实战 1.Quick-Sort 2.Merge-Sort 3.Heap-Sort 4.Relative-Sort-Array [1122] 5.Valid-anagram [242] 6.Merge-Intervals […

idea设置编辑器背景颜色

文章目录 一、Ided常用工具栏显示二、更改idea主题设置三、设置代码编辑器背景颜色为豆沙绿四、设置新项目 默认Jdk配置、maven配置1、settings for new projects2、structre for new projects 五、修改代码中注释的字体颜色六、设置编辑器字体大小七、文件编码的设置(可以设置…

leetcode-344. 反转字符串、9. 回文数

题目1: 解题方法 直接用reverse()即可 代码: class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: None Do not return anything, modify s in-place instead."""return s.reverse()如果不…

翻译: Pyenv管理Python版本从入门到精通二

Pyenv系列: 翻译: Pyenv管理Python版本从入门到精通一 1. 高级 Pyenv 用法 1.1 在 pyenv-virtualenv 中使用虚拟环境 可以使用 pyenv-virtualenv 扩展 Pyenv 来管理虚拟环境。这是隔离项目环境并有效管理其依赖项的好方法。以下是使用 pyenv-virtualenv 创建虚…

C# 面向切面编程之AspectCore实践(二)

写在前面 在上一篇中对AspectCore进行了初步的了解,用于拦截的属性加在了具体类的方法上。 C# 面向切面编程之AspectCore初探 这一篇验证一下把拦截属性加在接口上,这样实现该接口的类中所对应的方法都会被拦截到;另外示例中还尝试对方法的…

如何从命令行运行testng.xml?

目录 创建一个新的java项目并从命令行运行testng.xml 使用命令行运行XML文件 从命令行运行现有maven项目的XML文件 在这篇文章中,我们将使用命令行运行testng.xml。有多种场景需要使用命令行工具运行testng.xml。也许您已经创建了一个maven项目,现在想…

【VTKExamples::PolyData】第三期 DecimatePolylineDeleteCell

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例 DecimatePolyline折线抽取和 DeleteCell样例,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. DecimatePo…

YOLOv8改进 | 主干篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络PE-YOLO中的PENet,PENet通过拉普拉斯金字塔将图像分解成多个分辨率的组件,增强图像细节和低频信息。它包括一个细节处理模块(DPM),用于通过上下文分支和边缘分支增强图像细节,以及一个低频增强滤波器(LEF),…

C语言经典算法之顺序查找算法

目录 前言 A.建议 B.简介 一 代码实现 二 算法时空复杂度 A.时间复杂度: B.空间复杂度: 三 优点和缺点 A.优点: B.缺点: 四 现实中的应用 前言 A.建议 1.学习算法最重要的是理解算法的每一步,而不是记住算…

steam搬砖项目风险在哪里?这几点一定要记牢

你可能已经听说过Steam搬砖项目,这是一个通过在Steam平台充值美元,购买道具,然后将这些道具转移到BUFF平台进行交易,从而获取利润的方式。这个项目的操作方法主要是利用一些渠道和经验技巧,购买低价道具,然…

力扣每日一练(24-1-17):轮转数组

方法一:使用额外的数组 这个方法的思路是创建一个新的数组,然后将每个元素放到正确的位置上。新数组的第i个元素应该是原数组的第(i len(nums) - k) % len(nums)个元素。 def rotate(nums, k):n len(nums)rotated [0] * nfor i in range(n):rotated[(…