base_controller.js 5.6 KB

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