-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate-test-data.js
More file actions
328 lines (301 loc) · 9.26 KB
/
create-test-data.js
File metadata and controls
328 lines (301 loc) · 9.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function createTestData() {
try {
console.log("🧪 創建測試數據來展示數據統計功能...\n");
// 檢查現有用戶
const users = await prisma.user.findMany();
if (users.length === 0) {
console.log("❌ 沒有找到用戶,請先創建用戶");
return;
}
const userId = users[0].id;
console.log(`📊 為用戶 ${userId} 創建測試數據`);
// 創建測試檔案
console.log("📁 創建測試檔案...");
const testFiles = [
{
name: "產品手冊.pdf",
originalName: "產品手冊.pdf",
downloads: 45,
sizeBytes: 2048576,
mimeType: "application/pdf",
},
{
name: "使用指南.docx",
originalName: "使用指南.docx",
downloads: 32,
sizeBytes: 1024000,
mimeType:
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
},
{
name: "價格表.xlsx",
originalName: "價格表.xlsx",
downloads: 28,
sizeBytes: 512000,
mimeType:
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
},
{
name: "示範影片.mp4",
originalName: "示範影片.mp4",
downloads: 20,
sizeBytes: 10485760,
mimeType: "video/mp4",
},
{
name: "軟體安裝包.zip",
originalName: "軟體安裝包.zip",
downloads: 15,
sizeBytes: 5242880,
mimeType: "application/zip",
},
];
const createdFiles = [];
for (const fileData of testFiles) {
const file = await prisma.file.create({
data: {
userId,
...fileData,
storageKey: `test-${Date.now()}-${fileData.name}`,
isActive: true,
},
});
createdFiles.push(file);
console.log(
` ✓ 創建檔案: ${file.originalName} (下載量: ${file.downloads})`
);
}
// 創建測試頁面
console.log("\n📄 創建測試頁面...");
const testPages = [
{
title: "免費產品手冊下載",
slug: "product-manual",
views: 150,
description: "專業的產品手冊,包含完整的功能介紹和使用說明",
},
{
title: "詳細使用指南",
slug: "user-guide",
views: 120,
description: "步驟詳盡的使用指南,幫助您快速上手",
},
{
title: "最新價格表",
slug: "price-list",
views: 95,
description: "最新的價格資訊和優惠方案",
},
{
title: "產品示範影片",
slug: "demo-video",
views: 80,
description: "視覺化的產品示範,讓您快速了解產品特色",
},
{
title: "軟體安裝指南",
slug: "software-install",
views: 65,
description: "詳細的安裝步驟和疑難排解指南",
},
];
const createdPages = [];
for (let i = 0; i < testPages.length; i++) {
const page = await prisma.page.create({
data: {
userId,
fileId: createdFiles[i].id,
...testPages[i],
isActive: true,
},
});
createdPages.push(page);
console.log(` ✓ 創建頁面: ${page.title} (瀏覽量: ${page.views})`);
}
// 創建測試潛在客戶
console.log("\n👥 創建測試潛在客戶...");
const testLeads = [
{
email: "john@example.com",
name: "John Smith",
phone: "+1-555-0123",
company: "Tech Corp",
},
{
email: "sarah@example.com",
name: "Sarah Johnson",
phone: "+1-555-0124",
company: "Marketing Inc",
},
{
email: "mike@example.com",
name: "Mike Wilson",
phone: "+1-555-0125",
company: "Design Studio",
},
{
email: "lisa@example.com",
name: "Lisa Brown",
phone: "+1-555-0126",
company: "Consulting LLC",
},
{
email: "david@example.com",
name: "David Lee",
phone: "+1-555-0127",
company: "Startup Co",
},
{
email: "anna@example.com",
name: "Anna Garcia",
phone: "+1-555-0128",
company: "Agency Ltd",
},
{
email: "tom@example.com",
name: "Tom Anderson",
phone: "+1-555-0129",
company: "Solutions Inc",
},
{
email: "jane@example.com",
name: "Jane Taylor",
phone: "+1-555-0130",
company: "Digital Media",
},
];
const createdLeads = [];
for (let i = 0; i < testLeads.length; i++) {
const page = createdPages[i % createdPages.length];
const lead = await prisma.lead.create({
data: {
pageId: page.id,
...testLeads[i],
notes: `從頁面 ${page.title} 獲取的潛在客戶`,
},
});
createdLeads.push(lead);
}
console.log(` ✓ 創建了 ${createdLeads.length} 個測試潛在客戶`);
// 創建測試 Analytics 事件
console.log("\n📊 創建測試 Analytics 事件...");
const analyticsEvents = [];
const now = new Date();
// 創建過去7天的測試數據
for (let day = 6; day >= 0; day--) {
const eventDate = new Date(now);
eventDate.setDate(now.getDate() - day);
// 每個頁面每天創建隨機的瀏覽事件
for (const page of createdPages) {
const viewCount = Math.floor(Math.random() * 20) + 5; // 5-25 個瀏覽量
for (let j = 0; j < viewCount; j++) {
const eventTime = new Date(eventDate);
eventTime.setHours(Math.floor(Math.random() * 24));
eventTime.setMinutes(Math.floor(Math.random() * 60));
analyticsEvents.push({
userId,
pageId: page.id,
event: "view",
data: {
referrer:
j % 3 === 0
? "direct"
: j % 3 === 1
? "https://google.com"
: "https://facebook.com",
userAgent:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
},
createdAt: eventTime,
});
}
// 創建一些下載事件
const downloadCount = Math.floor(Math.random() * 5) + 1; // 1-5 個下載
for (let j = 0; j < downloadCount; j++) {
const eventTime = new Date(eventDate);
eventTime.setHours(Math.floor(Math.random() * 24));
eventTime.setMinutes(Math.floor(Math.random() * 60));
analyticsEvents.push({
userId,
pageId: page.id,
event: "download",
data: {
fileId: page.fileId,
referrer: "direct",
},
createdAt: eventTime,
});
}
}
}
// 批量創建 analytics 事件
const createdEvents = await prisma.analytics.createMany({
data: analyticsEvents,
});
console.log(` ✓ 創建了 ${createdEvents.count} 個測試 Analytics 事件`);
// 更新頁面瀏覽量統計
console.log("\n🔄 更新頁面統計...");
for (const page of createdPages) {
const viewEvents = analyticsEvents.filter(
(e) => e.pageId === page.id && e.event === "view"
);
const downloadEvents = analyticsEvents.filter(
(e) => e.pageId === page.id && e.event === "download"
);
await prisma.page.update({
where: { id: page.id },
data: {
views: { increment: viewEvents.length },
},
});
await prisma.file.update({
where: { id: page.fileId },
data: {
downloads: { increment: downloadEvents.length },
},
});
}
console.log(" ✓ 頁面統計已更新");
// 總結統計
console.log("\n🎉 測試數據創建完成!");
console.log("===============================");
console.log(`📁 檔案數量: ${createdFiles.length}`);
console.log(`📄 頁面數量: ${createdPages.length}`);
console.log(`👥 潛在客戶數量: ${createdLeads.length}`);
console.log(`📊 Analytics 事件數量: ${createdEvents.count}`);
// 計算最終統計
const finalPages = await prisma.page.findMany({
where: { userId },
include: {
file: true,
_count: { select: { leads: true } },
},
});
const totalViews = finalPages.reduce((sum, page) => sum + page.views, 0);
const totalDownloads = finalPages.reduce(
(sum, page) => sum + (page.file?.downloads || 0),
0
);
const totalLeads = finalPages.reduce(
(sum, page) => sum + page._count.leads,
0
);
console.log("\n📈 最終統計數據:");
console.log(`總訪問量: ${totalViews}`);
console.log(`總下載量: ${totalDownloads}`);
console.log(`總潛在客戶: ${totalLeads}`);
console.log(
`轉換率: ${
totalViews > 0 ? ((totalLeads / totalViews) * 100).toFixed(2) : 0
}%`
);
console.log("\n💡 現在您可以重新整理管理後台的數據分析頁面來查看圖表!");
} catch (error) {
console.error("❌ 創建測試數據失敗:", error);
} finally {
await prisma.$disconnect();
}
}
createTestData();