diff --git a/src/app/(app)/usermanagement/_actions/adminActions.ts b/src/app/(app)/usermanagement/_actions/adminActions.ts index bc3a3c5..fa3a594 100644 --- a/src/app/(app)/usermanagement/_actions/adminActions.ts +++ b/src/app/(app)/usermanagement/_actions/adminActions.ts @@ -14,7 +14,17 @@ export async function createAdmin(data: Omit } export async function updateAdmin(id: string, data: Partial>) { - await prisma.user.update({ where: { id }, data }) + let updateData = { ...data } + + // 如果包含密码字段且不为空,则进行加密 + if (data.password && data.password.trim() !== '') { + updateData.password = await bcrypt.hash(data.password, 10) + } else { + // 如果密码为空,则从更新数据中移除密码字段,保持原密码不变 + delete updateData.password + } + + await prisma.user.update({ where: { id }, data: updateData }) revalidatePath('/usermanagement/admin') } diff --git a/src/app/(app)/usermanagement/_actions/guestActions.ts b/src/app/(app)/usermanagement/_actions/guestActions.ts index 73c3d90..b780739 100644 --- a/src/app/(app)/usermanagement/_actions/guestActions.ts +++ b/src/app/(app)/usermanagement/_actions/guestActions.ts @@ -14,7 +14,17 @@ export async function createGuest(data: Omit } export async function updateGuest(id: string, data: Partial>) { - await prisma.user.update({ where: { id }, data }) + let updateData = { ...data } + + // 如果包含密码字段且不为空,则进行加密 + if (data.password && data.password.trim() !== '') { + updateData.password = await bcrypt.hash(data.password, 10) + } else { + // 如果密码为空,则从更新数据中移除密码字段,保持原密码不变 + delete updateData.password + } + + await prisma.user.update({ where: { id }, data: updateData }) revalidatePath('/usermanagement/guest') } diff --git a/src/app/(app)/usermanagement/_actions/teacherActions.ts b/src/app/(app)/usermanagement/_actions/teacherActions.ts index 094c5bc..2211669 100644 --- a/src/app/(app)/usermanagement/_actions/teacherActions.ts +++ b/src/app/(app)/usermanagement/_actions/teacherActions.ts @@ -14,7 +14,17 @@ export async function createTeacher(data: Omit>) { - await prisma.user.update({ where: { id }, data }) + let updateData = { ...data } + + // 如果包含密码字段且不为空,则进行加密 + if (data.password && data.password.trim() !== '') { + updateData.password = await bcrypt.hash(data.password, 10) + } else { + // 如果密码为空,则从更新数据中移除密码字段,保持原密码不变 + delete updateData.password + } + + await prisma.user.update({ where: { id }, data: updateData }) revalidatePath('/usermanagement/teacher') } diff --git a/src/features/user-management/components/user-table.tsx b/src/features/user-management/components/user-table.tsx index 62e2ff2..285f0c8 100644 --- a/src/features/user-management/components/user-table.tsx +++ b/src/features/user-management/components/user-table.tsx @@ -72,7 +72,7 @@ import { import { createAdmin, updateAdmin, deleteAdmin } from '@/app/(app)/usermanagement/_actions/adminActions' import { createTeacher, updateTeacher } from '@/app/(app)/usermanagement/_actions/teacherActions' import { createGuest, updateGuest } from '@/app/(app)/usermanagement/_actions/guestActions' -import { createProblem, updateProblem, deleteProblem } from '@/app/(app)/usermanagement/_actions/problemActions' +import { createProblem, deleteProblem } from '@/app/(app)/usermanagement/_actions/problemActions' import type { User, Problem } from '@/generated/client' import { Difficulty, Role } from '@/generated/client' @@ -152,12 +152,6 @@ const addProblemSchema = z.object({ difficulty: z.nativeEnum(Difficulty).default(Difficulty.EASY), }) -const editProblemSchema = z.object({ - id: z.string().default(''), - displayId: z.number().optional().default(0), - difficulty: z.nativeEnum(Difficulty).default(Difficulty.EASY), -}) - export function UserTable(props: UserTableProps) { const isProblem = props.config.userType === 'problem' const router = useRouter() @@ -247,8 +241,15 @@ export function UserTable(props: UserTableProps) { size="sm" className="h-8 gap-1" onClick={() => { - setEditingUser(item) - setIsEditDialogOpen(true) + if (isProblem) { + // 如果是problem类型,跳转到编辑路由,使用displayId + const problem = item as Problem + router.push(`/admin/problems/${problem.displayId}/edit`) + } else { + // 如果是用户类型,打开编辑弹窗 + setEditingUser(item) + setIsEditDialogOpen(true) + } }} > {props.config.actions.edit.label} @@ -615,98 +616,6 @@ export function UserTable(props: UserTableProps) { ) } - // 编辑题目对话框组件(仅题目) - function EditUserDialogProblem({ open, onOpenChange, user }: { open: boolean; onOpenChange: (open: boolean) => void; user: Problem }) { - const [isLoading, setIsLoading] = useState(false) - const form = useForm>({ - resolver: zodResolver(editProblemSchema), - defaultValues: { - id: user.id, - displayId: user.displayId ?? 0, - difficulty: user.difficulty ?? Difficulty.EASY, - }, - }) - React.useEffect(() => { - if (open) { - form.reset({ - id: user.id, - displayId: user.displayId ?? 0, - difficulty: user.difficulty ?? Difficulty.EASY, - }) - } - }, [open, user, form]) - async function onSubmit(formData: Partial) { - try { - setIsLoading(true) - const submitData: Partial = { ...formData, displayId: Number(formData.displayId) } - await updateProblem(submitData.id!, submitData) - onOpenChange(false) - toast.success('修改成功', { duration: 1500 }) - } catch { - toast.error('修改失败', { duration: 1500 }) - } finally { - setIsLoading(false) - } - } - return ( - - - - {props.config.actions.edit.label} - - 修改信息 - - -
-
-
- - - {form.formState.errors.displayId?.message && ( -

- {form.formState.errors.displayId?.message as string} -

- )} -
-
- - - {form.formState.errors.difficulty?.message && ( -

- {form.formState.errors.difficulty?.message as string} -

- )} -
-
- - - -
-
-
- ) - } - // 用ref保证获取最新data const dataRef = React.useRef(props.data) React.useEffect(() => { dataRef.current = props.data }, [props.data]) @@ -960,9 +869,7 @@ export function UserTable(props: UserTableProps) { ) : null} {/* 编辑用户对话框 */} - {isProblem && editingUser ? ( - - ) : editingUser ? ( + {!isProblem && editingUser ? ( ) : null} {/* 删除确认对话框 */}