diff --git a/Merge/back_wzy/routes/posts.py b/Merge/back_wzy/routes/posts.py
index 14ff64c..a016f69 100644
--- a/Merge/back_wzy/routes/posts.py
+++ b/Merge/back_wzy/routes/posts.py
@@ -4,16 +4,47 @@
 from extensions    import db
 from models.post   import Post
 from models.behavior import Behavior
+from utils.Fpost import Fpost
+import json
 
 posts_bp = Blueprint('posts', __name__)
 
 @posts_bp.route('', methods=['POST'])
 def create_post():
-    data = request.get_json() or {}
-    post = Post(**data)
-    db.session.add(post)
-    db.session.commit()
-    return jsonify({'id': post.id}), 201
+    try:
+        # 获取文本字段
+        user_id = request.form.get('user_id')
+        title = request.form.get('title')
+        content = request.form.get('content')
+        status = request.form.get('status', 'published')
+        topic_id = request.form.get('topic_id')
+        media_count = int(request.form.get('media_count', 0))
+        
+        if not user_id or not title or not content:
+            return jsonify({'error': '缺少必要字段'}), 400
+        
+        # 获取上传的文件
+        files = []
+        for i in range(media_count):
+            file_key = f'media_{i}'
+            if file_key in request.files:
+                files.append(request.files[file_key])
+        
+        # 使用 Fpost 创建帖子
+        fpost = Fpost(db.session)
+        new_post = fpost.create_post_with_files(
+            user_id=int(user_id),
+            title=title,
+            content=content,
+            topic_id=int(topic_id) if topic_id else None,
+            status=status,
+            files=files
+        )
+        
+        return jsonify({'id': new_post.id}), 201
+        
+    except Exception as e:
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('', methods=['GET'])
 def list_posts():
@@ -59,14 +90,64 @@
 def update_post(post_id):
     """
     修改帖子字段（可选字段：title, content, topic_id, media_urls, status）
+    支持FormData和JSON两种格式
     """
-    post = Post.query.get_or_404(post_id)
-    data = request.get_json() or {}
-    for key in ('title', 'content', 'topic_id', 'media_urls', 'status'):
-        if key in data:
-            setattr(post, key, data[key])
-    db.session.commit()
-    return '', 204
+    try:
+        fpost = Fpost(db.session)
+        
+        # 检查是否是FormData请求
+        if request.content_type and 'multipart/form-data' in request.content_type:
+            # FormData请求
+            title = request.form.get('title')
+            content = request.form.get('content')
+            status = request.form.get('status')
+            topic_id = request.form.get('topic_id')
+            media_count = int(request.form.get('media_count', 0))
+            existing_media_urls_str = request.form.get('existing_media_urls')
+            
+            # 解析现有媒体URLs
+            existing_media_urls = None
+            if existing_media_urls_str:
+                try:
+                    existing_media_urls = json.loads(existing_media_urls_str)
+                except:
+                    existing_media_urls = None
+            
+            # 获取新上传的文件
+            files = []
+            for i in range(media_count):
+                file_key = f'media_{i}'
+                if file_key in request.files:
+                    files.append(request.files[file_key])
+            
+            # 更新帖子
+            updated_post = fpost.update_post_with_files(
+                post_id=post_id,
+                title=title,
+                content=content,
+                topic_id=int(topic_id) if topic_id else None,
+                status=status,
+                files=files if files else None,
+                existing_media_urls=existing_media_urls
+            )
+            
+        else:
+            # JSON请求（保持原有逻辑）
+            post = Post.query.get_or_404(post_id)
+            data = request.get_json() or {}
+            for key in ('title', 'content', 'topic_id', 'media_urls', 'status'):
+                if key in data:
+                    setattr(post, key, data[key])
+            db.session.commit()
+            updated_post = post
+        
+        if not updated_post:
+            return jsonify({'error': '帖子不存在'}), 404
+            
+        return '', 204
+        
+    except Exception as e:
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>', methods=['DELETE'])
 def delete_post(post_id):
