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