From 03ccd285be121f8293675178c36f94e91681462b Mon Sep 17 00:00:00 2001 From: liguang <1590686939@qq.com> Date: Sat, 21 Jun 2025 11:23:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(user-management):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=86=E7=A0=81=E6=9B=B4=E6=96=B0=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E8=B0=83=E6=95=B4=E9=97=AE=E9=A2=98=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在更新用户信息时,对密码字段进行加密处理 - 移除无密码更新时的密码字段,保持原密码不变 - 调整问题编辑功能,使用专门的编辑路由 - 优化用户表格组件中的编辑逻辑,区分用户和问题类型 --- .../usermanagement/_actions/adminActions.ts | 12 +- .../usermanagement/_actions/guestActions.ts | 12 +- .../usermanagement/_actions/teacherActions.ts | 12 +- .../user-management/components/user-table.tsx | 115 ++---------------- 4 files changed, 44 insertions(+), 107 deletions(-) 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} {/* 删除确认对话框 */}