From 3f96c9c6502243b06efd4bb34a189e72e3a5557c Mon Sep 17 00:00:00 2001
From: yearning <10538594+wangweifeng1999@user.noreply.gitee.com>
Date: 星期一, 28 九月 2026 19:24:55 +0800
Subject: [PATCH] 复制项目

---
 frontend/src/components/ChangePasswordModal.tsx |   69 ++++++++++++++++++++++++++++++++++
 1 files changed, 69 insertions(+), 0 deletions(-)

diff --git a/frontend/src/components/ChangePasswordModal.tsx b/frontend/src/components/ChangePasswordModal.tsx
new file mode 100644
index 0000000..bd611bc
--- /dev/null
+++ b/frontend/src/components/ChangePasswordModal.tsx
@@ -0,0 +1,69 @@
+import { Form, Input, Modal, message } from "antd";
+import { api } from "../api";
+
+export default function ChangePasswordModal({
+  open,
+  onClose,
+}: {
+  open: boolean;
+  onClose: () => void;
+}) {
+  const [form] = Form.useForm<{
+    old_password: string;
+    new_password: string;
+    confirm: string;
+  }>();
+
+  return (
+    <Modal
+      title="淇敼瀵嗙爜"
+      open={open}
+      destroyOnClose
+      onCancel={() => {
+        form.resetFields();
+        onClose();
+      }}
+      onOk={async () => {
+        const v = await form.validateFields();
+        try {
+          await api.post("/api/auth/change-password", {
+            old_password: v.old_password,
+            new_password: v.new_password,
+          });
+          message.success("瀵嗙爜宸蹭慨鏀�");
+          form.resetFields();
+          onClose();
+        } catch (e: unknown) {
+          const msg =
+            (e as { response?: { data?: { detail?: string } } })?.response?.data?.detail || "淇敼澶辫触";
+          message.error(typeof msg === "string" ? msg : "淇敼澶辫触");
+        }
+      }}
+    >
+      <Form form={form} layout="vertical">
+        <Form.Item name="old_password" label="鍘熷瘑鐮�" rules={[{ required: true }]}>
+          <Input.Password autoComplete="current-password" />
+        </Form.Item>
+        <Form.Item name="new_password" label="鏂板瘑鐮�" rules={[{ required: true, min: 6 }]}>
+          <Input.Password autoComplete="new-password" />
+        </Form.Item>
+        <Form.Item
+          name="confirm"
+          label="纭鏂板瘑鐮�"
+          dependencies={["new_password"]}
+          rules={[
+            { required: true },
+            ({ getFieldValue }) => ({
+              validator(_, value) {
+                if (!value || getFieldValue("new_password") === value) return Promise.resolve();
+                return Promise.reject(new Error("涓ゆ杈撳叆鐨勬柊瀵嗙爜涓嶄竴鑷�"));
+              },
+            }),
+          ]}
+        >
+          <Input.Password autoComplete="new-password" />
+        </Form.Item>
+      </Form>
+    </Modal>
+  );
+}

--
Gitblit v1.8.0