express+vue+mongodb+session 实现注册登录功能

yizhihongxing

下面是详细讲解“express+vue+mongodb+session 实现注册登录功能”的完整攻略:

准备工作

首先,我们需要在本地安装Node.js和MongoDB,然后新建一个名为“project”的文件夹,用于存放我们的代码。接下来,进入“project”文件夹,并在命令行中执行以下命令来初始化我们的项目:

npm init -y

安装依赖包

我们需要安装一些必要的依赖包,包括express、mongoose、body-parser、cors、express-session、bcrypt和validator。在“project”文件夹中执行以下命令:

npm install express mongoose body-parser cors express-session bcrypt validator --save

安装完成后,我们开始搭建我们的后端服务器。

搭建后端服务器

在“project”文件夹中新建一个名为“server”的文件夹,用于存放我们的后端代码。在“server”文件夹中新建一个名为“index.js”的文件,用于编写后端服务器的代码。在“index.js”中引入必要的模块:

const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const cors = require('cors');
const session = require('express-session');
const bcrypt = require('bcrypt');
const validator = require('validator');

接下来,我们创建一个名为“app”的Express应用:

const app = express();

然后,配置body-parser和cors中间件:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());

接着,我们使用mongoose连接MongoDB:

mongoose.connect('mongodb://localhost:27017/project', { useNewUrlParser: true });

然后,我们创建用户模型:

const UserSchema = mongoose.Schema({
  email: String,
  password: String
});

const User = mongoose.model('User', UserSchema);

接下来,我们配置express-session中间件:

app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: true
}));

然后,我们编写注册和登录接口:

// 用户注册
app.post('/api/register', async (req, res) => {
  const { email, password } = req.body;

  if (!validator.isEmail(email)) {
    return res.json({ success: false, message: '邮箱格式不正确' });
  }

  if (password.length < 6) {
    return res.json({ success: false, message: '密码长度应该不少于6位' });
  }

  const user = await User.findOne({ email });

  if (user) {
    return res.json({ success: false, message: '该邮箱已被注册' });
  }

  const hash = await bcrypt.hash(password, 10);
  const newUser = new User({ email, password: hash });
  await newUser.save();

  req.session.user = newUser;

  res.json({ success: true, user: newUser });
});

// 用户登录
app.post('/api/login', async (req, res) => {
  const { email, password } = req.body;

  const user = await User.findOne({ email });

  if (!user) {
    return res.json({ success: false, message: '邮箱或密码不正确' });
  }

  const match = await bcrypt.compare(password, user.password);

  if (!match) {
    return res.json({ success: false, message: '邮箱或密码不正确' });
  }

  req.session.user = user;

  res.json({ success: true, user });
});

最后,我们启动服务器:

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

至此,我们的后端服务器已经搭建完毕,现在开始编写前端代码。

编写前端页面

在“project”文件夹中新建一个名为“client”的文件夹,用于存放我们的前端代码。在“client”文件夹中创建一个名为“index.html”的文件,用于编写前端页面的代码。

首先,我们引入必要的样式表和JavaScript文件:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>登录/注册</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui/lib/theme-chalk/index.css">
  <style>
    #app {
      margin: 50px auto;
      max-width: 600px;
      min-height: 400px;
      padding: 20px;
      border: 1px solid #ccc;
    }
    .el-button {
      margin-top: 10px;
    }
  </style>
</head>
<body>
  <div id="app"></div>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="https://cdn.jsdelivr.net/npm/element-ui/lib/index.js"></script>
  <script src="js/main.js"></script>
</body>
</html>

然后,我们在“#app”中提供一个router-view,用于渲染组件:

<div id="app">
  <router-view></router-view>
</div>

接着,我们在“client”文件夹中创建一个名为“js”的文件夹,用于存放我们的Vue组件。在“js”文件夹中创建一个名为“main.js”的文件,用于编写Vue代码。在“main.js”中引入必要的模块:

import Vue from 'vue';
import VueRouter from 'vue-router';
import ElementUI from 'element-ui';
import axios from 'axios';

Vue.use(VueRouter);
Vue.use(ElementUI);

axios.defaults.baseURL = 'http://localhost:3000/api';

const routes = [
  { path: '/', component: LoginComponent },
  { path: '/login', component: LoginComponent },
  { path: '/register', component: RegisterComponent }
];

const router = new VueRouter({
  routes
});

const app = new Vue({
  router
}).$mount('#app');

然后,我们编写登录和注册组件:

const LoginComponent = {
  data() {
    return {
      email: '',
      password: ''
    };
  },
  methods: {
    async submit() {
      const { data } = await axios.post('/login', { email: this.email, password: this.password });

      if (data.success) {
        this.$message.success('登录成功');
        this.$router.push('/');
      } else {
        this.$message.error(data.message);
      }
    }
  },
  template: `
    <el-form>
      <el-form-item label="邮箱">
        <el-input v-model="email"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input type="password" v-model="password"></el-input>
      </el-form-item>
      <el-button type="primary" @click="submit">登录</el-button>
      <el-divider content-position="left">或</el-divider>
      <router-link to="/register"><el-button>注册</el-button></router-link>
    </el-form>
  `
};

const RegisterComponent = {
  data() {
    return {
      email: '',
      password: ''
    };
  },
  methods: {
    async submit() {
      const { data } = await axios.post('/register', { email: this.email, password: this.password });

      if (data.success) {
        this.$message.success('注册成功');
        this.$router.push('/');
      } else {
        this.$message.error(data.message);
      }
    }
  },
  template: `
    <el-form>
      <el-form-item label="邮箱">
        <el-input v-model="email"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input type="password" v-model="password"></el-input>
      </el-form-item>
      <el-button type="primary" @click="submit">注册</el-button>
      <el-divider content-position="left">或</el-divider>
      <router-link to="/login"><el-button>登录</el-button></router-link>
    </el-form>
  `
};

最后,我们使用Webpack将我们的Vue组件打包成一个JavaScript文件,然后引入到“index.html”中:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>登录/注册</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui/lib/theme-chalk/index.css">
  <style>
    #app {
      margin: 50px auto;
      max-width: 600px;
      min-height: 400px;
      padding: 20px;
      border: 1px solid #ccc;
    }
    .el-button {
      margin-top: 10px;
    }
  </style>
</head>
<body>
  <div id="app"></div>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="https://cdn.jsdelivr.net/npm/element-ui/lib/index.js"></script>
  <script src="build/main.js"></script>
</body>
</html>

至此,我们的前端页面已经编写完毕。现在,我们使用命令行进入“project”文件夹,运行以下命令来启动我们的应用:

npm run dev

然后在浏览器中访问“http://localhost:8080/”,就可以看到我们的登录/注册页面了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:express+vue+mongodb+session 实现注册登录功能 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 利用Python通过获取剪切板数据实现百度划词搜索功能

    实现Python通过获取剪切板数据实现百度划词搜索功能,一般分为以下几个步骤: 1.安装必要的库:要实现这项任务,需要安装pyperclip和requests库。它们可以通过pip进行安装,命令如下: $ pip install pyperclip requests 2.剪切板数据获取:通过调用pyperclip库中的方法get()可以获取系统剪切板上的数据…

    人工智能概览 2023年5月25日
    00
  • OpenCV在Android上的应用示例

    下面是一份“OpenCV在Android上的应用示例”的完整攻略。在整个过程中,我们将介绍如何在Android应用程序中使用OpenCV进行图形和图像处理,并使用两个示例说明使用OpenCV进行人脸检测和图像处理。 准备工作 首先要确保你的开发环境中已经安装了OpenCV的Java API和Android SDK,然后你需要创建一个新的Android项目。 …

    人工智能概论 2023年5月25日
    00
  • C# SDK实现百度云OCR的文字识别功能

    下面是实现C# SDK调用百度云OCR文字识别功能的完整攻略,分为以下几个步骤: 步骤一:注册百度云OCR服务并获取API Key和Secret Key 首先,你需要在百度云AI开放平台上注册一个账号,并创建一个OCR应用。 创建完成之后,你需要从“管理控制台”进入“应用详情”页面,获取你的API Key和Secret Key。 步骤二:安装百度云OCR C…

    人工智能概论 2023年5月25日
    00
  • Django用户认证系统 Web请求中的认证解析

    Django 用户认证系统是 Django 框架中内置的一大特性,可以快速高效地构建用户认证逻辑。在 Web 应用程序中,一般需要对请求的用户进行身份验证,以保护敏感信息的同时区分访问权限。本文将介绍 Django 用户认证系统的使用和 Web 请求中的认证解析,重点讲解以下几个方面: 认证方式 Django 支持多种认证方式,例如基于 HTTP 的基本认证…

    人工智能概览 2023年5月25日
    00
  • python+opencv3.4.0 实现HOG+SVM行人检测的示例代码

    下面我来详细讲解如何使用Python和OpenCV 3.4.0实现HOG+SVM行人检测的示例代码。 1. 安装OpenCV 3.4.0 首先,我们需要安装OpenCV 3.4.0。OpenCV是一个开源的计算机视觉库,可以提供各种图像处理和计算机视觉的功能,包括HOG特征提取和SVM分类器等。我们可以从OpenCV官网下载适合自己系统的安装包,并按照安装说…

    人工智能概览 2023年5月25日
    00
  • 关于消息队列如何保证消息的幂等性

    关于消息队列如何保证消息的幂等性,这是一个很重要的话题。在分布式架构中,消息队列扮演非常重要的角色,通过使用消息队列我们可以实现系统解耦、异步处理等功能。然而,在消息队列中由于一些原因,例如网络抖动、消费者重复提交等,可能会发生消息的重复消费,从而导致系统状态出现问题。如何保证消息队列中消息的幂等性,是解决这类问题的关键。 下面,我们将通过以下三个步骤对如何…

    人工智能概览 2023年5月25日
    00
  • Django路由层如何获取正确的url

    Django框架的路由层负责将HTTP请求映射到相应的视图函数。在Web开发中,获取正确的URL是非常重要的,可以通过以下步骤实现。 1. 定义URL路由模式 在Django应用程序中,首先需要定义URL路由模式。这可以通过在应用程序的urls.py文件中定义来实现。路由模式通常由路径模式、视图函数和URL名称组成。例如,以下代码定义了一个使用正则表达式匹配…

    人工智能概览 2023年5月25日
    00
  • 阿里云部署SSL证书详解

    阿里云部署SSL证书详解 什么是SSL证书? SSL证书是一种基于SSL/TLS协议的数字身份证明。它用于在互联网中对数据进行加密传输,并为接收端验证发送端真实身份。 阿里云SSL证书申请 为了在阿里云上使用SSL证书,首先需要在阿里云上申请并购买SSL证书。申请步骤如下: 登录阿里云控制台并进入SSL证书管理页面。 点击“购买证书”,选择需要购买的SSL证…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部