1.项目目录结构

2.启动入口文件代码index.js

const express = require('express')
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser') const userRouter = require('./user')
const personRouter = require('./person')
const checkToken = require('./check_token') const app = express()
app.use(cookieParser())
app.use(bodyParser.json()) app.use('/api',userRouter)
app.use('/api',checkToken,personRouter)
app.listen(9093, function() {
console.log('Node app start at port 9093')
});

3.mongoose连接数据库model.js

const mongoose = require('mongoose');
// 链接mongo 并且使用imooc这个集合
const DB_URL = 'mongodb://localhost:27017/demo';
mongoose.connect(DB_URL); const models = {
user:{
'user':{type:String, 'require':true},
'pwd':{type:String, 'require':true},
'type':{'type':String, 'require':true},
//头像
'avatar':{'type':String},
// 个人简介或者职位简介
'desc':{'type':String},
// 职位名
'title':{'type':String},
// 如果你是boss 还有两个字段
'company':{'type':String},
'money':{'type':String}
},
person:{
//创建时间
date:{'type':String},
//联系人名字
name:{type:String},
//联系人年龄
age:{type:Number},
//联系人性别
sex:{'type':String},
//联系人地址
address:{'type':String}
}
}; for(let m in models){
mongoose.model(m, new mongoose.Schema(models[m]))
}; module.exports = {
getModel:function(name){
return mongoose.model(name)
}
};

4.登录逻辑处理user.js

const express = require('express')
const utils = require('utility')
const sd = require('silly-datetime')
const jwt = require('jsonwebtoken') const Router = express.Router()
const model = require('./model')
const User = model.getModel('user')
const _filter = { 'pwd': 0, '__v': 0 }
const secret = 'zero' Router.post('/loginRegister', function(req, res) {
const { user, pwd } = req.body
User.findOne({ user }, function(err, doc) {
if (doc) {
if (doc.pwd != md5Pwd(pwd)) {
return res.json({ code: 1, msg: '用户名或者密码错误' })
} else {
let token = jwt.sign(doc.toJSON(), secret, {
expiresIn: 60 * 60 //秒到期时间
});
let { _id, user } = doc
return res.json({ code: 0, data: { _id, user, token } })
}
} else {
const userModel = new User({ user, pwd: md5Pwd(pwd) })
userModel.save(function(e, d) {
if (e) {
return res.json({ code: 1, msg: '后端出错了' })
}
let token = jwt.sign(d.toJSON(), secret, {
expiresIn: 60 * 60 //秒到期时间
});
let { _id, user } = d
return res.json({ code: 0, data: { _id, user, token } })
})
}
}) }) function md5Pwd(pwd) {
const salt = '!@~#Zero389409258'
return utils.md5(utils.md5(pwd + salt))
} module.exports = Router;

5.token验证中间件check_token.js

var jwt = require('jsonwebtoken')
const secret = 'zero'
module.exports = function(req, res, next) {
//检查post的信息或者url查询参数或者头信息
var token = req.body.token || req.query.token || req.headers['x-access-token']
// 解析 token
if (token) {
// 确认token
jwt.verify(token, secret, function(err, decoded) {
if (err) {
return res.json({ code: 1, msg: 'token信息错误或失效!' })
} else {
// 如果没问题就把解码后的信息保存到请求中,供后面的路由使用
req.api_user = decoded
next()
}
});
} else {
// 如果没有token,则返回错误
return res.status(403).send({
code: 1,
msg: '没有提供token!'
})
}
}

6.mongoose增删改查person.js

const express = require('express')
const utils = require('utility')
const sd = require('silly-datetime')
const jwt = require('jsonwebtoken') const Router = express.Router()
const model = require('./model')
const Person = model.getModel('person')
const _filter = { 'pwd': 0, '__v': 0 } Router.post('/personSave', function(req, res) {
const { name, sex, age, address, _id } = req.body
const body = req.body
let date = sd.format(new Date(), 'YYYY-MM-DD HH:mm')
const personModel = new Person({ name, sex, age, address, date })
if (_id == '') {
personModel.save(function(e, doc) {
if (e) {
return res.json({ code: 1, msg: '后端出错了' })
}
return res.json({ code: 0, data: { name, sex, age, address, _id } })
})
} else {
Person.findByIdAndUpdate(_id, { name, sex, age, address }, function(err, doc) {
const data = Object.assign({}, doc)
return res.json({ code: 0, data: data })
})
}
}) Router.post('/personRemove', function(req, res) {
const _id = req.body._id;
Person.findByIdAndRemove(_id, function(err, doc) {
return res.json({ code: 0, data: doc })
}) }) Router.get('/personList', function(req, res) {
Person.find({})
.skip(0)
.limit(10)
.sort({ '_id': -1 })
.exec(function(err, doc) {
Person.count({}, function(err, count) {
let data = {
count: count,
personDataList: doc
}
return res.json({ code: 0, data: data })
})
}); }) module.exports = Router;

项目运行需启动本地mongodb

完整项目具体demo贴上 github :https://github.com/zhuzeliang/node-vue-demo

node 实现Token状态登录 及数据库增删改查的更多相关文章

  1. node.js封装数据库增删改查

    数据库增删改查的封装 小编不容易 const sql = { insert: function (Collection, insertData) { return new Promise((resol ...

  2. (转)SQLite数据库增删改查操作

    原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...

  3. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  4. MySQL数据库(增删改查语句)

    MySQL数据库(增删改查语句)一.登录数据库:---->  mysql -uroot -proot;(对应用户名和密码)二.SQL语句:    数据定义语言DDL  用来定义数据库.表.列,关 ...

  5. Asp.Net操作MySql数据库增删改查

    Asp.Net操作MySql数据库增删改查,话不多说直接步入正题.git源码地址:https://git.oschina.net/gxiaopan/NetMySql.git  1.安装MySQL数据库 ...

  6. NX二次开发-NX访问SqlServer数据库(增删改查)C#版

    版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...

  7. Yii2.0高级框架数据库增删改查的一些操作(转)

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...

  8. 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查

    一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...

  9. go——beego的数据库增删改查

    一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也 ...

随机推荐

  1. skype默认占用80和443port

    今天把server的port更改为80,结果起不来,报告"port已经被占用"的错误. 使用下列命令找到了元凶: 1. netstat -ano | findstr 80 找到占用 ...

  2. python的一些常用函数

    1 filter(function, iterable) 等价于(item for item in iterable if function(item)) 就是说,filter会遍历iterable中 ...

  3. linux shell 实例1

    UI项目删除“UIL”文件中的无用字串: 脚本需要制定UIL文件目录位置&无用字串的txt文件,如删除海尔目录下的无用字串: ./delete_uil_string.sh ./haier/UI ...

  4. Java序列化系列教程(上)

    一定义以及相关概念 互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分.通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同,例如: ...

  5. navicat导入.sql文件出错2006-MySQLserver has gone away

    方式一(验证无误): 找到mysql安装目录下的my.ini配置文件,加入以下代码: max_allowed_packet=500M wait_timeout=288000 interactive_t ...

  6. openstack network:dhcp binding fail

  7. bzoj 2427: [HAOI2010]软件安装【tarjan+树形dp】

    一眼最大权闭合子图,然后开始构图,画了画之后发现我其实是个智障网络流满足不了m,于是发现正确的打开方式应该是一眼树上dp 然后仔细看了看性质,发现把依赖关系建成图之后是个奇环森林,这个显然不能直接dp ...

  8. mysql百万数据分页查询速度

    百万数据测试 ,; 受影响的行: 时间: .080ms ,; 受影响的行: 时间: .291ms ,; 受影响的行: 时间: .557ms ,; 受影响的行: 时间: .821ms ,; 受影响的行: ...

  9. MySql数据库创建表

    3.3.MySql数据库创建表 创建5个表: UserInfo用户基础表 Role 角色表 MenuInfo 菜单即控制表 Relation_Role_Menu 角色对应菜单关系表 RelaTion_ ...

  10. css为tbody或者li奇数偶数行样式

    <style> table tbody tr:nth-child(odd){ background:#fff; } table tbody tr:nth-child(even){ back ...