base_controller.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /**
  2. * 控制器基类
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/6/29
  6. * @version
  7. */
  8. import crypto from "crypto";
  9. import Url from "url";
  10. import Moment from "moment";
  11. import menuData from "../../../config/menu";
  12. class BaseController {
  13. /**
  14. * 页面title
  15. *
  16. * @var string
  17. */
  18. title = '';
  19. /**
  20. * 构造函数
  21. *
  22. * @return {void}
  23. */
  24. constructor() {
  25. /**
  26. * 使BaseController可以实例化,可作为中间件使用
  27. */
  28. /*if (new.target === BaseController) {
  29. throw new Error('BaseController不能实例化,只能继承使用。');
  30. }*/
  31. }
  32. /**
  33. * 初始化函数
  34. *
  35. * @param {object} request
  36. * @param {object} response
  37. * @param {function} next
  38. * @return {void}
  39. */
  40. init(request, response, next) {
  41. // 获取当前控制器和动作名称
  42. let urlInfo = Url.parse(request.originalUrl, true);
  43. let url = urlInfo.pathname.substr(1);
  44. let actionInfo = url.split('/');
  45. let controller = 'index';
  46. let action = 'index';
  47. switch (actionInfo.length) {
  48. case 1:
  49. controller = actionInfo[0];
  50. break;
  51. case 2:
  52. controller = actionInfo[0];
  53. action = actionInfo[1];
  54. break;
  55. default:
  56. controller = actionInfo[0];
  57. break;
  58. }
  59. try {
  60. console.log('enterINit');
  61. // 如果不适超级管理员则判断权限
  62. let sessionManager = request.session.managerData;
  63. if (sessionManager.superAdmin !== 1) {
  64. let currentPermission = sessionManager.permission;
  65. // 校验权限
  66. currentPermission = currentPermission.split(',');
  67. let withoutPermission = ['login', 'dashboard'];
  68. // 工具页面整合
  69. let toolPermission = ['rationRepository', 'stdBillsmain', 'stdGljRepository'];
  70. let hasToolPermission = false;
  71. if (controller === 'tool') {
  72. for (let tmpPermission of toolPermission) {
  73. if (currentPermission.indexOf(tmpPermission) >= 0) {
  74. hasToolPermission = true;
  75. break;
  76. }
  77. }
  78. }
  79. if (!hasToolPermission && withoutPermission.indexOf(controller) < 0 &&
  80. (currentPermission.length <= 0 || currentPermission.indexOf(controller)) < 0) {
  81. throw '没有权限';
  82. }
  83. }
  84. // 菜单数据
  85. response.locals.menu = menuData;
  86. // 二级菜单数据
  87. response.locals.secondMenu = menuData[controller] !== undefined && menuData[controller].children !== undefined ?
  88. menuData[controller].children : {};
  89. // url相关数据
  90. response.locals.urlQuery = JSON.stringify(urlInfo.query);
  91. response.locals.controller = controller;
  92. response.locals.action = action;
  93. // 用户session数据
  94. response.locals.manager = sessionManager;
  95. // moment工具
  96. response.locals.moment = Moment;
  97. } catch (error) {
  98. console.log('enterAURE');
  99. console.log(error);
  100. response.redirect('/dashboard');
  101. return;
  102. }
  103. next();
  104. }
  105. /**
  106. * 验证方法
  107. *
  108. * @param {object} request
  109. * @param {object} response
  110. * @param {function} next
  111. * @return {void}
  112. */
  113. auth(request, response, next) {
  114. // 判断session
  115. let mangerData = request.session.managerData;
  116. try {
  117. console.log('enterAuth');
  118. if (typeof mangerData !== 'object' || Object.keys(mangerData).length < 0) {
  119. throw 'err data';
  120. }
  121. if (mangerData.username === undefined || mangerData.loginTime === undefined) {
  122. throw 'username empty';
  123. }
  124. // 校验session
  125. let sessionToken = crypto.createHmac('sha1', mangerData.loginTime + '')
  126. .update(mangerData.username).digest().toString('base64');
  127. if (sessionToken !== mangerData.sessionToken) {
  128. throw 'session error';
  129. }
  130. } catch (error) {
  131. console.log('enterAURE');
  132. response.redirect('/login');
  133. return;
  134. }
  135. next();
  136. }
  137. }
  138. export default BaseController;