const mysql = require('mysql2/promise'); // 資料庫配置 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' }; async function createPasswordResetTable() { console.log('🚀 創建密碼重設 token 資料表...'); try { const connection = await mysql.createConnection(dbConfig); console.log('✅ 資料庫連接成功'); // 先檢查 users 表的結構 console.log('🔍 檢查 users 表結構...'); const [userColumns] = await connection.execute(` SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'users' AND COLUMN_NAME = 'id' `, [dbConfig.database]); if (userColumns.length > 0) { console.log('📋 users.id 欄位資訊:', userColumns[0]); } // 創建密碼重設 tokens 表 const createTableSQL = ` CREATE TABLE IF NOT EXISTS password_reset_tokens ( id VARCHAR(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci PRIMARY KEY, user_id VARCHAR(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, token VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL UNIQUE, expires_at TIMESTAMP NOT NULL, used_at TIMESTAMP NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_user_id (user_id), INDEX idx_token (token), INDEX idx_expires_at (expires_at), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci `; await connection.execute(createTableSQL); console.log('✅ 密碼重設 tokens 表創建成功'); // 檢查表是否創建成功 const [tables] = await connection.execute(` SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'password_reset_tokens' `, [dbConfig.database]); if (tables.length > 0) { console.log('📋 表資訊:', tables[0]); } // 檢查表結構 const [columns] = await connection.execute(` SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'password_reset_tokens' ORDER BY ORDINAL_POSITION `, [dbConfig.database]); console.log('\n📋 表結構:'); columns.forEach(col => { console.log(`- ${col.COLUMN_NAME}: ${col.DATA_TYPE} (${col.IS_NULLABLE === 'YES' ? '可為空' : '不可為空'}) ${col.COLUMN_KEY ? `[${col.COLUMN_KEY}]` : ''}`); }); await connection.end(); console.log('\n🎉 密碼重設表創建完成!'); } catch (error) { console.error('❌ 創建表時發生錯誤:', error); } } createPasswordResetTable();