const express = require('express'); const router = express.Router(); const jwt = require('jsonwebtoken'); const rateLimit = require('express-rate-limit'); const Admin = require('../models/Admin'); const { comparePassword } = require('../utils/password'); // 登录限流 const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 10, message: { success: false, message: '登录尝试过于频繁' } }); router.post('/login', loginLimiter, async (req, res) => { try { const { username, password } = req.body; if (!username || !password) { return res.status(400).json({ success: false, message: '用户名和密码不能为空' }); } const admin = await Admin.findOne({ username }).select('+password'); if (!admin || admin.status !== 'active') { return res.status(401).json({ success: false, message: '用户名或密码错误' }); } const isMatch = await comparePassword(password, admin.password); if (!isMatch) { return res.status(401).json({ success: false, message: '用户名或密码错误' }); } const token = jwt.sign( { id: admin._id, role: admin.role, type: 'admin', jti: Math.random().toString(36) }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRES_IN || '24h' } ); res.json({ success: true, data: { id: admin._id, username: admin.username, name: admin.name, role: admin.role, token } }); } catch (error) { res.status(500).json({ success: false, message: '服务器内部错误' }); } }); module.exports = router;