165 lines
5.7 KiB
TypeScript
165 lines
5.7 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { prisma } from '@/lib/prisma'
|
|
import bcrypt from 'bcryptjs'
|
|
|
|
// 系统初始化:创建默认部门、店铺、管理员账户
|
|
export async function POST(req: NextRequest) {
|
|
try {
|
|
// 从环境变量读取初始管理员配置,如果没有则使用默认值(向后兼容)
|
|
const initAdminEmail = process.env.INIT_ADMIN_EMAIL || 'admin@flnxi.com'
|
|
const initAdminPassword = process.env.INIT_ADMIN_PASSWORD || '88888888'
|
|
const initAdminUsername = initAdminEmail.split('@')[0] // 从邮箱提取用户名
|
|
|
|
// 使用事务确保所有数据都创建成功或已存在
|
|
const result = await prisma.$transaction(async (tx) => {
|
|
// 1. 确保默认管理员账户存在
|
|
// 优先查找环境变量配置的邮箱,如果没有则查找旧的 'admin'
|
|
let admin = await tx.user.findFirst({
|
|
where: {
|
|
OR: [
|
|
{ email: initAdminEmail },
|
|
{ email: 'admin' } // 向后兼容旧配置
|
|
]
|
|
}
|
|
})
|
|
|
|
let adminCreated = false
|
|
if (!admin) {
|
|
// 检查是否已有任何用户(避免在已有用户的情况下创建默认管理员)
|
|
const userCount = await tx.user.count()
|
|
if (userCount === 0) {
|
|
// 只有在没有任何用户时才创建初始管理员
|
|
const hashedPassword = await bcrypt.hash(initAdminPassword, 10)
|
|
admin = await tx.user.create({
|
|
data: {
|
|
email: initAdminEmail,
|
|
username: initAdminUsername,
|
|
password: hashedPassword,
|
|
role: 'ADMIN',
|
|
isSuperAdmin: true, // 初始管理员设为超级管理员
|
|
isActive: true,
|
|
canDownload: true,
|
|
department: '系统管理'
|
|
}
|
|
})
|
|
adminCreated = true
|
|
} else {
|
|
// 如果已有用户,返回第一个管理员用户(如果有)
|
|
admin = await tx.user.findFirst({
|
|
where: { role: 'ADMIN' }
|
|
}) || await tx.user.findFirst()
|
|
}
|
|
}
|
|
|
|
const ensureDepartment = async () => {
|
|
const existing = await tx.department.findFirst({ where: { name: '默认部门' } })
|
|
if (existing) return { entity: existing, created: false }
|
|
const created = await tx.department.create({ data: { name: '默认部门' } })
|
|
return { entity: created, created: true }
|
|
}
|
|
|
|
const ensureCategory = async () => {
|
|
const existing = await tx.category.findFirst({ where: { name: '默认店铺' } })
|
|
if (existing) return { entity: existing, created: false }
|
|
const created = await tx.category.create({ data: { name: '默认店铺' } })
|
|
return { entity: created, created: true }
|
|
}
|
|
|
|
const ensureScene = async () => {
|
|
const existing = await tx.scene.findFirst({ where: { name: '默认场景' } })
|
|
if (existing) return { entity: existing, created: false }
|
|
const created = await tx.scene.create({ data: { name: '默认场景' } })
|
|
return { entity: created, created: true }
|
|
}
|
|
|
|
const departmentResult = await ensureDepartment()
|
|
const categoryResult = await ensureCategory()
|
|
const sceneResult = await ensureScene()
|
|
|
|
return {
|
|
admin,
|
|
defaultDepartment: departmentResult.entity,
|
|
defaultCategory: categoryResult.entity,
|
|
defaultScene: sceneResult.entity,
|
|
createdFlags: {
|
|
admin: adminCreated,
|
|
department: departmentResult.created,
|
|
category: categoryResult.created,
|
|
scene: sceneResult.created
|
|
}
|
|
}
|
|
})
|
|
|
|
const alreadyInitialized =
|
|
!result.createdFlags.admin &&
|
|
!result.createdFlags.department &&
|
|
!result.createdFlags.category &&
|
|
!result.createdFlags.scene
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
message: alreadyInitialized ? '系统已初始化' : '系统初始化成功',
|
|
initialized: true,
|
|
data: {
|
|
admin: result.admin ? {
|
|
email: result.admin.email,
|
|
username: result.admin.username,
|
|
password: result.createdFlags.admin ? '(已使用配置的密码)' : '(未创建新账号)'
|
|
} : null,
|
|
defaultDepartment: result.defaultDepartment.name,
|
|
defaultCategory: result.defaultCategory.name,
|
|
defaultScene: result.defaultScene.name
|
|
}
|
|
})
|
|
} catch (error: any) {
|
|
console.error('系统初始化失败:', error)
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: '系统初始化失败',
|
|
details: error.message
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
// 检查系统是否已初始化
|
|
export async function GET() {
|
|
try {
|
|
// 优先查找环境变量配置的管理员,如果没有则查找旧的 'admin'
|
|
const initAdminEmail = process.env.INIT_ADMIN_EMAIL || 'admin@flnxi.com'
|
|
const admin = await prisma.user.findFirst({
|
|
where: {
|
|
OR: [
|
|
{ email: initAdminEmail },
|
|
{ email: 'admin' }, // 向后兼容
|
|
{ role: 'ADMIN' } // 或者查找任何管理员账号
|
|
]
|
|
}
|
|
})
|
|
|
|
const hasDepartment = await prisma.department.findFirst()
|
|
const hasCategory = await prisma.category.findFirst()
|
|
const hasScene = await prisma.scene.findFirst()
|
|
|
|
return NextResponse.json({
|
|
initialized: !!admin && !!hasDepartment && !!hasCategory && !!hasScene,
|
|
hasAdmin: !!admin,
|
|
hasDepartment: !!hasDepartment,
|
|
hasCategory: !!hasCategory,
|
|
hasScene: !!hasScene
|
|
})
|
|
} catch (error: any) {
|
|
console.error('检查初始化状态失败:', error)
|
|
return NextResponse.json(
|
|
{
|
|
initialized: false,
|
|
error: error.message
|
|
},
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|