From 7a4855d131eb1e913cdfcee41b5a83c5691d304f Mon Sep 17 00:00:00 2001 From: tone <3341154833@qq.com> Date: Mon, 12 May 2025 12:07:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/components/user-info-editor.tsx | 59 +++++++++++++---- tone-page-web/components/ui/alert.tsx | 66 +++++++++++++++++++ tone-page-web/lib/api/admin/user/index.ts | 3 +- tone-page-web/lib/api/admin/user/remove.ts | 7 ++ .../lib/api/admin/user/set-password.ts | 10 +++ tone-page-web/package.json | 1 + tone-page-web/pnpm-lock.yaml | 14 ++++ 7 files changed, 148 insertions(+), 12 deletions(-) create mode 100644 tone-page-web/components/ui/alert.tsx create mode 100644 tone-page-web/lib/api/admin/user/remove.ts create mode 100644 tone-page-web/lib/api/admin/user/set-password.ts diff --git a/tone-page-web/app/console/(with-menu)/user/components/user-info-editor.tsx b/tone-page-web/app/console/(with-menu)/user/components/user-info-editor.tsx index 112c3e4..f924de4 100644 --- a/tone-page-web/app/console/(with-menu)/user/components/user-info-editor.tsx +++ b/tone-page-web/app/console/(with-menu)/user/components/user-info-editor.tsx @@ -20,6 +20,12 @@ import { Skeleton } from "@/components/ui/skeleton"; import { updateUser } from "@/lib/api/admin/user"; import { AdminApi } from "@/lib/api"; import { toast } from "sonner"; +import { + Alert, + AlertDescription, + AlertTitle, +} from "@/components/ui/alert" +import { AlertCircle } from "lucide-react"; export function UserInfoEditor({ onClose, @@ -46,6 +52,14 @@ export function UserInfoEditor({ } } + const handleRemove = async () => { + + } + + const handleSetPassword = async () => { + + } + return ( @@ -54,16 +68,20 @@ export function UserInfoEditor({ 确保你在保存之前检查所有更改 - {user && { - e.preventDefault() - const formData = new FormData(e.currentTarget); - handleSave({ - username: formData.get("username")?.toString()!, - nickname: formData.get("nickname")?.toString()!, - email: formData.get("email")?.toString() || null, - phone: formData.get("phone")?.toString() || null, - }) - }} />} + {user && { + e.preventDefault() + const formData = new FormData(e.currentTarget); + handleSave({ + username: formData.get("username")?.toString()!, + nickname: formData.get("nickname")?.toString()!, + email: formData.get("email")?.toString() || null, + phone: formData.get("phone")?.toString() || null, + }) + }} />} {isLoading && [...Array(5)].map((_, i) => ( @@ -71,6 +89,16 @@ export function UserInfoEditor({ )) } + { + error && ( + + + 出错啦! + {error.message} + + ) + } + @@ -81,7 +109,12 @@ export function UserInfoEditor({ ) } -function ProfileForm({ className, user, ...props }: React.ComponentProps<"form"> & { user: User }) { +function ProfileForm({ className, user, onSetPassword, onRemove, ...props }: + React.ComponentProps<"form"> & { + user: User, + onSetPassword: () => Promise, + onRemove: () => Promise, + }) { return (
@@ -104,6 +137,10 @@ function ProfileForm({ className, user, ...props }: React.ComponentProps<"form">
+
+ + +
) diff --git a/tone-page-web/components/ui/alert.tsx b/tone-page-web/components/ui/alert.tsx new file mode 100644 index 0000000..1421354 --- /dev/null +++ b/tone-page-web/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ) +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ) +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription } diff --git a/tone-page-web/lib/api/admin/user/index.ts b/tone-page-web/lib/api/admin/user/index.ts index 97ae510..630f508 100644 --- a/tone-page-web/lib/api/admin/user/index.ts +++ b/tone-page-web/lib/api/admin/user/index.ts @@ -1,4 +1,5 @@ export * from './list'; export * from './get'; export * from './create'; -export * from './update'; \ No newline at end of file +export * from './update'; +export * from './set-password'; \ No newline at end of file diff --git a/tone-page-web/lib/api/admin/user/remove.ts b/tone-page-web/lib/api/admin/user/remove.ts new file mode 100644 index 0000000..47e0f36 --- /dev/null +++ b/tone-page-web/lib/api/admin/user/remove.ts @@ -0,0 +1,7 @@ +import fetcher from "../../fetcher"; + +export async function remove(userId: string) { + return fetcher(`/admin/user/${userId}`, { + method: 'DELETE', + }) +} \ No newline at end of file diff --git a/tone-page-web/lib/api/admin/user/set-password.ts b/tone-page-web/lib/api/admin/user/set-password.ts new file mode 100644 index 0000000..55d44e9 --- /dev/null +++ b/tone-page-web/lib/api/admin/user/set-password.ts @@ -0,0 +1,10 @@ +import fetcher from "../../fetcher"; + +export async function setPassword(userId: string, password: string) { + return fetcher(`/admin/user/${userId}/password`, { + method: 'POST', + body: JSON.stringify({ + password, + }), + }) +} \ No newline at end of file diff --git a/tone-page-web/package.json b/tone-page-web/package.json index c1f2d7d..0526e2a 100644 --- a/tone-page-web/package.json +++ b/tone-page-web/package.json @@ -20,6 +20,7 @@ "@radix-ui/react-separator": "^1.1.6", "@radix-ui/react-slot": "^1.2.0", "@radix-ui/react-tooltip": "^1.2.6", + "alert": "^6.0.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "dialog": "^0.3.1", diff --git a/tone-page-web/pnpm-lock.yaml b/tone-page-web/pnpm-lock.yaml index 8a408a0..81c72f0 100644 --- a/tone-page-web/pnpm-lock.yaml +++ b/tone-page-web/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.2.6 version: 1.2.6(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + alert: + specifier: ^6.0.2 + version: 6.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1227,6 +1230,12 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + alert@6.0.2: + resolution: {integrity: sha512-Oi8u2HRNN6mzpjgKGii2Uuf9iOhyfbeUAHH/5MwnVmC8DS9GrEBjZBFpoavkNj+ZKnBr/Lqx+6YKLDKrggKfPA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3509,6 +3518,11 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + alert@6.0.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1