node.js后台管理系统代码封装

2018-12-11  本文已影响0人  蓝Renly

node.js后台管理系统代码封装

1.权限管理

let permissions = [
    {
        role: 0,// 普通商家用户
        urls: [
            /\/category.*/,
            /\/product.*/,
            /\/order.*/
        ]
    },
    {
        role: 100,// 管理员
        urls: [
            /.*/
        ]
    }
];
// 权限的校验
module.exports = (request, response, next) => {
    // 获取当前用户要请求的Url地址
    let reqUrl = request.url;
    // 获取用户
    let user = request.user;
    // 对登录状态的用户进行权限的校验
    if (user) {
        // 标志位,标记用户是否能够访问对应的地址,默认值是不允许访问
        let isGo = false;
        // 循环权限的数组
        outer:for (let i = 0; i < permissions.length; i++) {
            let permission = permissions[i];
            // 如果当前用户的角色 = 当前权限的角色
            if (user.role === permission.role) {
                // 遍历当前权限能够访问的URL地址
                let urls = permission.urls;
                for (let j = 0; j < urls.length; j++) {
                    let url = urls[j];
                    // 比对当前遍历到的正则表达式是否匹配,当前用户要访问的url地址
                    if (url.test(reqUrl)) {
                        // 如果匹配成功,修改标志位,说明用户可以访问,此时可以跳出循环
                        isGo = true;
                        break outer;
                    }
                }
            }
        }
        // 整个循环结束以后,如果发现用户没有权限访问对应的url地址,就抛出异常
        if (!isGo) {
            throw Error("您没有权限访问对应的地址");
        }
    }
    // 放行的代码
    next();
};

2.token检验

let encryptUtil = require("../utils/encryptUtil");
let config = require("../config");
let userService = require("../service/user");

function checkUrl(url) {
    // 不需要登录
    // 注册 : /user/regist
    // 登录 : /user/login
    let ignoreUrls = [
        /\/user\/regist/,
        /\/user\/login/

    ];
    // /user/login
    // 标志位,当前的url是否需要进行登录状态的校验,默认值是需要
    let isNeedCheck = true;
    // js中的forEach()是不能中断的,break

    for (let i = 0; i < ignoreUrls.length; i++) {
        let ignoreUrl = ignoreUrls[i];
        if (ignoreUrl.test(url)) {
            isNeedCheck = false;
            break;
        }
    }
    return isNeedCheck;
}

// 校验用户是否已经登录
module.exports = async (request, response, next) => {
    // 用户请求的路径
    let url = request.url;

    // 用户请求的url是需要进行登录状态的校验
    if (checkUrl(url)) {

        // 获取token
        let token = request.get("token");
        if (!token) {
            throw  Error("请求头中没有Token数据,请登录");
        }

        // 解密出来的是json字符串,不是js对象,所以不能通过.属性名的方式获取到属性值
        let tokenDecrypted = null;
        try {
            tokenDecrypted = encryptUtil.aesDecrypt(token, config.TOKEN_KEY);
        } catch (e) {
            throw  Error("token解密失败,请登录");
        }
        // 把json字符串转成js对象
        let tokenJs = JSON.parse(tokenDecrypted);
        // 获取token的有效期
        let expire = tokenJs.expire;
        if (Date.now() > expire) {
            throw  Error("token已过期,请重新登录");
        }
        // 获取token中的用户名
        let username = tokenJs.username;
        // 根据用户名查询用户
        let user = await userService.findByUsername(username);
        // 如果查询不到,说明token是伪造的
        if (!user) {
            throw  Error("token无效,请重新登录");
        }
        // 把查询到的用户存储到request对象身上
        request.user = user;
    }
    // 放行的代码
    next();
};

3.响应信息封装

module.exports = (request, response, next) => {
    //  给response对象增加了两个方法
    response.success = (result) => {
        response.send({
            code: 1,
            msg: "操作成功",
            data: result
        })
    };
    response.fail = (err) => {
        response.send({
            code: -1,
            msg: "操作失败",
            data: err.toString()
        })
    };
    // 放行的代码
    next();
};
上一篇 下一篇

猜你喜欢

热点阅读