node 实现Token状态登录 及数据库增删改查

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

猜你喜欢

转载自www.cnblogs.com/zhuzeliang/p/9028592.html
今日推荐