Files
nxxmdata/backend/generate-test-data.js

272 lines
8.2 KiB
JavaScript
Raw Normal View History

/**
* 生成产品管理和订单管理测试数据
* @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 };