Files
2026-04-12 22:18:34 +08:00

156 lines
4.2 KiB
TypeScript
Raw Permalink 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.
import { PrismaClient, UserRole, CardTypeCategory } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
console.log('🌱 Seeding database...')
// 1. Studio Config
const existingConfig = await prisma.studioConfig.findFirst()
if (!existingConfig) {
await prisma.studioConfig.create({
data: {
name: '普拉提工作室',
address: '请在管理后台设置地址',
phone: '请在管理后台设置电话',
cancelHoursLimit: 2,
photos: [],
},
})
console.log(' ✅ Studio config created')
} else {
console.log(' ⏭️ Studio config already exists')
}
// 2. Card Types
const existingCards = await prisma.cardType.count()
if (existingCards === 0) {
await prisma.cardType.createMany({
data: [
{
name: '体验课',
type: CardTypeCategory.TRIAL,
totalTimes: 1,
durationDays: 7,
price: 9900,
originalPrice: 29900,
description: '首次体验,感受普拉提的魅力',
isActive: true,
sortOrder: 0,
},
{
name: '私教10次卡',
type: CardTypeCategory.TIMES,
totalTimes: 10,
durationDays: 90,
price: 299900,
originalPrice: 399900,
description: '10节私教课90天有效期',
isActive: true,
sortOrder: 1,
},
{
name: '私教20次卡',
type: CardTypeCategory.TIMES,
totalTimes: 20,
durationDays: 180,
price: 499900,
originalPrice: 699900,
description: '20节私教课180天有效期更优惠',
isActive: true,
sortOrder: 2,
},
{
name: '月卡',
type: CardTypeCategory.DURATION,
totalTimes: null,
durationDays: 30,
price: 99900,
description: '30天不限次数',
isActive: true,
sortOrder: 3,
},
{
name: '季卡',
type: CardTypeCategory.DURATION,
totalTimes: null,
durationDays: 90,
price: 249900,
originalPrice: 299700,
description: '90天不限次数更实惠',
isActive: true,
sortOrder: 4,
},
],
})
console.log(' ✅ Card types created')
} else {
console.log(' ⏭️ Card types already exist')
}
// 3. Admin User
const existingAdmin = await prisma.user.findFirst({
where: { role: UserRole.ADMIN },
})
if (!existingAdmin) {
await prisma.user.create({
data: {
openid: 'admin_test_openid',
nickname: '教练',
role: UserRole.ADMIN,
adminBookingSubscriptionCount: 0,
},
})
console.log(' ✅ Admin user created')
} else {
console.log(' ⏭️ Admin user already exists')
}
// 4. Week Templates (weekdays 9-16, hourly slots)
const existingTemplates = await prisma.weekTemplate.count()
if (existingTemplates === 0) {
const timeSlots = [
{ startTime: '09:00', endTime: '10:00' },
{ startTime: '10:00', endTime: '11:00' },
{ startTime: '14:00', endTime: '15:00' },
{ startTime: '15:00', endTime: '16:00' },
]
const templates = []
// Monday to Friday (1-5)
for (let day = 1; day <= 5; day++) {
for (const slot of timeSlots) {
templates.push({
dayOfWeek: day,
startTime: slot.startTime,
endTime: slot.endTime,
capacity: 1,
isActive: true,
})
}
}
// Saturday (6) — morning only
templates.push(
{ dayOfWeek: 6, startTime: '09:00', endTime: '10:00', capacity: 1, isActive: true },
{ dayOfWeek: 6, startTime: '10:00', endTime: '11:00', capacity: 1, isActive: true },
)
await prisma.weekTemplate.createMany({ data: templates })
console.log(' ✅ Week templates created')
} else {
console.log(' ⏭️ Week templates already exist')
}
console.log('🌱 Seeding complete!')
}
main()
.catch((e) => {
console.error('❌ Seed failed:', e)
process.exit(1)
})
.finally(async () => {
await prisma.$disconnect()
})