初次提交
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
import bcrypt from 'bcryptjs'
|
||||
import { db } from '~/drizzle/db'
|
||||
import { users } from '~/drizzle/schema'
|
||||
import { eq } from 'drizzle-orm'
|
||||
|
||||
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.name || !body.username || !body.password) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
message: '姓名、账号名和密码不能为空'
|
||||
})
|
||||
}
|
||||
|
||||
// 验证姓名和用户名只能包含汉字
|
||||
const chineseRegex = /^[\u4e00-\u9fa5]+$/
|
||||
if (!chineseRegex.test(body.name) || !chineseRegex.test(body.username)) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
message: '姓名和账号名只能包含汉字'
|
||||
})
|
||||
}
|
||||
|
||||
try {
|
||||
// 检查用户名是否已存在
|
||||
const existingUserResult = await db
|
||||
.select()
|
||||
.from(users)
|
||||
.where(eq(users.username, body.username))
|
||||
.limit(1)
|
||||
const existingUser = existingUserResult[0]
|
||||
|
||||
if (existingUser) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
message: '账号名已存在'
|
||||
})
|
||||
}
|
||||
|
||||
// 加密密码
|
||||
const hashedPassword = await bcrypt.hash(body.password, 10)
|
||||
|
||||
// 角色权限控制
|
||||
let validRole = 'USER'
|
||||
if (body.role && ['USER', 'TEACHER', 'ADMIN', 'SONG_ADMIN', 'SUPER_ADMIN'].includes(body.role)) {
|
||||
// 超级管理员可以创建任何角色的用户
|
||||
if (user.role === 'SUPER_ADMIN') {
|
||||
validRole = body.role
|
||||
}
|
||||
// 管理员只能创建管理员以下的角色(USER, SONG_ADMIN)
|
||||
else if (user.role === 'ADMIN') {
|
||||
if (['USER', 'TEACHER', 'SONG_ADMIN'].includes(body.role)) {
|
||||
validRole = body.role
|
||||
} else {
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
message: '管理员只能创建用户、教师和歌曲管理员角色'
|
||||
})
|
||||
}
|
||||
}
|
||||
// 其他角色不能创建用户
|
||||
else {
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
message: '没有权限创建用户'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 状态验证
|
||||
let validStatus = 'active'
|
||||
if (body.status && ['active', 'withdrawn', 'graduate'].includes(body.status)) {
|
||||
validStatus = body.status
|
||||
}
|
||||
|
||||
// 创建用户
|
||||
const newUserResult = await db
|
||||
.insert(users)
|
||||
.values({
|
||||
name: body.name,
|
||||
username: body.username,
|
||||
password: hashedPassword,
|
||||
role: validRole,
|
||||
status: validStatus as 'active' | 'withdrawn' | 'graduate',
|
||||
grade: body.grade,
|
||||
class: body.class
|
||||
})
|
||||
.returning({
|
||||
id: users.id,
|
||||
name: users.name,
|
||||
username: users.username,
|
||||
role: users.role,
|
||||
status: users.status,
|
||||
grade: users.grade,
|
||||
class: users.class,
|
||||
createdAt: users.createdAt,
|
||||
updatedAt: users.updatedAt
|
||||
})
|
||||
const newUser = newUserResult[0]
|
||||
|
||||
// 清除相关缓存
|
||||
try {
|
||||
const { cache } = await import('~~/server/utils/cache-helpers')
|
||||
await cache.deletePattern('songs:*')
|
||||
await cache.deletePattern('stats:*')
|
||||
console.log('[Cache] 歌曲和统计缓存已清除(用户创建)')
|
||||
} catch (cacheError) {
|
||||
console.warn('[Cache] 清除缓存失败:', cacheError)
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
user: newUser,
|
||||
message: '用户创建成功'
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('创建用户失败:', error)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
message: '创建用户失败'
|
||||
})
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user