增加文件系统存储功能,修复上传功能
Change-Id: I7b76c0a78fa0a02018fa76e932d283e29b35d4be
diff --git a/Merge/back_wzy/routes/__pycache__/posts.cpython-310.pyc b/Merge/back_wzy/routes/__pycache__/posts.cpython-310.pyc
index 7d61b05..45d3343 100644
--- a/Merge/back_wzy/routes/__pycache__/posts.cpython-310.pyc
+++ b/Merge/back_wzy/routes/__pycache__/posts.cpython-310.pyc
Binary files differ
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):