user.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. const express = require('express');
  2. const bcrypt = require('bcryptjs');
  3. const jwt = require('jsonwebtoken');
  4. const router = express.Router();
  5. const authMiddleware = require('../middleware/authMiddleware');
  6. const User = require('../models/User');
  7. const Logs = require('../libs/logs');
  8. // 注册
  9. router.post('/add',authMiddleware, async (req, res) => {
  10. const { username, password } = req.body;
  11. User.add({ username, password })
  12. .then(() => {
  13. res.sendSuccess('添加成功');
  14. })
  15. .catch(err => {
  16. Logs.errDev('添加失败:', err);
  17. if (err.message === 'USER_EXISTS') {
  18. return res.badRequest('用户已存在');
  19. }
  20. res.badRequest(err.message);
  21. });
  22. });
  23. // 登录 - 支持原路径 /login 和 mock 服务路径 /login
  24. router.post('/login', async (req, res) => {
  25. const { username, password } = req.body;
  26. User.login({ username, password })
  27. .then(({ info, accessToken, refreshToken }) => {
  28. // 设置 refresh token 到 cookie
  29. res.cookie('jwt', refreshToken, {
  30. httpOnly: true,
  31. secure: true,
  32. sameSite: 'none',
  33. maxAge: 7 * 24 * 60 * 60 * 1000 // 7天
  34. });
  35. // 返回格式与前端期望一致
  36. res.sendSuccess({ accessToken, ...info });
  37. })
  38. .catch(err => {
  39. Logs.errDev('登录失败:', err);
  40. if (err.message === 'USER_NOT_FOUND') {
  41. return res.badRequest('用户不存在');
  42. }
  43. if (err.message === 'PASSWORD_ERROR') {
  44. return res.badRequest('密码错误');
  45. }
  46. res.badRequest(err.message);
  47. });
  48. });
  49. router.post('/logout', authMiddleware, (req, res) => {
  50. res.clearCookie('jwt');
  51. res.sendSuccess('退出成功');
  52. });
  53. // 刷新 Token - 支持 Vben Admin 的 /refresh 路径
  54. router.post('/refresh', async (req, res) => {
  55. const refreshToken = req.cookies.jwt;
  56. if (!refreshToken) {
  57. return res.unauthorized('无效的刷新token');
  58. }
  59. User.refresh(refreshToken)
  60. .then(accessToken => {
  61. res.send(accessToken);
  62. })
  63. .catch(err => {
  64. Logs.errDev('刷新Token失败:', err);
  65. res.clearCookie('jwt');
  66. if (err.message === 'USER_NOT_FOUND') {
  67. return res.unauthorized('用户不存在');
  68. }
  69. res.unauthorized(err.message);
  70. });
  71. });
  72. // 用户信息 - 支持 mock 服务的 /info 路径
  73. router.get('/info', authMiddleware, async (req, res) => {
  74. User.info(req.userId)
  75. .then(userInfo => {
  76. res.sendSuccess(userInfo);
  77. })
  78. .catch(err => {
  79. Logs.errDev('获取用户信息错误:', err);
  80. if (err.message === 'USER_NOT_FOUND') {
  81. return res.notFound('用户不存在');
  82. }
  83. res.serverError(err.message);
  84. });
  85. });
  86. // 权限码 - 支持 mock 服务的 /codes 路径
  87. router.get('/codes', authMiddleware, async (req, res) => {
  88. try {
  89. // 返回所有功能的权限码
  90. const codes = [
  91. 'dashboard',
  92. 'dashboard:analysis',
  93. 'dashboard:workbench',
  94. 'system',
  95. 'system:account',
  96. 'system:account:settings',
  97. 'system:role',
  98. 'system:menu',
  99. 'system:dept',
  100. ];
  101. res.sendSuccess(codes);
  102. }
  103. catch (err) {
  104. Logs.errDev('获取权限码错误:', err);
  105. res.serverError(err.message);
  106. }
  107. });
  108. module.exports = router;