diff --git a/Merge/back_wzy/routes/__pycache__/posts.cpython-310.pyc b/Merge/back_wzy/routes/__pycache__/posts.cpython-310.pyc
index 19bfef0..6655141 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 6fd2a89..4c89334 100644
--- a/Merge/back_wzy/routes/posts.py
+++ b/Merge/back_wzy/routes/posts.py
@@ -5,12 +5,39 @@
 from models.post   import Post
 from models.behavior import Behavior
 from utils.Fpost import Fpost
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+from config import Config
 import json
 
 posts_bp = Blueprint('posts', __name__)
 
+def safe_log(user_id, log_type, message, ip):
+    user_id=1
+    """安全的日志记录函数，不会影响主业务逻辑"""
+    try:
+        engine = create_engine(Config.SQLURL)
+        SessionLocal = sessionmaker(bind=engine)
+        session = SessionLocal()
+        f = Fpost(session)
+        f.recordlog(user_id, log_type, message, ip)
+    except Exception as e:
+        # 方法一：简单打印错误信息
+        print(f"[safe_log] 记录日志失败：{e}")
+        traceback.print_exc()  # 打印完整的堆栈跟踪
+
+        # 方法二：使用 logging 模块（推荐）
+        logger.exception("safe_log: 记录日志时发生异常")
+    finally:
+        # 确保 session 一定关闭
+        try:
+            session.close()
+        except Exception:
+            pass
+
 @posts_bp.route('', methods=['POST'])
 def create_post():
+    user_id = None
     try:
         # 获取文本字段
         user_id = request.form.get('user_id')
@@ -21,6 +48,7 @@
         media_count = int(request.form.get('media_count', 0))
         
         if not user_id or not title or not content:
+            safe_log(int(user_id) if user_id else 0, 'error', '创建帖子失败：缺少必要字段', request.remote_addr)
             return jsonify({'error': '缺少必要字段'}), 400
         
         # 获取上传的文件
@@ -41,9 +69,11 @@
             files=files
         )
         
+        safe_log(int(user_id), 'behavior', f'成功创建帖子，帖子ID: {new_post.id}，标题: {title}', request.remote_addr)
         return jsonify({'id': new_post.id}), 201
         
     except Exception as e:
+        safe_log(int(user_id) if user_id else 0, 'error', f'创建帖子时发生异常: {str(e)}', request.remote_addr)
         return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('', methods=['GET'])
@@ -53,38 +83,56 @@
       - GET /posts              返回所有已发布帖子
       - GET /posts?user_id=123  返回指定用户 user_id 的所有帖子
     """
-    user_id = request.args.get('user_id', type=int)
-    query = Post.query
-    if user_id is not None:
-        query = query.filter_by(user_id=user_id)
-    else:
-        query = query.filter_by(status='published')
+    user_id = None
+    try:
+        user_id = request.args.get('user_id', type=int)
+        query = Post.query
+        if user_id is not None:
+            query = query.filter_by(user_id=user_id)
+        else:
+            query = query.filter_by(status='published')
 
-    posts = query.all()
+        posts = query.all()
+        
+        log_msg = f'获取帖子列表成功，共{len(posts)}个帖子'
+        if user_id:
+            log_msg += f'，用户ID: {user_id}'
+        safe_log(user_id if user_id else 0, 'access', log_msg, request.remote_addr)
 
-    return jsonify([{
-        'id': p.id,
-        'title': p.title,
-        'status': p.status,                     # 新增 status 字段
-        'heat': p.heat,
-        'created_at': p.created_at.isoformat()
-    } for p in posts])
+        return jsonify([{
+            'id': p.id,
+            'title': p.title,
+            'status': p.status,
+            'heat': p.heat,
+            'created_at': p.created_at.isoformat()
+        } for p in posts])
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'获取帖子列表时发生异常: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>', methods=['GET'])
 def get_post(post_id):
-    post = Post.query.get_or_404(post_id)
-    return jsonify({
-        'id': post.id,
-        'user_id': post.user_id,
-        'topic_id': post.topic_id,
-        'title': post.title,
-        'content': post.content,
-        'media_urls': post.media_urls,
-        'status': post.status,
-        'heat': post.heat,
-        'created_at': post.created_at.isoformat(),
-        'updated_at': post.updated_at.isoformat()
-    })
+    try:
+        post = Post.query.get_or_404(post_id)
+        safe_log(0, 'access', f'获取帖子详情成功，帖子ID: {post_id}，标题: {post.title}', request.remote_addr)
+        
+        return jsonify({
+            'id': post.id,
+            'user_id': post.user_id,
+            'topic_id': post.topic_id,
+            'title': post.title,
+            'content': post.content,
+            'media_urls': post.media_urls,
+            'status': post.status,
+            'heat': post.heat,
+            'created_at': post.created_at.isoformat(),
+            'updated_at': post.updated_at.isoformat()
+        })
+        
+    except Exception as e:
+        safe_log(0, 'error', f'获取帖子详情时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>', methods=['PUT'])
 def update_post(post_id):
@@ -142,19 +190,28 @@
             updated_post = post
         
         if not updated_post:
+            safe_log(0, 'error', f'更新帖子失败，帖子不存在，帖子ID: {post_id}', request.remote_addr)
             return jsonify({'error': '帖子不存在'}), 404
-            
+        
+        safe_log(0, 'behavior', f'更新帖子成功，帖子ID: {post_id}', request.remote_addr)
         return '', 204
         
     except Exception as e:
+        safe_log(0, 'error', f'更新帖子时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
         return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>', methods=['DELETE'])
 def delete_post(post_id):
-    post = Post.query.get_or_404(post_id)
-    db.session.delete(post)
-    db.session.commit()
-    return '', 204
+    try:
+        post = Post.query.get_or_404(post_id)
+        db.session.delete(post)
+        db.session.commit()
+        safe_log(0, 'behavior', f'删除帖子成功，帖子ID: {post_id}', request.remote_addr)
+        return '', 204
+        
+    except Exception as e:
+        safe_log(0, 'error', f'删除帖子时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/<action>', methods=['POST'])
 def post_action(post_id, action):
@@ -162,76 +219,105 @@
     支持的 action: like, favorite, view, share
     对于 like 和 favorite，保证每个用户每帖只做一次。
     """
-    if action not in ('like', 'favorite', 'view', 'share'):
-        abort(400, 'Invalid action')
+    user_id = None
+    try:
+        if action not in ('like', 'favorite', 'view', 'share'):
+            abort(400, 'Invalid action')
 
-    data = request.get_json() or {}
-    user_id = data.get('user_id')
-    if not user_id:
-        abort(400, 'user_id required')
+        data = request.get_json() or {}
+        user_id = data.get('user_id')
+        if not user_id:
+            safe_log(0, 'error', f'执行帖子操作失败，缺少用户ID，帖子ID: {post_id}，操作: {action}', request.remote_addr)
+            abort(400, 'user_id required')
 
-    # 对 like/favorite 做去重检查
-    if action in ('like', 'favorite'):
-        exists = Behavior.query.filter_by(
-            user_id=user_id,
-            post_id=post_id,
-            type=action
-        ).first()
-        if exists:
-            return jsonify({'error': f'already {action}d'}), 400
+        # 对 like/favorite 做去重检查
+        if action in ('like', 'favorite'):
+            exists = Behavior.query.filter_by(
+                user_id=user_id,
+                post_id=post_id,
+                type=action
+            ).first()
+            if exists:
+                safe_log(user_id, 'error', f'重复执行帖子操作，帖子ID: {post_id}，操作: {action}', request.remote_addr)
+                return jsonify({'error': f'already {action}d'}), 400
 
-    # 创建行为记录
-    beh = Behavior(user_id=user_id, post_id=post_id, type=action)
-    db.session.add(beh)
+        # 创建行为记录
+        beh = Behavior(user_id=user_id, post_id=post_id, type=action)
+        db.session.add(beh)
 
-    # 更新热度
-    post = Post.query.get_or_404(post_id)
-    post.heat += 1
+        # 更新热度
+        post = Post.query.get_or_404(post_id)
+        post.heat += 1
 
-    db.session.commit()
-    return '', 201
+        db.session.commit()
+        safe_log(user_id, 'behavior', f'执行帖子操作成功，帖子ID: {post_id}，操作: {action}', request.remote_addr)
+        return '', 201
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'执行帖子操作时发生异常，帖子ID: {post_id}，操作: {action}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/like', methods=['DELETE'])
 def unlike(post_id):
-    user_id = request.get_json(silent=True) and request.get_json().get('user_id')
-    if not user_id:
-        abort(400, 'user_id required')
-    # 查找已有的 like 行为
-    beh = Behavior.query.filter_by(
-        user_id=user_id,
-        post_id=post_id,
-        type='like'
-    ).first()
-    if not beh:
-        return jsonify({'error': 'not liked yet'}), 400
+    user_id = None
+    try:
+        user_id = request.get_json(silent=True) and request.get_json().get('user_id')
+        if not user_id:
+            safe_log(0, 'error', f'取消点赞失败，缺少用户ID，帖子ID: {post_id}', request.remote_addr)
+            abort(400, 'user_id required')
+            
+        # 查找已有的 like 行为
+        beh = Behavior.query.filter_by(
+            user_id=user_id,
+            post_id=post_id,
+            type='like'
+        ).first()
+        if not beh:
+            safe_log(user_id, 'error', f'取消点赞失败，用户尚未点赞，帖子ID: {post_id}', request.remote_addr)
+            return jsonify({'error': 'not liked yet'}), 400
 
-    db.session.delete(beh)
-    # 更新热度，确保不降到负数
-    post = Post.query.get_or_404(post_id)
-    post.heat = max(post.heat - 1, 0)
-    db.session.commit()
-    return '', 204
+        db.session.delete(beh)
+        # 更新热度，确保不降到负数
+        post = Post.query.get_or_404(post_id)
+        post.heat = max(post.heat - 1, 0)
+        db.session.commit()
+        safe_log(user_id, 'behavior', f'取消点赞成功，帖子ID: {post_id}', request.remote_addr)
+        return '', 204
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'取消点赞时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/favorite', methods=['DELETE'])
 def unfavorite(post_id):
-    user_id = request.get_json(silent=True) and request.get_json().get('user_id')
-    if not user_id:
-        abort(400, 'user_id required')
-    # 查找已有的 favorite 行为
-    beh = Behavior.query.filter_by(
-        user_id=user_id,
-        post_id=post_id,
-        type='favorite'
-    ).first()
-    if not beh:
-        return jsonify({'error': 'not favorited yet'}), 400
+    user_id = None
+    try:
+        user_id = request.get_json(silent=True) and request.get_json().get('user_id')
+        if not user_id:
+            safe_log(0, 'error', f'取消收藏失败，缺少用户ID，帖子ID: {post_id}', request.remote_addr)
+            abort(400, 'user_id required')
+            
+        # 查找已有的 favorite 行为
+        beh = Behavior.query.filter_by(
+            user_id=user_id,
+            post_id=post_id,
+            type='favorite'
+        ).first()
+        if not beh:
+            safe_log(user_id, 'error', f'取消收藏失败，用户尚未收藏，帖子ID: {post_id}', request.remote_addr)
+            return jsonify({'error': 'not favorited yet'}), 400
 
-    db.session.delete(beh)
-    # 更新热度
-    post = Post.query.get_or_404(post_id)
-    post.heat = max(post.heat - 1, 0)
-    db.session.commit()
-    return '', 204
+        db.session.delete(beh)
+        # 更新热度
+        post = Post.query.get_or_404(post_id)
+        post.heat = max(post.heat - 1, 0)
+        db.session.commit()
+        safe_log(user_id, 'behavior', f'取消收藏成功，帖子ID: {post_id}', request.remote_addr)
+        return '', 204
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'取消收藏时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
 
 @posts_bp.route('/<int:post_id>/like/status', methods=['GET'])
 def has_liked(post_id):
@@ -240,14 +326,22 @@
     GET /posts/<post_id>/like/status?user_id=123
     返回 { "liked": true } 或 { "liked": false }
     """
-    user_id = request.args.get('user_id', type=int)
-    if not user_id:
-        abort(400, 'user_id required')
+    user_id = None
+    try:
+        user_id = request.args.get('user_id', type=int)
+        if not user_id:
+            safe_log(0, 'error', f'检查点赞状态失败，缺少用户ID，帖子ID: {post_id}', request.remote_addr)
+            abort(400, 'user_id required')
 
-    exists = Behavior.query.filter_by(
-        user_id=user_id,
-        post_id=post_id,
-        type='like'
-    ).first() is not None
-
-    return jsonify({'liked': exists}), 200
+        exists = Behavior.query.filter_by(
+            user_id=user_id,
+            post_id=post_id,
+            type='like'
+        ).first() is not None
+        
+        safe_log(user_id, 'access', f'检查点赞状态成功，帖子ID: {post_id}，结果: {exists}', request.remote_addr)
+        return jsonify({'liked': exists}), 200
+        
+    except Exception as e:
+        safe_log(user_id if user_id else 0, 'error', f'检查点赞状态时发生异常，帖子ID: {post_id}，错误: {str(e)}', request.remote_addr)
+        return jsonify({'error': str(e)}), 500
