新增 App 建立、資料呈現

This commit is contained in:
2025-08-05 16:13:09 +08:00
parent d0c4adf243
commit 5b407ff29c
51 changed files with 6039 additions and 78 deletions

View File

@@ -0,0 +1,128 @@
const jwt = require('jsonwebtoken');
const JWT_SECRET = process.env.JWT_SECRET || 'good777';
async function testFrontendFixes() {
try {
// Generate a token for admin user
const adminPayload = {
userId: 'admin-001',
email: 'admin@theaken.com',
role: 'admin'
};
const token = jwt.sign(adminPayload, JWT_SECRET, { expiresIn: '1h' });
console.log('=== 測試前端修復 ===');
// Test 1: Get apps list with pagination
console.log('\n1. 測試應用程式列表 (分頁)');
const response1 = await fetch('http://localhost:3000/api/apps?page=1&limit=10', {
headers: {
'Authorization': `Bearer ${token}`
}
});
if (response1.ok) {
const data1 = await response1.json();
console.log('✅ API 回應成功');
console.log(`總應用數: ${data1.pagination?.total || 'N/A'}`);
console.log(`總頁數: ${data1.pagination?.totalPages || 'N/A'}`);
console.log(`當前頁應用數: ${data1.apps?.length || 0}`);
console.log('統計資訊:', data1.stats);
// 模擬前端數據轉換
const formattedApps = (data1.apps || []).map((app) => ({
...app,
creator: app.creator?.name || '未知',
department: app.creator?.department || '未知',
views: app.viewsCount || 0,
likes: app.likesCount || 0,
appUrl: app.demoUrl || '',
type: mapApiTypeToDisplayType(app.type),
icon: 'Bot',
iconColor: 'from-blue-500 to-purple-500',
reviews: 0,
createdAt: app.createdAt ? new Date(app.createdAt).toLocaleDateString() : '未知'
}));
console.log('\n模擬前端統計:');
console.log(`總應用數 (totalApps): ${data1.pagination?.total}`);
console.log(`已發布: ${data1.stats?.published || 0}`);
console.log(`待審核: ${data1.stats?.pending || 0}`);
console.log(`草稿: ${data1.stats?.draft || 0}`);
console.log(`已拒絕: ${data1.stats?.rejected || 0}`);
// 檢查分頁是否應該顯示
const shouldShowPagination = data1.pagination?.totalPages > 1;
console.log(`\n分頁是否應該顯示: ${shouldShowPagination} (總頁數: ${data1.pagination?.totalPages})`);
} else {
console.log('❌ API 回應失敗:', response1.status, response1.statusText);
}
// Test 2: Create a new app as admin
console.log('\n2. 測試管理員創建應用程式');
const newAppData = {
name: '測試應用程式_' + Date.now(),
description: '這是一個測試應用程式',
type: 'productivity',
demoUrl: 'https://example.com',
version: '1.0.0'
};
const response2 = await fetch('http://localhost:3000/api/apps', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify(newAppData)
});
if (response2.ok) {
const result = await response2.json();
console.log('✅ 創建應用程式成功');
console.log('創建的應用程式狀態:', result.app?.status);
console.log('應用程式ID:', result.appId);
// 檢查狀態是否正確 (應該是 draft)
if (result.app?.status === 'draft') {
console.log('✅ 狀態正確: 管理員創建的應用程式狀態為 draft');
} else {
console.log('❌ 狀態錯誤: 管理員創建的應用程式狀態應該為 draft但實際為', result.app?.status);
}
} else {
const errorData = await response2.json();
console.log('❌ 創建應用程式失敗:', errorData);
}
} catch (error) {
console.error('測試過程中發生錯誤:', error);
}
}
// 模擬前端的類型轉換函數
function mapApiTypeToDisplayType(apiType) {
const typeMap = {
'productivity': '文字處理',
'ai_model': '圖像生成',
'automation': '程式開發',
'data_analysis': '數據分析',
'educational': '教育工具',
'healthcare': '健康醫療',
'finance': '金融科技',
'iot_device': '物聯網',
'blockchain': '區塊鏈',
'ar_vr': 'AR/VR',
'machine_learning': '機器學習',
'computer_vision': '電腦視覺',
'nlp': '自然語言處理',
'robotics': '機器人',
'cybersecurity': '網路安全',
'cloud_service': '雲端服務',
'other': '其他'
};
return typeMap[apiType] || '其他';
}
testFrontendFixes();