Files
ai-showcase-platform/scripts/create-admin.js

134 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const mysql = require('mysql2/promise');
const bcrypt = require('bcrypt');
const crypto = require('crypto');
// 資料庫配置
const dbConfig = {
host: process.env.DB_HOST || 'mysql.theaken.com',
port: parseInt(process.env.DB_PORT || '33306'),
user: process.env.DB_USER || 'AI_Platform',
password: process.env.DB_PASSWORD || 'Aa123456',
database: process.env.DB_NAME || 'db_AI_Platform',
charset: 'utf8mb4',
timezone: '+08:00'
};
// 生成 UUID
function generateId() {
return crypto.randomUUID();
}
// 加密密碼
async function hashPassword(password) {
const saltRounds = 12;
return await bcrypt.hash(password, saltRounds);
}
async function createAdmin() {
let connection;
try {
console.log('🔌 連接資料庫...');
connection = await mysql.createConnection(dbConfig);
console.log('✅ 資料庫連接成功');
// 管理員資料
const adminData = {
id: generateId(),
name: 'AI平台管理員',
email: 'admin@theaken.com',
password: 'Admin@2024',
department: '資訊技術部',
role: 'admin'
};
console.log('\n📋 準備建立管理員帳號:');
console.log(` 姓名: ${adminData.name}`);
console.log(` 電子郵件: ${adminData.email}`);
console.log(` 部門: ${adminData.department}`);
console.log(` 角色: ${adminData.role}`);
// 檢查是否已存在
const [existingUser] = await connection.execute(
'SELECT id FROM users WHERE email = ?',
[adminData.email]
);
if (existingUser.length > 0) {
console.log('\n⚠ 管理員帳號已存在,更新密碼...');
// 加密新密碼
const passwordHash = await hashPassword(adminData.password);
// 更新密碼
await connection.execute(
'UPDATE users SET password_hash = ?, updated_at = NOW() WHERE email = ?',
[passwordHash, adminData.email]
);
console.log('✅ 管理員密碼已更新');
} else {
console.log('\n📝 建立新的管理員帳號...');
// 加密密碼
const passwordHash = await hashPassword(adminData.password);
// 插入管理員資料
await connection.execute(`
INSERT INTO users (
id, name, email, password_hash, department, role,
join_date, total_likes, total_views, created_at, updated_at
) VALUES (?, ?, ?, ?, ?, ?, CURDATE(), 0, 0, NOW(), NOW())
`, [
adminData.id,
adminData.name,
adminData.email,
passwordHash,
adminData.department,
adminData.role
]);
console.log('✅ 管理員帳號建立成功');
}
// 驗證建立結果
console.log('\n🔍 驗證管理員帳號...');
const [adminUser] = await connection.execute(
'SELECT id, name, email, department, role, created_at FROM users WHERE email = ?',
[adminData.email]
);
if (adminUser.length > 0) {
const user = adminUser[0];
console.log('✅ 管理員帳號驗證成功:');
console.log(` ID: ${user.id}`);
console.log(` 姓名: ${user.name}`);
console.log(` 電子郵件: ${user.email}`);
console.log(` 部門: ${user.department}`);
console.log(` 角色: ${user.role}`);
console.log(` 建立時間: ${user.created_at}`);
}
console.log('\n🎉 管理員帳號設定完成!');
console.log('\n📋 登入資訊:');
console.log(` 電子郵件: ${adminData.email}`);
console.log(` 密碼: ${adminData.password}`);
console.log('\n⚠ 請妥善保管登入資訊,建議在首次登入後更改密碼');
} catch (error) {
console.error('❌ 建立管理員帳號失敗:', error.message);
process.exit(1);
} finally {
if (connection) {
await connection.end();
console.log('🔌 資料庫連接已關閉');
}
}
}
// 如果直接執行此腳本
if (require.main === module) {
createAdmin();
}
module.exports = { createAdmin };