power.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 'use strict';
  2. const Service = require('egg').Service;
  3. const assert = require('assert');
  4. const menu = require('../public/adminMenu');
  5. const svgCaptcha = require('svg-captcha');
  6. const sm3 = require('sm3');
  7. class UserService extends Service {
  8. async login({ acct, password, code }) {
  9. assert(acct, '帐号不存在');
  10. assert(password, '密码不存在');
  11. assert(code, '验证码不存在');
  12. const captcha = this.ctx.session.code;
  13. if (captcha !== code) {
  14. return { errmsg: '验证码错误', errcode: -2003 };
  15. }
  16. const { AdminUser: model } = this.ctx.model;
  17. try {
  18. const res = await model.findOne({ acct });
  19. if (!res) {
  20. return { errmsg: '用户不存在', errcode: -2003 };
  21. }
  22. const userInfo = res;
  23. if (userInfo.state !== '0') {
  24. return { errmsg: '用户状态异常', errcode: -2003 };
  25. }
  26. const pwd = sm3(`${password}:${userInfo.salt}`);
  27. if (userInfo.password !== pwd) {
  28. return { errmsg: '密码错误', errcode: -2003 };
  29. }
  30. const token = this.app.jwt.sign({ acct: userInfo.acct, userName: userInfo.userName, id: userInfo._id }, this.app.config.jwt.secret);
  31. return { errmsg: '', errcode: 0, token, userInfo: { acct: userInfo.acct, userName: userInfo.userName, id: userInfo._id } };
  32. } catch (error) {
  33. throw new Error('登录失败');
  34. }
  35. }
  36. async getUserMenu() {
  37. const { AdminUser: model } = this.ctx.model;
  38. const { Role: rolemodel } = this.ctx.model;
  39. try {
  40. const str = this.ctx.request.header.authorization;
  41. const token = str.substring(7);
  42. const decode = this.ctx.app.jwt.verify(token, this.app.config.jwt.secret);
  43. const menulist = [];
  44. const res = await model.find({ acct: decode.acct });
  45. if (res.length > 0) {
  46. const userRoleList = res[0].roleList;
  47. if (userRoleList && userRoleList.length > 0) {
  48. for (let e = 0; e < userRoleList.length; e++) {
  49. const role = await rolemodel.find({ code: userRoleList[e], state: '0' });
  50. if (role.length > 0) {
  51. const adminMenuList = role[0].adminMenuList;
  52. for (let i = 0; i < adminMenuList.length; i++) {
  53. const item = menu.filter(j => adminMenuList[i] === j.id)[0];
  54. if (!menulist.includes(item) && item) {
  55. menulist.push(item);
  56. }
  57. }
  58. }
  59. }
  60. }
  61. }
  62. return { errcode: 0, errmsg: '', data: menulist };
  63. } catch (error) {
  64. throw new Error('登录失败');
  65. }
  66. }
  67. async captcha() {
  68. const captcha = svgCaptcha.createMathExpr({
  69. // 翻转颜色
  70. inverse: false,
  71. // 字体大小
  72. fontSize: 36,
  73. // 噪声线条数
  74. noise: 2,
  75. // 宽度
  76. width: 80,
  77. // 高度
  78. height: 30,
  79. });
  80. // 保存到redis,忽略大小写
  81. const code = captcha.text.toLowerCase();
  82. this.ctx.session.code = code;
  83. this.ctx.response.type = 'image/svg+xml';
  84. return captcha.data;
  85. }
  86. }
  87. module.exports = UserService;