diff --git a/src/pages/Forum/posts-create/CreatePost.jsx b/src/pages/Forum/posts-create/CreatePost.jsx
index e38c29a..b8e8c2a 100644
--- a/src/pages/Forum/posts-create/CreatePost.jsx
+++ b/src/pages/Forum/posts-create/CreatePost.jsx
@@ -1,89 +1,78 @@
-// // src/pages/Forum/CreatePost.jsx
 // import React, { useState } from 'react';
 // import axios from 'axios';
+// import './CreatePost.css'; // 如果你打算加样式
 
 // const API_BASE = process.env.REACT_APP_API_BASE;
 
-// const CreatePost = ({ userId }) => {
+// const CreatePost = ({ user_id }) => {
 //   const [title, setTitle] = useState('');
 //   const [content, setContent] = useState('');
-//   const [imgUrl, setImageUrl] = useState('');
-//   const [isAnonymous, setIsAnonymous] = useState(false);
+//   const [imageUrl, setImageUrl] = useState('');
+//   const [message, setMessage] = useState('');
+//   const [error, setError] = useState('');
 
 //   const handleSubmit = async (e) => {
 //     e.preventDefault();
+//     setMessage('');
+//     setError('');
+
+//     if (!title.trim() || !content.trim()) {
+//       setError('标题和内容不能为空');
+//       return;
+//     }
 
 //     try {
-//       const postData = {
+//       const res = await axios.post(`${API_BASE}/echo/forum/posts/${user_id}/createPost`, {
 //         title,
-//         postContent: content,
-//         postType: isAnonymous,
-//       };
+//         post_content: content,
+//         image_url: imageUrl
+//       });
 
-//       if (imgUrl.trim()) {
-//         postData.imgUrl = imgUrl;
-//       }
-
-//       const response = await axios.post(
-//         `${API_BASE}/echo/forum/posts/${userId}/createPost`,
-//         postData
-//       );
-      
-
-//       if (response.status === 201) {
-//         alert('帖子创建成功！');
-//         setTitle('');
-//         setContent('');
-//         setImageUrl('');
-//         setIsAnonymous(false);
-//       }
-//     } catch (error) {
-//       console.error('帖子创建失败：', error.response?.data || error.message);
-//       alert('创建失败，请重试');
-//     }    
+//       setMessage(`发帖成功，帖子ID：${res.data.post_id}`);
+//       setTitle('');
+//       setContent('');
+//       setImageUrl('');
+//     } catch (err) {
+//       console.error(err);
+//       setError(err.response?.data?.error || '发帖失败，请稍后重试');
+//     }
 //   };
 
 //   return (
-//     <div className="create-post">
-//       <h2>创建新帖子</h2>
-//       <form onSubmit={handleSubmit}>
-//         <div>
+//     <div className="create-post-container">
+//       <h2>发表新帖子</h2>
+//       <form onSubmit={handleSubmit} className="create-post-form">
+//         <div className="form-group">
 //           <label>标题：</label>
 //           <input
 //             type="text"
 //             value={title}
 //             onChange={(e) => setTitle(e.target.value)}
-//             required
+//             placeholder="输入帖子标题"
 //           />
 //         </div>
-//         <div>
+//         <div className="form-group">
 //           <label>内容：</label>
 //           <textarea
 //             value={content}
 //             onChange={(e) => setContent(e.target.value)}
-//             required
+//             placeholder="输入帖子内容"
 //           />
 //         </div>
-//         <div>
-//           <label>图片 URL（可选）：</label>
+//         <div className="form-group">
+//           <label>图片链接（可选）：</label>
 //           <input
 //             type="text"
-//             value={imgUrl}
+//             value={imageUrl}
 //             onChange={(e) => setImageUrl(e.target.value)}
+//             placeholder="例如：https://example.com/img.jpg"
 //           />
 //         </div>
-//         <div>
-//           <label>
-//             <input
-//               type="checkbox"
-//               checked={isAnonymous}
-//               onChange={(e) => setIsAnonymous(e.target.checked)}
-//             />
-//             匿名发布
-//           </label>
-//         </div>
 //         <button type="submit">发布</button>
 //       </form>
+
+//       {message && <p className="success-text">{message}</p>}
+//       {error && <p className="error-text">{error}</p>}
 //     </div>
 //   );
 // };
@@ -96,7 +85,7 @@
 
 const API_BASE = process.env.REACT_APP_API_BASE;
 
-const CreatePost = ({ userId }) => {
+const CreatePost = ({ user_id }) => {
   const [title, setTitle] = useState('');
   const [content, setContent] = useState('');
   const [imageUrl, setImageUrl] = useState('');
@@ -114,7 +103,7 @@
     }
 
     try {
-      const res = await axios.post(`${API_BASE}/echo/forum/posts/${userId}/createPost`, {
+      const res = await axios.post(`${API_BASE}/echo/forum/posts/${user_id}/createPost`, {
         title,
         post_content: content,
         image_url: imageUrl
@@ -135,8 +124,10 @@
       <h2>发表新帖子</h2>
       <form onSubmit={handleSubmit} className="create-post-form">
         <div className="form-group">
-          <label>标题：</label>
+          {/* 这里加上htmlFor，并给input加id */}
+          <label htmlFor="title">标题：</label>
           <input
+            id="title"  // 加id
             type="text"
             value={title}
             onChange={(e) => setTitle(e.target.value)}
@@ -144,16 +135,20 @@
           />
         </div>
         <div className="form-group">
-          <label>内容：</label>
+          {/* 同理，内容 */}
+          <label htmlFor="content">内容：</label>
           <textarea
+            id="content"  // 加id
             value={content}
             onChange={(e) => setContent(e.target.value)}
             placeholder="输入帖子内容"
           />
         </div>
         <div className="form-group">
-          <label>图片链接（可选）：</label>
+          {/* 图片链接 */}
+          <label htmlFor="imageUrl">图片链接（可选）：</label>
           <input
+            id="imageUrl"  // 加id
             type="text"
             value={imageUrl}
             onChange={(e) => setImageUrl(e.target.value)}
