- 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>
109 lines
3.6 KiB
JavaScript
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();
|