import bcrypt from 'bcryptjs' import { db } from '~/drizzle/db' import { users } from '~/drizzle/schema' import { eq } from 'drizzle-orm' import { cacheService } from '../../../services/cacheService' export default defineEventHandler(async (event) => { // 检查认证和权限 const user = event.context.user if (!user || !['ADMIN', 'SUPER_ADMIN'].includes(user.role)) { throw createError({ statusCode: 403, message: '没有权限访问' }) } const body = await readBody(event) if (!body.users || !Array.isArray(body.users) || body.users.length === 0) { throw createError({ statusCode: 400, message: '无效的用户数据' }) } const results = { created: 0, failed: 0, total: body.users.length } // 批量添加用户 for (let i = 0; i < body.users.length; i++) { const userData = body.users[i] try { // 验证必填字段 if (!userData.name || !userData.username || !userData.password) { results.failed++ continue } const chineseRegex = /^[\u4e00-\u9fa5]+$/ if (!chineseRegex.test(userData.name) || !chineseRegex.test(userData.username)) { results.failed++ continue } // 检查用户名是否已存在 const existingUser = await db .select() .from(users) .where(eq(users.username, userData.username)) .limit(1) if (existingUser.length > 0) { results.failed++ continue } // 加密密码 const hashedPassword = await bcrypt.hash(userData.password, 10) // 角色权限控制 let validRole = 'USER' // 默认角色 if (userData.role) { if (user.role === 'SUPER_ADMIN') { // 超级管理员可以设置任何角色 const allowedRoles = ['USER', 'TEACHER', 'ADMIN', 'SONG_ADMIN', 'SUPER_ADMIN'] if (allowedRoles.includes(userData.role)) { validRole = userData.role } } else if (user.role === 'ADMIN') { // 普通管理员只能设置 USER 和 SONG_ADMIN 角色 const allowedRoles = ['USER', 'TEACHER', 'SONG_ADMIN'] if (allowedRoles.includes(userData.role)) { validRole = userData.role } } } // 状态验证 let validStatus = 'active' if (userData.status && ['active', 'withdrawn', 'graduate'].includes(userData.status)) { validStatus = userData.status } // 创建用户 const newUser = await db .insert(users) .values({ name: userData.name, username: userData.username, password: hashedPassword, role: validRole, status: validStatus as 'active' | 'withdrawn' | 'graduate', grade: userData.grade, class: userData.class }) .returning() results.created++ } catch (error) { console.error(`用户创建失败:`, error) results.failed++ } } // 如果有用户创建成功,清除相关缓存 if (results.created > 0) { try { await cacheService.clearSongsCache() console.log('批量用户创建后缓存清除成功') } catch (cacheError) { console.error('批量用户创建后缓存清除失败:', cacheError) } } return results })