user.js 3.0 KB

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