Files

67 lines
2.4 KiB
JavaScript

// 数据库迁移:添加 password_hash 字段到 users 表
const db = require('../db-sqlite');
const { hashPassword } = require('../utils/auth');
async function migrate() {
try {
console.log('开始迁移:添加 password_hash 字段...');
// 检查 password_hash 字段是否已存在
const result = await db.query("PRAGMA table_info(users)");
const hasPasswordHash = result.rows.some(row => row.name === 'password_hash');
if (hasPasswordHash) {
console.log('✅ password_hash 字段已存在,跳过迁移');
return;
}
// 添加 password_hash 字段
await db.query("ALTER TABLE users ADD COLUMN password_hash TEXT");
console.log('✅ password_hash 字段添加成功');
// 获取所有用户,为现有用户设置默认密码哈希
// 注意:这会使用密码 '123456' 为所有用户生成哈希
// 首次登录后需要提示用户修改密码
const defaultPassword = '123456';
const defaultHash = hashPassword(defaultPassword);
// 更新所有现有用户,将 plaintext password 迁移到 password_hash
const usersResult = await db.query("SELECT id, password FROM users WHERE password_hash IS NULL");
console.log(`找到 ${usersResult.rows.length} 个需要迁移的用户`);
for (const user of usersResult.rows) {
// 如果已有明文密码,使用相同的密码生成哈希
// 如果没有明文密码,使用默认密码
const passwordToHash = user.password || defaultPassword;
const hashedPassword = hashPassword(passwordToHash);
await db.query(
"UPDATE users SET password_hash = ? WHERE id = ?",
[hashedPassword, user.id]
);
console.log(` 用户 ID ${user.id} 密码已迁移`);
}
console.log('✅ 密码迁移完成');
console.log('');
console.log('⚠️ 重要提示:');
console.log(' - 现有用户密码已迁移(或使用默认密码 123456)');
console.log(' - 建议通知所有用户首次登录后修改密码');
console.log(' - 新注册用户的密码将自动使用哈希存储');
} catch (error) {
console.error('❌ 迁移失败:', error.message);
process.exit(1);
}
}
// 如果是直接运行此脚本
if (require.main === module) {
migrate().then(() => {
console.log('\n迁移完成');
process.exit(0);
});
}
module.exports = { migrate };