node.js项目实战
wish-admin项目
第一次写博客 不多说了 直接开干
首先创建管理员名单数据库表admin
命令行生成项目文件
express wish-admin-api
然后安装一下依赖包
npm install async -S mysql2 -S sequelize -S dateformat -S jsonwebtoken -S
修改一下端口号
明确我们要做的功能一下功能
1.登录
2.许愿列表
3.添加许愿
4.获取单条许愿信息
5.修改许愿信息
6.删除许愿信息
7.管理员列表
8.添加管理员
9.获取单条管理员信息
10.修改管理员信息
11.删除管理员信息
加起来一共11个路由
现来登录模块的路由
var express = require('express');//引入express对象
var router = express.Router();//引入路由对象
//引入自定义的controllers
var IndexController = require('../controllers/index')
router.post('/login',IndexController.login);//定义登录路由,post请求
module.exports = router;
然后在项目根目录下的routes目录下新建一个wish.js文件,用来存放许愿管理器模块路由
var express = require('express');
var router = express.Router(); //引入路由对象
//引入自定义的controller
const WishController = require ('../controllers/wish');
router.get('/',WishController.list); //定义许愿列表路由,get请求
router.get('/:id',WishController.info); //定义单条许愿路由,GET请求
router.post('/',WishController.add); //定义添加许愿路由, post请求
router.put('/',WishController.update); //定义修改许愿路由,put请求
router.delete('/',WishController.remove);//定义删除许愿路由,delete请求
module.exports = router;
下一步管理员模块路由在项目根目录的routes目录下新建一个admin.js文件
var express = require('express')
var router = express.Router();
//老样子引入controller
const AdminController = require ('../controllers/admin');
router.get('/',AdminController.list);
router.get('/:id',AdminController.info);
router.post('/',AdminController.add);
router.put('/',AdminController.update);
router.delete('/',AdminController.remove);
module.exports = router;
要想路由配置生效还需要在app.js,将定义的路由文件引进来进行path配置
在这里添加
var wishRouter = require('./routes/wish')
var adminRouter = require('./routes/admin')
在这里添加
app.use('/wish',wishRouter)
app.uee('/admin',adminRouter)
写完以后文件目录是这样的
开始干自定义的方法
common.js中的公共方法
//定义了三个公共方法克隆、校验、返回统一
const async = require('async');
const Constant = require('../constant/constant');
const exportObj = {
clone,
checkParams,
autoFn
};
module.exports = exportobj;
//导出对象,方便其他方法调用
// 克隆方法,克隆一个对象
// @param obj
// @returns {any}
function clone(obj){
return JSON.parse(JSON.stringify(obj));
}
// 校验参数全局方法
// @param params 请求的参数集
// @param checkArr 需要验证的参数
// @param cb
function checkParams (params,checkArr,cb){
let flag = true;
checkArr.forEach(v =>{
if(!params[v]){
flag = false;
}
});
if(flag){
cb(null);
}else{
cb(Constant.LACK)
}
}
// 返回同一方法 返回json格式数据
// @param tasks 当前controllers执行tasks
//@param res 当前controller responese
// @param resObj 当前controller返回json对象
function autoFn(tasks,res,resObj){
async.auto(tasks,function(err){
if(!!err){
console.log(JSON.stringify(err));
res.json({
code:err.code || Constant.DEFAULT_ERROR.code,
msg:err.msg || JSON.stringify(err)
});
}else{
res.json(resObj);
}
});
}
除了登录页面外,访问其他页面均需要登陆状态,所以需要色剂一个令牌Token机制,在用户登录成功以后返回Token,前端将其保存,在请求后序接口时带上Token验证是否登录单独定义在Token.js文件中
const jwt = require('jsonwebtoken')
const tokenKey = 'XfzEpWEn?ARD7rHBN';//设置一个秘钥,用来加密和解密Token
const Token = {
// Token加密方式
// @param data 需要加密在Token中的数据
// @param time Token 的过期时间,单位为s
// @returns {*} 返回一个Token
encrypt:function(data,time){
return jwt.sign(data,tokenKey,{expiresIn: time})
},
// Token解密方法
// @param token 加密之后的Token
// @returns 返回对象
// {
{token: boolean (true表示Token合法,false则表示不合法),
// data: *(解密出来的数据或错误信息)}}
decrypt:function(token){
try{
let data =jwt.verify(token,tokenKey);
return {
token:true,
data:data
};
}catch(e){
return{
token:false,
data:e
}
}
}
};
module.exports = Token;
初登陆页面以外 所有的页面都需要校验token,每个页面都需要校验,则万门我们将它放入单独封装到routes中的middleware目录下的verify.js文件中
//引入Token处理的controller
const Token = require('../../controllers/token')
const Constant = require (