125 lines
3.3 KiB
JavaScript
125 lines
3.3 KiB
JavaScript
const fs = require('fs');
|
||||
|
|
const content = fs.readFileSync('routes/auth.js', 'utf8');
|
|||
|
|
|
|||
|
|
// 修复导入:从../middleware/auth导入所有需要的函数
|
|||
|
|
const fixedContent = `const express = require('express');
|
|||
|
|
const router = express.Router();
|
|||
|
|
|
|||
|
|
// 导入依赖
|
|||
|
|
const db = require('../db-sqlite');
|
|||
|
|
const { hashPassword, verifyPassword, generateToken } = require('../middleware/auth');
|
|||
|
|
const { authenticate } = require('../middleware/auth');
|
|||
|
|
|
|||
|
|
router.post('/login', async (req, res) => {
|
|||
|
|
try {
|
|||
|
|
const { username, password } = req.body;
|
|||
|
|
|
|||
|
|
if (!username || !password) {
|
|||
|
|
return res.status(400).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户名和密码不能为空'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 从数据库中查询用户(同时获取 password_hash)
|
|||
|
|
const result = await db.query(
|
|||
|
|
'SELECT id, username, name, email, phone, role, password_hash FROM users WHERE username = ?',
|
|||
|
|
[username]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if (!result || result.rows.length === 0) {
|
|||
|
|
return res.status(401).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户名或密码错误'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const user = result.rows[0];
|
|||
|
|
|
|||
|
|
// 验证密码(兼容旧版明文密码和新版哈希密码)
|
|||
|
|
let isValidPassword = false;
|
|||
|
|
if (user.password_hash) {
|
|||
|
|
// 使用哈希验证
|
|||
|
|
isValidPassword = verifyPassword(password, user.password_hash);
|
|||
|
|
} else {
|
|||
|
|
// 兼容旧版明文密码(用于迁移过渡)
|
|||
|
|
isValidPassword = (user.password === password);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!isValidPassword) {
|
|||
|
|
return res.status(401).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '用户名或密码错误'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成 JWT Token
|
|||
|
|
const token = generateToken({
|
|||
|
|
id: user.id,
|
|||
|
|
username: user.username,
|
|||
|
|
role: user.role
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
console.log(\`用户 \${username} 登录成功\`);
|
|||
|
|
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
data: {
|
|||
|
|
id: user.id,
|
|||
|
|
username: user.username,
|
|||
|
|
name: user.name,
|
|||
|
|
email: user.email,
|
|||
|
|
phone: user.phone,
|
|||
|
|
role: user.role,
|
|||
|
|
department: '',
|
|||
|
|
token: token
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('登录失败:', error);
|
|||
|
|
res.status(500).json({
|
|||
|
|
success: false,
|
|||
|
|
message: '登录失败',
|
|||
|
|
error: error.message
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 验证 Token API
|
|||
|
|
router.get('/verify', authenticate, (req, res) => {
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
data: {
|
|||
|
|
user: req.user
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 登出 API(客户端删除 token 即可,这里记录日志)
|
|||
|
|
router.post('/logout', authenticate, (req, res) => {
|
|||
|
|
console.log(\`用户 \${req.user.username} 登出\`);
|
|||
|
|
res.json({
|
|||
|
|
success: true,
|
|||
|
|
message: '登出成功'
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
module.exports = router;`;
|
|||
|
|
|
|||
|
|
// 写入修复后的文件
|
|||
|
|
fs.writeFileSync('routes/auth.js', fixedContent);
|
|||
|
|
console.log('✅ 已完全修复auth路由文件');
|
|||
|
|
|
|||
|
|
// 验证修复
|
|||
|
|
const fixedFileContent = fs.readFileSync('routes/auth.js', 'utf8');
|
|||
|
|
console.log(`文件大小:${fixedFileContent.length} 字符`);
|
|||
|
|
|
|||
|
|
// 检查关键函数是否存在
|
|||
|
|
if (fixedFileContent.includes('verifyPassword') &&
|
|||
|
|
fixedFileContent.includes('generateToken') &&
|
|||
|
|
fixedFileContent.includes('authenticate')) {
|
|||
|
|
console.log('✅ auth路由文件修复验证成功');
|
|||
|
|
} else {
|
|||
|
|
console.log('❌ auth路由文件修复验证失败');
|
|||
|
|
process.exit(1);
|
|||
|
|
}
|