67 lines
2.4 KiB
JavaScript
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 };
|