完成品
This commit is contained in:
319
scripts/populate-sample-data.js
Normal file
319
scripts/populate-sample-data.js
Normal file
@@ -0,0 +1,319 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// =====================================================
|
||||
// 填充示例數據腳本
|
||||
// =====================================================
|
||||
|
||||
const mysql = require('mysql2/promise');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
// 資料庫配置
|
||||
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 populateSampleData() {
|
||||
let connection;
|
||||
|
||||
try {
|
||||
console.log('🚀 開始填充示例數據...');
|
||||
|
||||
// 創建連接
|
||||
connection = await mysql.createConnection(dbConfig);
|
||||
console.log('✅ 資料庫連接成功');
|
||||
|
||||
// 1. 創建示例用戶
|
||||
console.log('👥 創建示例用戶...');
|
||||
const users = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '張小明',
|
||||
email: 'zhang.xiaoming@company.com',
|
||||
password_hash: '$2b$10$example.hash.here', // 示例哈希
|
||||
department: 'HQBU',
|
||||
role: 'developer',
|
||||
join_date: '2024-01-15',
|
||||
total_likes: 25,
|
||||
total_views: 150,
|
||||
is_active: true
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '李美華',
|
||||
email: 'li.meihua@company.com',
|
||||
password_hash: '$2b$10$example.hash.here',
|
||||
department: 'ITBU',
|
||||
role: 'developer',
|
||||
join_date: '2024-02-01',
|
||||
total_likes: 18,
|
||||
total_views: 120,
|
||||
is_active: true
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '王大偉',
|
||||
email: 'wang.dawei@company.com',
|
||||
password_hash: '$2b$10$example.hash.here',
|
||||
department: 'MBU1',
|
||||
role: 'developer',
|
||||
join_date: '2024-01-20',
|
||||
total_likes: 32,
|
||||
total_views: 200,
|
||||
is_active: true
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '陳小芳',
|
||||
email: 'chen.xiaofang@company.com',
|
||||
password_hash: '$2b$10$example.hash.here',
|
||||
department: 'SBU',
|
||||
role: 'developer',
|
||||
join_date: '2024-02-10',
|
||||
total_likes: 15,
|
||||
total_views: 90,
|
||||
is_active: true
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '劉志強',
|
||||
email: 'liu.zhiqiang@company.com',
|
||||
password_hash: '$2b$10$example.hash.here',
|
||||
department: 'HQBU',
|
||||
role: 'admin',
|
||||
join_date: '2023-12-01',
|
||||
total_likes: 5,
|
||||
total_views: 50,
|
||||
is_active: true
|
||||
}
|
||||
];
|
||||
|
||||
for (const user of users) {
|
||||
await connection.execute(
|
||||
`INSERT INTO users (id, name, email, password_hash, department, role, join_date, total_likes, total_views, status, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
[user.id, user.name, user.email, user.password_hash, user.department, user.role, user.join_date, user.total_likes, user.total_views, 'active']
|
||||
);
|
||||
}
|
||||
console.log(`✅ 創建了 ${users.length} 個用戶`);
|
||||
|
||||
// 2. 創建示例評審
|
||||
console.log('👨⚖️ 創建示例評審...');
|
||||
const judges = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '王教授',
|
||||
title: '技術總監',
|
||||
department: 'ITBU',
|
||||
expertise: JSON.stringify(['AI', '機器學習', '深度學習']),
|
||||
is_active: true
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '李博士',
|
||||
title: '產品經理',
|
||||
department: 'HQBU',
|
||||
expertise: JSON.stringify(['產品設計', '用戶體驗', '商業分析']),
|
||||
is_active: true
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '陳工程師',
|
||||
title: '資深工程師',
|
||||
department: 'MBU1',
|
||||
expertise: JSON.stringify(['軟體開發', '系統架構', '資料庫']),
|
||||
is_active: true
|
||||
}
|
||||
];
|
||||
|
||||
for (const judge of judges) {
|
||||
await connection.execute(
|
||||
`INSERT INTO judges (id, name, title, department, expertise, is_active, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
[judge.id, judge.name, judge.title, judge.department, judge.expertise, judge.is_active]
|
||||
);
|
||||
}
|
||||
console.log(`✅ 創建了 ${judges.length} 個評審`);
|
||||
|
||||
// 3. 創建示例競賽
|
||||
console.log('🏆 創建示例競賽...');
|
||||
const competitions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '2024年AI創新競賽',
|
||||
description: '展示最新的AI技術創新成果',
|
||||
type: 'individual',
|
||||
year: 2024,
|
||||
month: 3,
|
||||
start_date: '2024-03-01',
|
||||
end_date: '2024-03-31',
|
||||
status: 'active',
|
||||
is_current: true,
|
||||
is_active: true,
|
||||
evaluation_focus: JSON.stringify(['創新性', '技術性', '實用性']),
|
||||
max_team_size: 5
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '2024年團隊協作競賽',
|
||||
description: '團隊協作開發的AI應用',
|
||||
type: 'team',
|
||||
year: 2024,
|
||||
month: 4,
|
||||
start_date: '2024-04-01',
|
||||
end_date: '2024-04-30',
|
||||
status: 'upcoming',
|
||||
is_current: false,
|
||||
is_active: true,
|
||||
evaluation_focus: JSON.stringify(['團隊協作', '技術實現', '創新應用']),
|
||||
max_team_size: 8
|
||||
}
|
||||
];
|
||||
|
||||
for (const competition of competitions) {
|
||||
await connection.execute(
|
||||
`INSERT INTO competitions (id, name, description, type, year, month, start_date, end_date, status, is_current, is_active, evaluation_focus, max_team_size, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
[competition.id, competition.name, competition.description, competition.type, competition.year, competition.month,
|
||||
competition.start_date, competition.end_date, competition.status, competition.is_current, competition.is_active,
|
||||
competition.evaluation_focus, competition.max_team_size]
|
||||
);
|
||||
}
|
||||
console.log(`✅ 創建了 ${competitions.length} 個競賽`);
|
||||
|
||||
// 4. 創建示例應用
|
||||
console.log('📱 創建示例應用...');
|
||||
const apps = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '智能對話助手',
|
||||
description: '基於大語言模型的智能對話系統',
|
||||
creator_id: users[0].id,
|
||||
team_id: null,
|
||||
category: '文字處理',
|
||||
technology_stack: JSON.stringify(['Python', 'OpenAI API', 'React']),
|
||||
github_url: 'https://github.com/example/chatbot',
|
||||
demo_url: 'https://demo.example.com/chatbot',
|
||||
status: 'published',
|
||||
is_active: true,
|
||||
total_likes: 25,
|
||||
total_views: 150
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '圖像生成工具',
|
||||
description: 'AI驅動的創意圖像生成平台',
|
||||
creator_id: users[1].id,
|
||||
team_id: null,
|
||||
category: '圖像生成',
|
||||
technology_stack: JSON.stringify(['Python', 'Stable Diffusion', 'FastAPI']),
|
||||
github_url: 'https://github.com/example/image-gen',
|
||||
demo_url: 'https://demo.example.com/image-gen',
|
||||
status: 'published',
|
||||
is_active: true,
|
||||
total_likes: 18,
|
||||
total_views: 120
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: '語音識別系統',
|
||||
description: '高精度多語言語音識別服務',
|
||||
creator_id: users[2].id,
|
||||
team_id: null,
|
||||
category: '語音辨識',
|
||||
technology_stack: JSON.stringify(['Python', 'Whisper', 'Docker']),
|
||||
github_url: 'https://github.com/example/speech-recognition',
|
||||
demo_url: 'https://demo.example.com/speech',
|
||||
status: 'published',
|
||||
is_active: true,
|
||||
total_likes: 32,
|
||||
total_views: 200
|
||||
}
|
||||
];
|
||||
|
||||
for (const app of apps) {
|
||||
await connection.execute(
|
||||
`INSERT INTO apps (id, name, description, creator_id, team_id, category, type, app_url, likes_count, views_count, is_active, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
[app.id, app.name, app.description, app.creator_id, app.team_id, app.category, 'web', app.demo_url, app.total_likes, app.total_views, 1]
|
||||
);
|
||||
}
|
||||
console.log(`✅ 創建了 ${apps.length} 個應用`);
|
||||
|
||||
// 5. 關聯競賽和應用
|
||||
console.log('🔗 關聯競賽和應用...');
|
||||
const currentCompetition = competitions[0]; // 當前競賽
|
||||
for (const app of apps) {
|
||||
await connection.execute(
|
||||
`INSERT INTO competition_apps (id, competition_id, app_id, submitted_at) VALUES (?, ?, ?, NOW())`,
|
||||
[uuidv4(), currentCompetition.id, app.id]
|
||||
);
|
||||
}
|
||||
console.log(`✅ 關聯了 ${apps.length} 個應用到當前競賽`);
|
||||
|
||||
// 6. 關聯競賽和評審
|
||||
console.log('🔗 關聯競賽和評審...');
|
||||
for (const judge of judges) {
|
||||
await connection.execute(
|
||||
`INSERT INTO competition_judges (id, competition_id, judge_id, assigned_at) VALUES (?, ?, ?, NOW())`,
|
||||
[uuidv4(), currentCompetition.id, judge.id]
|
||||
);
|
||||
}
|
||||
console.log(`✅ 關聯了 ${judges.length} 個評審到當前競賽`);
|
||||
|
||||
// 7. 創建示例評分
|
||||
console.log('📊 創建示例評分...');
|
||||
for (const app of apps) {
|
||||
for (const judge of judges) {
|
||||
const scores = {
|
||||
innovation_score: Math.floor(Math.random() * 5) + 1,
|
||||
technical_score: Math.floor(Math.random() * 5) + 1,
|
||||
usability_score: Math.floor(Math.random() * 5) + 1,
|
||||
presentation_score: Math.floor(Math.random() * 5) + 1,
|
||||
impact_score: Math.floor(Math.random() * 5) + 1
|
||||
};
|
||||
|
||||
const totalScore = (scores.innovation_score + scores.technical_score + scores.usability_score +
|
||||
scores.presentation_score + scores.impact_score) / 5;
|
||||
|
||||
await connection.execute(
|
||||
`INSERT INTO app_judge_scores (id, judge_id, app_id, innovation_score, technical_score, usability_score, presentation_score, impact_score, total_score, comments, submitted_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())`,
|
||||
[uuidv4(), judge.id, app.id, scores.innovation_score, scores.technical_score, scores.usability_score,
|
||||
scores.presentation_score, scores.impact_score, totalScore, '示例評分']
|
||||
);
|
||||
}
|
||||
}
|
||||
console.log(`✅ 創建了 ${apps.length * judges.length} 個評分記錄`);
|
||||
|
||||
console.log('🎉 示例數據填充完成!');
|
||||
console.log('\n📊 數據摘要:');
|
||||
console.log(`- 用戶: ${users.length} 個`);
|
||||
console.log(`- 評審: ${judges.length} 個`);
|
||||
console.log(`- 競賽: ${competitions.length} 個 (其中 1 個為當前競賽)`);
|
||||
console.log(`- 應用: ${apps.length} 個`);
|
||||
console.log(`- 評分記錄: ${apps.length * judges.length} 個`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 填充失敗:', error.message);
|
||||
console.error('詳細錯誤:', error);
|
||||
process.exit(1);
|
||||
} finally {
|
||||
if (connection) {
|
||||
await connection.end();
|
||||
console.log('🔌 資料庫連接已關閉');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 執行填充
|
||||
if (require.main === module) {
|
||||
populateSampleData().catch(console.error);
|
||||
}
|
||||
|
||||
module.exports = { populateSampleData };
|
Reference in New Issue
Block a user