const express = require('express'); const router = express.Router(); const db = require('../db'); const { hashPassword, verifyPassword } = require('../utils/auth'); const { authenticate, requireAdmin } = require('../middleware/auth'); router.get('/me', authenticate, async (req, res) => { try { const result = await db.query('SELECT id, username, name, email, phone, role, avatar, passport, driver_license, is_active, created_at, updated_at FROM users WHERE id = $1', [req.user.id]); if (result.rows.length === 0) { return res.status(404).json({ success: false, message: '用户不存在' }); } const u = result.rows[0]; res.json({ success: true, data: { id: u.id, username: u.username, name: u.name, email: u.email, phone: u.phone, role: u.role, avatar: u.avatar, passport: u.passport, driverLicense: u.driver_license, is_active: u.is_active } }); } catch (error) { console.error('获取用户信息失败:', error); res.status(500).json({ success: false, message: '获取用户信息失败' }); } }); router.get('/', authenticate, requireAdmin, async (req, res) => { try { const usersResult = await db.query('SELECT id, username, name, email, phone, role, is_active, created_at, updated_at FROM users ORDER BY id'); const users = usersResult.rows; res.json({ success: true, data: users, count: users.length }); } catch (error) { console.error('获取用户列表失败:', error); res.status(500).json({ success: false, message: '获取用户列表失败' }); } }); router.post('/', authenticate, requireAdmin, async (req, res) => { try { const { username, name, email, phone, role, password } = req.body; if (!username || !name || !password) { return res.status(400).json({ success: false, message: '用户名、姓名和密码为必填项' }); } const existingUser = await db.query('SELECT id FROM users WHERE username = $1', [username]); if (existingUser.rows.length > 0) { return res.status(400).json({ success: false, message: '用户名已存在' }); } const passwordHash = hashPassword(password); const result = await db.query( 'INSERT INTO users (username, password_hash, name, email, phone, role, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6, NOW(), NOW()) RETURNING id', [username, passwordHash, name, email || null, phone || null, role || 'employee'] ); const newUserResult = await db.query('SELECT id, username, name, email, phone, role, is_active, created_at, updated_at FROM users WHERE id = $1', [result.rows[0].id]); const newUser = newUserResult.rows[0]; res.json({ success: true, data: newUser }); } catch (error) { console.error('创建用户失败:', error); res.status(500).json({ success: false, message: '创建用户失败' }); } }); router.put('/:id/profile', authenticate, async (req, res) => { try { const { id } = req.params; const userId = parseInt(id); if (req.user.id !== userId && req.user.role !== 'admin') { return res.status(403).json({ success: false, message: '只能修改自己的个人信息' }); } const { name, email, phone, avatar, passport, driver_license } = req.body; await db.query( 'UPDATE users SET name = $1, email = $2, phone = $3, avatar = $4, passport = $5, driver_license = $6, updated_at = NOW() WHERE id = $7', [name, email || null, phone || null, avatar || null, passport || null, driver_license || null, userId] ); const updatedUserResult = await db.query('SELECT id, username, name, email, phone, role, avatar, passport, driver_license, is_active, created_at, updated_at FROM users WHERE id = $1', [userId]); const updatedUser = updatedUserResult.rows[0]; if (!updatedUser) { return res.status(404).json({ success: false, message: '用户不存在' }); } res.json({ success: true, data: updatedUser }); } catch (error) { console.error('更新个人信息失败:', error); res.status(500).json({ success: false, message: '更新个人信息失败' }); } }); router.put('/:id', authenticate, requireAdmin, async (req, res) => { try { const { id } = req.params; const { name, email, phone, role, password, avatar, passport, driver_license } = req.body; if (password) { const passwordHash = hashPassword(password); await db.query( 'UPDATE users SET name = $1, email = $2, phone = $3, role = $4, avatar = $5, passport = $6, driver_license = $7, password_hash = $8, updated_at = NOW() WHERE id = $9', [name, email || null, phone || null, role, avatar || null, passport || null, driver_license || null, passwordHash, id] ); } else { await db.query( 'UPDATE users SET name = $1, email = $2, phone = $3, role = $4, avatar = $5, passport = $6, driver_license = $7, updated_at = NOW() WHERE id = $8', [name, email || null, phone || null, role, avatar || null, passport || null, driver_license || null, id] ); } const updatedUserResult = await db.query('SELECT id, username, name, email, phone, role, avatar, passport, driver_license, is_active, created_at, updated_at FROM users WHERE id = $1', [id]); const updatedUser = updatedUserResult.rows[0]; if (!updatedUser) { return res.status(404).json({ success: false, message: '用户不存在' }); } res.json({ success: true, data: updatedUser }); } catch (error) { console.error('更新用户信息失败:', error); res.status(500).json({ success: false, message: '更新用户信息失败' }); } }); router.put('/:id/password', authenticate, async (req, res) => { try { const { id } = req.params; const { currentPassword, newPassword } = req.body; if (!newPassword) { return res.status(400).json({ success: false, message: '新密码不能为空' }); } const userResult = await db.query('SELECT id, password_hash FROM users WHERE id = $1', [id]); if (userResult.rows.length === 0) { return res.status(404).json({ success: false, message: '用户不存在' }); } const user = userResult.rows[0]; const isAdmin = req.user.role === 'admin'; const isSelf = req.user.id === parseInt(id); if (isSelf && currentPassword) { if (!verifyPassword(currentPassword, user.password_hash)) { return res.status(400).json({ success: false, message: '当前密码错误' }); } } else if (!isAdmin) { return res.status(403).json({ success: false, message: '只能修改自己的密码' }); } const newPasswordHash = hashPassword(newPassword); await db.query( 'UPDATE users SET password_hash = $1, updated_at = NOW() WHERE id = $2', [newPasswordHash, id] ); res.json({ success: true, message: '密码更新成功' }); } catch (error) { console.error('更新密码失败:', error); res.status(500).json({ success: false, message: '更新密码失败' }); } }); router.delete('/:id', authenticate, requireAdmin, async (req, res) => { try { const { id } = req.params; if (parseInt(id) === req.user.id) { return res.status(400).json({ success: false, message: '不能删除自己' }); } const existingUser = await db.query('SELECT id, role FROM users WHERE id = $1', [id]); if (existingUser.rows.length === 0) { return res.status(404).json({ success: false, message: '用户不存在' }); } if (existingUser.rows[0].role === 'admin') { const adminCount = await db.query("SELECT COUNT(*) as cnt FROM users WHERE role = 'admin'"); if (parseInt(adminCount.rows[0].cnt) <= 1) { return res.status(400).json({ success: false, message: '至少需要保留一个管理员账号' }); } } await db.query('DELETE FROM users WHERE id = $1', [id]); res.json({ success: true, message: '用户删除成功' }); } catch (error) { console.error('删除用户失败:', error); res.status(500).json({ success: false, message: '删除用户失败' }); } }); module.exports = router;