base_controller.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. if (new.target === BaseController) {
  26. throw new Error('BaseController不能实例化,只能继承使用。');
  27. }
  28. }
  29. /**
  30. * 初始化函数
  31. *
  32. * @param {object} request
  33. * @param {object} response
  34. * @param {function} next
  35. * @return {void}
  36. */
  37. init(request, response, next) {
  38. // 获取当前控制器和动作名称
  39. let urlInfo = Url.parse(request.originalUrl, true);
  40. let url = urlInfo.pathname.substr(1);
  41. let actionInfo = url.split('/');
  42. let controller = 'index';
  43. let action = 'index';
  44. switch (actionInfo.length) {
  45. case 1:
  46. controller = actionInfo[0];
  47. break;
  48. case 2:
  49. controller = actionInfo[0];
  50. action = actionInfo[1];
  51. break;
  52. }
  53. // 菜单数据
  54. response.locals.menu = menuData;
  55. // 二级菜单数据
  56. response.locals.secondMenu = menuData[controller] !== undefined && menuData[controller].children !== undefined ?
  57. menuData[controller].children : {};
  58. // url相关数据
  59. response.locals.urlQuery = JSON.stringify(urlInfo.query);
  60. response.locals.controller = controller;
  61. response.locals.action = action;
  62. // 用户session数据
  63. response.locals.manager = request.session.managerData;
  64. // moment工具
  65. response.locals.moment = Moment;
  66. next();
  67. }
  68. /**
  69. * 验证方法
  70. *
  71. * @param {object} request
  72. * @param {object} response
  73. * @param {function} next
  74. * @return {void}
  75. */
  76. auth(request, response, next) {
  77. // 判断session
  78. let mangerData = request.session.managerData;
  79. try {
  80. if (typeof mangerData !== 'object' || Object.keys(mangerData).length < 0) {
  81. throw 'err data';
  82. }
  83. if (mangerData.username === undefined || mangerData.loginTime === undefined) {
  84. throw 'username empty';
  85. }
  86. // 校验session
  87. let sessionToken = crypto.createHmac('sha1', mangerData.loginTime + '')
  88. .update(mangerData.username).digest().toString('base64');
  89. if (sessionToken !== mangerData.sessionToken) {
  90. throw 'session error';
  91. }
  92. } catch (error) {
  93. console.log(error);
  94. // 未登录
  95. response.redirect('/login');
  96. }
  97. next();
  98. }
  99. }
  100. export default BaseController;