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

上个月写了一篇文章是 express+mongodb+vue 实现增删改查. 只是简单的实现了增删改查功能,那么今天是在那个基础之上做了扩展,首先实现的功能有如下:

1. 支持注册,登录功能,用户可以注册完成后,进行登录,登录完成后会进入到列表增删改查页面。
2. 支持session会话,也就是说设置了多长时间登录过期,如果用户没有登录,直接进查询列表页面,会重定向到登录页面去,如果用户登录了后,把浏览器关掉,直接输入列表查询页面,会直接进入列表页面的。
3. 列表数据加入了分页功能。
4. 对数据库中的请求加入了日志记录。

该代码和之前的实现增删改查代码,目录有所调整,目的想文件目录更加清晰。我们在讲解之前,还是和之前一样,先看下效果:
1. 首先服务器重启后,在地址栏中输入 http://localhost:8081/ 后,会重定向到登录页面来,如下图所示:

2. 如果没有账号的话,我们可以注册一个账号,进入注册页面,如下图所示:

3. 如果用户名和密码没有输入,或者输入的格式不合法的话,会如下提示所示:

4. 当用户注册成功后,可以看到如下页面了

5. 我们去登录页面,进行登录,如下:

6. 登录成功后,会跳转到列表页面,如下图所示:

下面的增删改查操作的流程,我就不再介绍了,和我之前的 express+mongodb+vue 实现增删改查中的演示是一样的。

 7. 下面我们来看看我们的数据库中是否增加了刚刚注册的用户账号了,如下图所示:

上面的四个账号都是我注册的,在数据库中可以看到,注册成功了。

注意:如果某个用户注册过了,你再使用相同的账号继续注册话,是不能注册,会提示该账号已经注册过了,如下图所示:

下面还是来看下我们项目的整个目录架构如下:

### 目录结构如下:
demo1                                       # 工程名
|   |--- dist                               # 打包后生成的目录文件             
|   |--- node_modules                       # 所有的依赖包
|   |----database                           # 数据库相关的文件目录
|   | |---db.js                             # mongoose类库的数据库连接操作
|   | |---models                            # 存放所有模型表
|   | | |--- user.js                        # 增删改查用户数据表
|   | | |--- userTable.js                   # 用户账号表
|   |--- app
|   | |---index
|   | | |-- views                           # 存放所有vue页面文件
|   | | | |-- list.vue                      # 列表数据
|   | | | |-- index.vue
|   | | | |-- login.vue                     # 用户登录页面
|   | | | |-- regist.vue                    # 用户注册页面
|   | | |-- components                      # 存放vue公用的组件
|   | | |-- js                              # 存放js文件的
|   | | |-- css                             # 存放css文件
|   | | |-- store                           # store仓库
|   | | | |--- actions.js
|   | | | |--- mutations.js
|   | | | |--- state.js
|   | | | |--- mutations-types.js
|   | | | |--- index.js
|   | | | |
|   | | |-- app.js                          # vue入口配置文件
|   | | |-- router.js                       # 路由配置文件
|   |--- api                                # 保存所有接口操作的文件
|   | |--- addAndDelete.js                  # 增删改查的接口
|   | |--- regAndLogin.js                   # 注册登录的接口
|   | |--- userSession.js                   # 用户session有效的接口
|   |--- routes                             # 存放所有的路由文件
|   | |--- addAndDelete.js                  # 增删改查路由
|   | |--- regAndLogin.js                   # 注册和登录路由
|   | |--- userSession.js                   # session路由
|   |--- views
|   | |-- index.html                        # html文件
|   |--- webpack.config.js                  # webpack配置文件 
|   |--- .gitignore  
|   |--- README.md
|   |--- package.json
|   |--- .babelrc                           # babel转码文件
|   |--- app.js                             # express入口文件

首先我们先看下 根目录下的 app.js 文件代码(服务器代码):

部分代码如下:

// 引入express模块
const express = require('express');
// 引入session
const session = require('express-session');
// 创建app对象
const app = express();// 加载路由
const addAndDelete = require('./routes/addAndDelete');
const regAndLogin = require('./routes/regAndLogin');
const userSession = require('./routes/userSession');const bodyParser = require("body-parser");const fs = require('fs');
const path = require('path');// mongoose-morgan
const morgan = require('mongoose-morgan');app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: false }));app.use(session({secret: 'kongzhi', // 对 session id 相关的cookie 进行加密签名
  cookie: {maxAge: 1000 * 60 * 10  // 设置 session的有效时间,单位为毫秒,设置有效期为10分钟
  }
}));// Logger 添加数据库操作日志记录  https://www.npmjs.com/package/mongoose-morgan
app.use(morgan({connectionString: 'mongodb://localhost:27017/dataDb'
}));// 使用
app.use('/user', addAndDelete);
app.use('/reglogin', regAndLogin);
app.use('/user', userSession);

如上代码,加载路由后,然后使用 use了,对应的 routes文件下的js文件,代码分别如下:

1. routes/addAndDelete.js 代码如下:

// 引入express 模块 
const express = require('express');const router = express.Router();// 引入user.js
const User = require('../api/addAndDelete');router.post('/add', User.add);router.post('/query', User.query);router.post('/del', User.del);router.post('/update', User.update);module.exports = router;

2. routes/regAndLogin.js 代码如下:

const express = require('express');const router = express.Router();const RegAndLogin = require('../api/regAndLogin');router.post('/regist', RegAndLogin.registered);router.post('/login', RegAndLogin.login);// 注销
router.post('/logout', RegAndLogin.logout);module.exports = router;

3. routes/userSession.js 代码如下:

const express = require('express');const router = express.Router();const userSession = require('../api/userSession');router.post('/usersession', userSession.usersession);module.exports = router;

因此对于 app.use('/user', addAndDelete); 的时候,会调用 routes/addAndDelete.js 下的请求方法,分别为:

/add, /query, /update, /del, 因此在我们列表页面中使用接口方式如:类似于如下这样的:

都是 /user/add, /user/query, /user/update, /user/del 这样的接口,比如说我们使用 /user/add post请求这样的接口的时候,他们会调用到 routes/addAndDelete.js 中的router.post('/add', User.add); 这里面的 User.add方法,所以它就会调用到 api/addAndDelete.js 中的add函数,如下代码所示:

const User = require('../database/models/user');
// 新增信息
module.exports.add = function(req, res, next) {const user = new User({name: req.body.name,age: req.body.age,sex: req.body.sex});user.save((err, docs) => {if (err) {res.send({ 'code': 1, 'errorMsg': '新增失败' });} else {res.send({ "code": 0, 'message': '新增成功' });}});next();
};

因此会调用数据库的操作,会在数据库中增加一条数据。如上代码,会应用到 database/models/user 这个表中的代码:

/*定义一个user的Schema
*/
const mongoose = require('../db.js');
const Schema = mongoose.Schema;// 创建一个模型
const UserSchema = new Schema({name: { type: String}, // 属性name,类型为Stringage: { type: Number, default: 30 }, // 属性age,类型为Number,默认值为30
  sex: { type: String }
});// 导出model模块
const User = module.exports = mongoose.model('User', UserSchema);

因此会创建user表,并且在表中插入对应的数据。

如上只是解释下增加接口的调用方式,其他的接口设计也是一样的。就不多解释了。对应 /user 这样的,我们在webpack中的devServer中会配置下,解决跨域问题,因为我现在是启动两个服务的,node端的端口是 3001, 而我的webpack的端口是8081, 会存在跨域的,因此webpack的 devServer 需要做如下配置的:

devServer: {port: 8081,// host: '0.0.0.0',
  headers: {'X-foo': '112233'},inline: true,overlay: true,stats: 'errors-only',proxy: {'/user': {target: 'http://127.0.0.1:3001',changeOrigin: true  // 是否跨域
    },'/combineFile': {target: 'http://127.0.0.1:3001',changeOrigin: true,  // 是否跨域,
      pathRewrite: {'^/combineFile' : ''  // 重写路径
      }},'/reglogin': {target: 'http://127.0.0.1:3001',changeOrigin: true  // 是否跨域
    }}
},

4. app.js 中使用了 mongoose-morgan 这个插件,为了数据库操作接口的时候,写入日志,比如报错的时候可以在服务器端看到报错信息,该API的具体使用可以
看下 npm库(https://www.npmjs.com/package/mongoose-morgan)。

如下日志记录:

具体的代码这边就不多解释,有兴趣的话可以去github上下载代码查看下哦。

查看github上源码

转载于:https://www.cnblogs.com/tugenhua0707/p/10074148.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux(2):linux命令查看开放哪些端口

linux命令查看开放哪些端口 netstat -nupl (UDP类型的端口) netstat -ntpl (TCP类型的端口) a 表示所有 n表示不查询dns t表示tcp协议 u表示udp协议 p表示查询占用的程序 l表示查询正在监听的程序 netstat -nuplf|grep 3306 //这个表示查找处于监听状态的,端…

tcp 压力 测试 软件,强大的TcpServer压力测试工具及源码(附突破连接限制的方法和工具)...

压缩包 : 强大的TcpServer压力测试工具及源码(附突破连接限制的方法和工具).rar 列表G-Sockets(压力测试工具源码)\Demos\G-TcpClientDemo\G-TcpClientDemo.apsG-Sockets(压力测试工具源码)\Demos\G-TcpClientDemo\G-TcpClientDemo.cppG-Sockets(压力测试工具源码)\Demos\G-Tcp…

java 添加注解_你知道Java中的package-info的作用吗?

package-info.java对于日常业务开发的开发者来说,可能有点陌生,如果我们再项目中创建一个package-info.java,你会发现该类只有一个packge,如下我们无法在该java文件中定义public的类但事实上,package-info.java还有它的…

if else的使用以及如何从键盘获取数值

if-else的使用 顺序结构 顺序从上到下执行,中间没有判断和跳转 分支结构 根据条件,选择性地执行某段代码 有if-else和switch两种分支语句 循环结构 根据循环,重复性地执行某段代码 有while、do...while、for三种循环结构 如何从键盘获取数值 …

linux(3):Linux MBR分区、挂载操作步骤,逻辑卷扩容操作

Linux MBR分区、挂载操作步骤,逻辑卷扩容操作 服务器开机之后,能自动识别出硬盘,但是硬盘不能够存储数据,必须对硬盘进行分区、格式化、挂载后才能使用;linux主分区和拓展分区总数不能超过4个,拓展分区最…

计算机应用于材料组织结构检测,计算机在材料检测中的应用

计算机在材料检测中的应用[摘要]随着信息时代的来临,计算机应用已经成为社会发展的动力和趋势,其在各个行业中都有广泛的运用,在材料检测中更是运用广泛,成为材料检测的最有效手段。而要发挥计算机在材料检测这的巨大作用&#xf…

golang 没有名字参数_Go 返回参数命名

Go 返回参数命名在Golang中,命名返回参数通常称为命名参数。Golang允许在函数签名或定义中为函数的返回或结果参数指定名称。或者可以说这是函数定义中返回变量的显式命名。基本上,它解决了在return语句中提及变量名称的要求。通过使用命名返回参数或命名…

11 Python之初识函数

---恢复内容开始--- 1. 什么是函数?   f(x) x 1   y x 1   函数是对功能或者动作的封装 2. 函数的语法和定义   def 函数名():     函数体   调用:   函数名() 3. 关于函数的返回值   return : 返回     1. 当程序没写过return, 不返回任何结果. 如…

python对象属性在引用时前面需要加()_python基础-面向对象进阶

实现授权的关键点就是覆盖__getattr__方法1、通过触发__getattr__方法,找到read方法示例1:1 importtime2 classFileHandle:3 def __init__(self,filename,moder,encodingutf-8):4 self.fileopen(filename,mode,encodingencoding)5 self.modemode6 self.encodingenco…

linux(4):Linux逻辑卷详解总结

LVM是逻辑卷管理(Logical Volume Manager)的简称,它是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,与直接使用物理存储在管理上相比,提供了更好灵活性。 LVM将存储虚拟化,使用逻辑卷,你不会受限于物理磁盘的大…

您的计算机和打印机上的打印纸设置不匹配,打印纸张不符合打印要求、类型与设置不符-打印机上门维修复印机...

从网上复制了一个以tab排版的表格,智能导入Calc很顺利,由于用的是OpenOffice打印的时候却遇到了麻烦,A4纸竖着打印会丢失栏目,按MSOffice下的老地方去找横向打印设置,未果,最后还是在网上找到了答案&#x…

Android 布局优化

include标签共享布局 include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化,这在布局编写方便提供了大大的便利。例如我们在进行App开发时基本每个页面都会有标题栏,在不使用include的情况下你在每个界面都需要重新…

计算机二级1605错误,word 出现windows installer 1605错误

您好,我们了解到您在启动Word 2013时遇到Windows installer 出现错误1605 问题。该问题有可能是Word模板损坏获取优化清理操作导致系统文件损坏。建议您尝试以下方法是否能否解决问题:1.退出所有Office程序2.确保以下文件夹内无任何文件:C:\P…

前端扁平化数据转树形数据_把平级数据变成树形数据

为了记住这个方法:转化数据[{element:图片,id:1,pid:0},//count1{element:大图片,id:2,pid:1},{element:png,id:3,pid:2},{element:jpeg,id:4,pid:2},{element:gif,id:5,pid:2},{element:gif11,id:6,pid:5},{element:gif111,id:7,pid:6},{element:gif222,id:8,pid:6…

曾国藩:诚敬静谨恒!

曾国藩:诚敬静谨恒。诚:民无信不立!人与人交往,最讲究诚字。与他人坦诚,说话有诚信,对人诚心,自然会受到他人喜爱和尊重。敬:月满则亏,物盛则衰!要想成大事,需…

java学习(103):字符串概述

//字符串概述 public class test40 {public static void main(String[] args){char[] str1{1,2,3,4,5,6,7,8,9};String str2new String("我是歌谣");String str3new String(str1);String str4new String(str1,3,4);String str5new String("\"\\");Sys…

计算机服务哪些不能关闭,Win7系统下哪些系统服务不能关闭

为了让系统能够更快的启动,很多用户会选择禁用一些系统服务,但并不是所有的服务都能够禁用关闭的,下面是小编与大家分享的Win7系统下哪些不能关闭的服务,保证大家的电脑能够正常的运行。第一、DHCPClient服务这款服务是电脑获取IP…

java学习(104):字符串equals,charAt,endwith,startwith方法

//String方法 public class test41 {//比较两个人的姓名是否相同public static boolean eqName(String name1,String name2){return name2.equals(name1)?true:false;}//按照给定的字符的索引返回public static char findNUM(String resouse,int index){if(index<0||index&…

kafka operation

运行环境&#xff1a;mac os 1. 启动zookeeper ./bin/zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties 2. 启动kafka服务 ./bin/kafka-server-start /usr/local/etc/kafka/server.properties 3. 查看topic列表 ./bin/kafka-topics --list --zookeeper local…

csirs参考信号_发送和接收点(TRP)及信道状态信息参考信号(CSI-RS)传输的方法与流程...

本文中所公开的一个或多个实施例涉及发送和接收点(trp)及信道状态信息参考信号(csi-rs)传输的方法。背景技术&#xff1a;对于使用更高频率的新无线电(nr)&#xff0c;可以引入使用数字和模拟电路来执行波束成型的混合(模拟/数字)波束成型系统。在混合波束成型系统中&#xff0…