const express = require('express') const router = express.Router() const { User } = require('../models') const { validate } = require('../middleware/validation') const authenticate = require('../middleware/authenticate') const authorize = require('../middleware/authorize')
router.get('/', authenticate, async (req, res) => { try { const { page = 1, limit = 10, role, status } = req.query const offset = (page - 1) * limit const where = {} if (role) where.role = role if (status) where.status = status const { rows: users, count } = await User.findAndCountAll({ where, limit: parseInt(limit), offset: parseInt(offset), attributes: ['id', 'name', 'email', 'role', 'status', 'created_at'] }) res.json({ success: true, data: users, pagination: { total: count, page: parseInt(page), limit: parseInt(limit), total_pages: Math.ceil(count / limit) } }) } catch (error) { res.status(500).json({ success: false, error: { code: 'INTERNAL_SERVER_ERROR', message: '获取用户列表失败' } }) } })
router.get('/:id', authenticate, async (req, res) => { try { const user = await User.findByPk(req.params.id, { attributes: ['id', 'name', 'email', 'role', 'status', 'created_at'] }) if (!user) { return res.status(404).json({ success: false, error: { code: 'RESOURCE_NOT_FOUND', message: '用户不存在' } }) } res.json({ success: true, data: user }) } catch (error) { res.status(500).json({ success: false, error: { code: 'INTERNAL_SERVER_ERROR', message: '获取用户信息失败' } }) } })
router.post('/', validate({ body: { name: Joi.string().min(2).max(50).required(), email: Joi.string().email().required(), password: Joi.string().min(6).required(), role: Joi.string().valid('admin', 'user').default('user') } }), async (req, res) => { try { const { name, email, password, role } = req.body const existingUser = await User.findOne({ where: { email } }) if (existingUser) { return res.status(409).json({ success: false, error: { code: 'RESOURCE_CONFLICT', message: '邮箱已被注册' } }) } const user = await User.create({ name, email, password, role }) res.status(201).json({ success: true, data: { id: user.id, name: user.name, email: user.email, role: user.role } }) } catch (error) { res.status(500).json({ success: false, error: { code: 'INTERNAL_SERVER_ERROR', message: '创建用户失败' } }) } } )
router.put('/:id', authenticate, authorize(['admin', 'user']), validate({ body: { name: Joi.string().min(2).max(50), email: Joi.string().email(), role: Joi.string().valid('admin', 'user') } }), async (req, res) => { try { const user = await User.findByPk(req.params.id) if (!user) { return res.status(404).json({ success: false, error: { code: 'RESOURCE_NOT_FOUND', message: '用户不存在' } }) } if (req.user.role !== 'admin' && req.user.id !== user.id) { return res.status(403).json({ success: false, error: { code: 'FORBIDDEN', message: '无权限修改此用户' } }) } await user.update(req.body) res.json({ success: true, data: { id: user.id, name: user.name, email: user.email, role: user.role } }) } catch (error) { res.status(500).json({ success: false, error: { code: 'INTERNAL_SERVER_ERROR', message: '更新用户失败' } }) } } )
router.delete('/:id', authenticate, authorize(['admin']), async (req, res) => { try { const user = await User.findByPk(req.params.id) if (!user) { return res.status(404).json({ success: false, error: { code: 'RESOURCE_NOT_FOUND', message: '用户不存在' } }) } if (user.role === 'admin') { return res.status(403).json({ success: false, error: { code: 'BUSINESS_RULE_VIOLATION', message: '不能删除管理员账户' } }) } await user.destroy() res.status(204).send() } catch (error) { res.status(500).json({ success: false, error: { code: 'INTERNAL_SERVER_ERROR', message: '删除用户失败' } }) } } )
module.exports = router
|