Files
2026-05-11 16:01:22 +08:00

104 lines
3.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import express from 'express'
import jwt from 'jsonwebtoken'
import User from '../model/user.js'
const router = express.Router()
// 获取所有用户
router.get('/', requireAuth, requireAdmin, async (req, res) => {
try {
const users = await User.find().select('-password')
res.json(users)
} catch (error) {
res.status(500).json({ message: '获取用户信息时发生错误', error: error.message })
}
})
// 创建新用户
router.post('/', requireAuth, requireAdmin, async (req, res) => {
try {
const { username, nickname, password } = req.body
const user = await User.create({
username,
nickname,
password,
role: 'user',
})
res.status(201).json(user)
} catch (error) {
res.status(400).json({ message: '创建用户时发生错误', error: error.message })
}
})
// 删除用户
router.delete('/:id', requireAuth, requireAdmin, async (req, res) => {
try {
if (req.user._id.toString() === req.params.id) {
return res.status(400).json({ message: '不能删除你自己' })
}
const user = await User.findByIdAndDelete(req.params.id)
if (user) {
res.json({ message: '已删除用户' })
} else {
res.status(404).json({ message: '该用户不存在' })
}
} catch (error) {
res.status(500).json({ message: '删除用户时发生错误', error: error.message })
}
})
// 用户登录
router.post('/login', async (req, res) => {
try {
const { username, password } = req.body
const user = await User.findOne({ username })
if (user && (await user.comparePassword(password))) {
const token = jwt.sign({ id: user._id, username: user.username }, process.env.JWT_SECRET, {
expiresIn: '24h',
})
res.json({ token, user })
} else {
res.status(401).json({ message: '用户名或密码错误' })
}
} catch (error) {
res.status(500).json({ message: '登录过程中发生错误', error: error.message })
}
})
/**
* 验证用户身份,拒绝未认证的请求
*/
async function requireAuth(req, res, next) {
const authHeader = req.headers['authorization']
if (!authHeader) {
return res.status(401).json({ message: '未提供身份验证信息' })
}
const token = authHeader.split(' ').pop()
if (!token) {
return res.status(401).json({ message: '提供了错误的身份验证信息' })
}
jwt.verify(token, process.env.JWT_SECRET, async (err, decoded) => {
if (err) {
return res.status(401).json({ message: '身份验证失败' })
}
// 从数据库获取完整的用户信息
req.user = await User.findById(decoded.id)
next()
})
}
/**
* 检查用户是否具有管理员权限调用前必须先调用requireAuth中间件验证用户身份
*/
async function requireAdmin(req, res, next) {
if (req.user && req.user.role === 'admin') {
next()
} else {
res.status(403).json({ message: '需要管理员权限' })
}
}
export { router as userRouter, requireAuth, requireAdmin }