/** * 控制器基类 * * @author CaiAoLin * @date 2017/6/29 * @version */ import crypto from "crypto"; import Url from "url"; import Moment from "moment"; import menuData from "../../../config/menu"; class BaseController { /** * 页面title * * @var string */ title = ''; /** * 构造函数 * * @return {void} */ constructor() { /** * 使BaseController可以实例化,可作为中间件使用 */ /*if (new.target === BaseController) { throw new Error('BaseController不能实例化,只能继承使用。'); }*/ } /** * 初始化函数 * * @param {object} request * @param {object} response * @param {function} next * @return {void} */ init(request, response, next) { // 获取当前控制器和动作名称 let urlInfo = Url.parse(request.originalUrl, true); let url = urlInfo.pathname.substr(1); let actionInfo = url.split('/'); let controller = 'index'; let action = 'index'; switch (actionInfo.length) { case 1: controller = actionInfo[0]; break; case 2: controller = actionInfo[0]; action = actionInfo[1]; break; default: controller = actionInfo[0]; break; } try { // 如果不适超级管理员则判断权限 let sessionManager = request.session.managerData; if (sessionManager.superAdmin !== 1) { let currentPermission = sessionManager.permission; // 校验权限 currentPermission = currentPermission.split(','); let withoutPermission = ['login', 'dashboard']; // 工具页面整合 let toolPermission = ['rationRepository', 'stdBillsmain', 'stdGljRepository']; let hasToolPermission = false; if (controller === 'tool') { for (let tmpPermission of toolPermission) { if (currentPermission.indexOf(tmpPermission) >= 0) { hasToolPermission = true; break; } } } if (!hasToolPermission && withoutPermission.indexOf(controller) < 0 && (currentPermission.length <= 0 || currentPermission.indexOf(controller)) < 0) { throw '没有权限'; } } // 菜单数据 response.locals.menu = menuData; // 二级菜单数据 response.locals.secondMenu = menuData[controller] !== undefined && menuData[controller].children !== undefined ? menuData[controller].children : {}; // url相关数据 response.locals.urlQuery = JSON.stringify(urlInfo.query); response.locals.controller = controller; response.locals.action = action; // 用户session数据 response.locals.manager = sessionManager; // moment工具 response.locals.moment = Moment; } catch (error) { console.log(error); response.redirect('/dashboard'); return; } next(); } /** * 验证方法 * * @param {object} request * @param {object} response * @param {function} next * @return {void} */ auth(request, response, next) { // 判断session let mangerData = request.session.managerData; try { if (typeof mangerData !== 'object' || Object.keys(mangerData).length < 0) { throw 'err data'; } if (mangerData.username === undefined || mangerData.loginTime === undefined) { throw 'username empty'; } // 校验session let sessionToken = crypto.createHmac('sha1', mangerData.loginTime + '') .update(mangerData.username).digest().toString('base64'); if (sessionToken !== mangerData.sessionToken) { throw 'session error'; } } catch (error) { response.redirect('/login'); return; } next(); } } export default BaseController;