Files
nxxmdata/backend/generate-test-data.js
2025-08-25 15:00:46 +08:00

272 lines
8.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 生成产品管理和订单管理测试数据
* @file generate-test-data.js
* @description 为产品和订单模块生成测试数据并插入数据库
*/
const { sequelize } = require('./config/database-simple');
const { Product, Order, OrderItem, User } = require('./models');
// 产品测试数据
const productData = [
{
name: '有机苹果',
description: '新鲜有机苹果,来自山东烟台,口感甜脆,营养丰富',
price: 1200, // 12.00元,以分为单位
stock: 500,
image_url: '/images/products/apple.jpg',
is_active: true
},
{
name: '优质大米',
description: '东北优质大米粒粒饱满口感香甜5kg装',
price: 3500, // 35.00元
stock: 200,
image_url: '/images/products/rice.jpg',
is_active: true
},
{
name: '新鲜鸡蛋',
description: '农场散养鸡蛋30枚装营养价值高',
price: 2800, // 28.00元
stock: 150,
image_url: '/images/products/eggs.jpg',
is_active: true
},
{
name: '有机蔬菜礼盒',
description: '精选有机蔬菜组合,包含白菜、萝卜、青菜等',
price: 4500, // 45.00元
stock: 80,
image_url: '/images/products/vegetable-box.jpg',
is_active: true
},
{
name: '纯天然蜂蜜',
description: '纯天然野花蜜500g装无添加剂',
price: 6800, // 68.00元
stock: 120,
image_url: '/images/products/honey.jpg',
is_active: true
},
{
name: '有机牛奶',
description: '有机牧场牛奶1L装营养丰富',
price: 1800, // 18.00元
stock: 300,
image_url: '/images/products/milk.jpg',
is_active: true
},
{
name: '农家土鸡',
description: '农家散养土鸡约2kg肉质鲜美',
price: 8500, // 85.00元
stock: 50,
image_url: '/images/products/chicken.jpg',
is_active: true
},
{
name: '新鲜玉米',
description: '甜玉米10根装口感甜嫩',
price: 1500, // 15.00元
stock: 200,
image_url: '/images/products/corn.jpg',
is_active: true
},
{
name: '有机胡萝卜',
description: '有机胡萝卜2kg装营养丰富',
price: 1200, // 12.00元
stock: 180,
image_url: '/images/products/carrot.jpg',
is_active: true
},
{
name: '精品茶叶',
description: '高山绿茶250g装香气清雅',
price: 12800, // 128.00元
stock: 60,
image_url: '/images/products/tea.jpg',
is_active: true
}
];
// 生成随机订单数据的辅助函数
function generateRandomOrders(users, products, orderCount = 20) {
const orders = [];
const orderStatuses = ['pending', 'processing', 'shipped', 'delivered', 'cancelled'];
const paymentStatuses = ['unpaid', 'paid', 'refunded'];
const addresses = [
'北京市朝阳区建国路88号',
'上海市浦东新区陆家嘴环路1000号',
'广州市天河区珠江新城花城大道123号',
'深圳市南山区科技园南区456号',
'杭州市西湖区文三路789号',
'成都市锦江区春熙路321号',
'武汉市江汉区中山大道654号',
'西安市雁塔区高新路987号'
];
for (let i = 0; i < orderCount; i++) {
const user = users[Math.floor(Math.random() * users.length)];
const status = orderStatuses[Math.floor(Math.random() * orderStatuses.length)];
const paymentStatus = paymentStatuses[Math.floor(Math.random() * paymentStatuses.length)];
const address = addresses[Math.floor(Math.random() * addresses.length)];
// 创建订单基本信息
const order = {
user_id: user.id,
total_amount: 0, // 稍后计算
status: status,
payment_status: paymentStatus,
shipping_address: address,
created_at: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000) // 最近30天内的随机时间
};
// 为每个订单生成1-5个订单项
const itemCount = Math.floor(Math.random() * 5) + 1;
const orderItems = [];
let totalAmount = 0;
for (let j = 0; j < itemCount; j++) {
const product = products[Math.floor(Math.random() * products.length)];
const quantity = Math.floor(Math.random() * 3) + 1; // 1-3个
const price = product.price;
orderItems.push({
product_id: product.id,
quantity: quantity,
price: price
});
totalAmount += price * quantity;
}
order.total_amount = totalAmount;
order.items = orderItems;
orders.push(order);
}
return orders;
}
// 主函数:生成并插入测试数据
async function generateTestData() {
try {
console.log('开始生成测试数据...');
// 连接数据库
await sequelize.authenticate();
console.log('数据库连接成功');
// 获取现有用户
const users = await User.findAll();
if (users.length === 0) {
console.log('警告:数据库中没有用户数据,请先创建用户');
return;
}
console.log(`找到 ${users.length} 个用户`);
// 清理现有的测试数据(可选)
console.log('清理现有测试数据...');
await OrderItem.destroy({ where: {} });
await Order.destroy({ where: {} });
await Product.destroy({ where: {} });
console.log('清理完成');
// 插入产品数据
console.log('插入产品数据...');
const createdProducts = await Product.bulkCreate(productData);
console.log(`成功插入 ${createdProducts.length} 个产品`);
// 生成订单数据
console.log('生成订单数据...');
const orderData = generateRandomOrders(users, createdProducts, 25);
// 使用事务插入订单和订单项
console.log('插入订单和订单项数据...');
let orderCount = 0;
let orderItemCount = 0;
for (const orderInfo of orderData) {
await sequelize.transaction(async (t) => {
// 创建订单
const order = await Order.create({
user_id: orderInfo.user_id,
total_amount: orderInfo.total_amount,
status: orderInfo.status,
payment_status: orderInfo.payment_status,
shipping_address: orderInfo.shipping_address,
created_at: orderInfo.created_at
}, { transaction: t });
// 创建订单项
const orderItems = orderInfo.items.map(item => ({
order_id: order.id,
product_id: item.product_id,
quantity: item.quantity,
price: item.price
}));
await OrderItem.bulkCreate(orderItems, { transaction: t });
orderCount++;
orderItemCount += orderItems.length;
});
}
console.log(`成功插入 ${orderCount} 个订单`);
console.log(`成功插入 ${orderItemCount} 个订单项`);
// 显示统计信息
console.log('\n=== 数据统计 ===');
const productCount = await Product.count();
const totalOrderCount = await Order.count();
const totalOrderItemCount = await OrderItem.count();
console.log(`产品总数: ${productCount}`);
console.log(`订单总数: ${totalOrderCount}`);
console.log(`订单项总数: ${totalOrderItemCount}`);
// 显示一些示例数据
console.log('\n=== 示例产品 ===');
const sampleProducts = await Product.findAll({ limit: 3 });
sampleProducts.forEach(product => {
console.log(`${product.name} - ¥${(product.price / 100).toFixed(2)} - 库存: ${product.stock}`);
});
console.log('\n=== 示例订单 ===');
const sampleOrders = await Order.findAll({
limit: 3,
include: [
{ model: User, as: 'user', attributes: ['username'] },
{
model: OrderItem,
as: 'orderItems',
include: [{ model: Product, as: 'product', attributes: ['name'] }]
}
]
});
sampleOrders.forEach(order => {
console.log(`订单 #${order.id} - 用户: ${order.user.username} - 总额: ¥${(order.total_amount / 100).toFixed(2)} - 状态: ${order.status}`);
order.orderItems.forEach(item => {
console.log(` - ${item.product.name} x ${item.quantity}`);
});
});
console.log('\n测试数据生成完成');
} catch (error) {
console.error('生成测试数据失败:', error);
} finally {
await sequelize.close();
}
}
// 运行脚本
if (require.main === module) {
generateTestData();
}
module.exports = { generateTestData, productData };