Files
5why-analyzer/scripts/seed-test-users.js
donald f9ee43b73c feat: Add 5Why_ prefix to all database tables
- Rename all tables with 5Why_ prefix for namespace isolation
- Update models: User.js, Analysis.js, AuditLog.js
- Update routes: llmConfig.js
- Update scripts: seed-test-users.js, add-deepseek-config.js, add-ollama-config.js
- Add migrate-table-prefix.js script for database migration
- Update db_schema.sql with new table names
- Update views: 5Why_user_analysis_stats, 5Why_recent_analyses

Tables renamed:
- users -> 5Why_users
- analyses -> 5Why_analyses
- analysis_perspectives -> 5Why_analysis_perspectives
- analysis_whys -> 5Why_analysis_whys
- llm_configs -> 5Why_llm_configs
- system_settings -> 5Why_system_settings
- audit_logs -> 5Why_audit_logs
- sessions -> 5Why_sessions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 18:19:53 +08:00

109 lines
3.6 KiB
JavaScript

import mysql from 'mysql2/promise';
import dotenv from 'dotenv';
import bcrypt from 'bcryptjs';
// 載入環境變數
dotenv.config();
// 資料庫配置
const dbConfig = {
host: process.env.DB_HOST || 'mysql.theaken.com',
port: parseInt(process.env.DB_PORT) || 33306,
user: process.env.DB_USER || 'A102',
password: process.env.DB_PASSWORD || 'Bb123456',
database: process.env.DB_NAME || 'db_A102'
};
// 測試帳號列表
const testUsers = [
{
employee_id: 'ADMIN001',
username: 'admin',
email: 'admin@example.com',
password: 'Admin@123456',
role: 'super_admin',
department: 'IT',
position: '系統管理員'
},
{
employee_id: 'MGR001',
username: 'manager',
email: 'manager@example.com',
password: 'Manager@123456',
role: 'admin',
department: '品質管理部',
position: '品管經理'
},
{
employee_id: 'TEST001',
username: 'testuser',
email: 'user@example.com',
password: 'User@123456',
role: 'user',
department: '生產部',
position: '工程師'
}
];
async function seedTestUsers() {
let connection;
try {
console.log('\n╔════════════════════════════════════════════╗');
console.log('║ 5 Why Analyzer - Seed Test Users ║');
console.log('╚════════════════════════════════════════════╝\n');
console.log('🔄 Connecting to database...');
connection = await mysql.createConnection(dbConfig);
console.log('✅ Connected successfully\n');
for (const user of testUsers) {
// 檢查使用者是否已存在 (只用 email 精確匹配)
const [existing] = await connection.execute(
'SELECT id FROM 5Why_users WHERE email = ?',
[user.email]
);
if (existing.length > 0) {
// 更新現有使用者的密碼
const passwordHash = await bcrypt.hash(user.password, 10);
await connection.execute(
'UPDATE 5Why_users SET password_hash = ?, role = ?, is_active = 1, employee_id = ? WHERE email = ?',
[passwordHash, user.role, user.employee_id, user.email]
);
console.log(`🔄 Updated: ${user.email} (${user.role})`);
} else {
// 建立新使用者
const passwordHash = await bcrypt.hash(user.password, 10);
await connection.execute(
`INSERT INTO 5Why_users (employee_id, username, email, password_hash, role, department, position, is_active)
VALUES (?, ?, ?, ?, ?, ?, ?, 1)`,
[user.employee_id, user.username, user.email, passwordHash, user.role, user.department, user.position]
);
console.log(`✅ Created: ${user.email} (${user.role})`);
}
}
console.log('\n✅ Test users seeded successfully!\n');
console.log('📋 Test Accounts:');
console.log('─────────────────────────────────────────────');
testUsers.forEach(user => {
console.log(` ${user.role.padEnd(12)} : ${user.email} / ${user.password}`);
});
console.log('─────────────────────────────────────────────\n');
} catch (error) {
console.error('\n❌ Seeding failed:');
console.error(' Error:', error.message);
process.exit(1);
} finally {
if (connection) {
await connection.end();
console.log('🔌 Database connection closed\n');
}
}
}
// 執行
seedTestUsers();