diff --git a/Merge/back_ljc/app.py b/Merge/back_ljc/app.py
index 0e10b68..182a6e5 100644
--- a/Merge/back_ljc/app.py
+++ b/Merge/back_ljc/app.py
@@ -1,6 +1,7 @@
 from flask import Flask, jsonify, request, session
 from flask_sqlalchemy import SQLAlchemy
 from flask_cors import CORS
+from flask_jwt_extended import jwt_required, get_jwt_identity
 
 app = Flask(__name__)
 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@10.126.59.25/redbook'
@@ -351,9 +352,10 @@
     return jsonify(following_list)
 
 # 关注/取消关注用户
-@app.route('/api/follow/<int:followee_id>', methods=['POST', 'DELETE'])
-def follow_user(followee_id):
-    follower_id = session.get('user_id', 1)
+@app.route('/api/follow/<int:follower_id>/<int:followee_id>', methods=['POST', 'DELETE'])
+def follow_user(follower_id,followee_id):
+    # follower_id = session.get('user_id', 1)
+    print(follower_id)
     if follower_id == followee_id:
         return jsonify({'error': 'Cannot follow yourself'}), 400
     
@@ -468,6 +470,130 @@
         app.logger.error(f"获取用户互动数据失败: {str(e)}")
         return jsonify({'error': '获取互动数据失败'}), 500
 
+# 点赞/取消点赞路由 - 修改为包含用户ID
+@app.route('/api/users/<int:user_id>/posts/<int:post_id>/like', methods=['POST', 'DELETE'])
+def handle_like(user_id, post_id):
+    # 检查用户是否登录
+    if 'user_id' not in session:
+        return jsonify({'error': '未登录'}), 401
+    
+    # 验证请求用户ID与登录用户ID是否一致
+    if session['user_id'] != user_id:
+        return jsonify({'error': '无权限操作'}), 403
+    
+    post = Post.query.get(post_id)
+    
+    if not post:
+        return jsonify({'error': '帖子不存在'}), 404
+    
+    # 检查行为类型
+    behavior = Behavior.query.filter_by(
+        user_id=user_id,
+        post_id=post_id,
+        type='like'
+    ).first()
+    
+    if request.method == 'POST':
+        # 点赞
+        if not behavior:
+            new_behavior = Behavior(
+                user_id=user_id,
+                post_id=post_id,
+                type='like',
+                value=1
+            )
+            db.session.add(new_behavior)
+            db.session.commit()
+            return jsonify({'message': '点赞成功', 'liked': True})
+        return jsonify({'message': '已点赞', 'liked': True})
+    
+    elif request.method == 'DELETE':
+        # 取消点赞
+        if behavior:
+            db.session.delete(behavior)
+            db.session.commit()
+            return jsonify({'message': '已取消点赞', 'liked': False})
+        return jsonify({'message': '未点赞', 'liked': False})
+
+# 收藏/取消收藏路由 - 修改为包含用户ID
+@app.route('/api/users/<int:user_id>/posts/<int:post_id>/favorite', methods=['POST', 'DELETE'])
+def handle_favorite(user_id, post_id):
+    # 检查用户是否登录
+    if 'user_id' not in session:
+        return jsonify({'error': '未登录'}), 401
+    
+    # 验证请求用户ID与登录用户ID是否一致
+    if session['user_id'] != user_id:
+        return jsonify({'error': '无权限操作'}), 403
+    
+    post = Post.query.get(post_id)
+    
+    if not post:
+        return jsonify({'error': '帖子不存在'}), 404
+    
+    # 检查行为类型
+    behavior = Behavior.query.filter_by(
+        user_id=user_id,
+        post_id=post_id,
+        type='favorite'
+    ).first()
+    
+    if request.method == 'POST':
+        # 收藏
+        if not behavior:
+            new_behavior = Behavior(
+                user_id=user_id,
+                post_id=post_id,
+                type='favorite',
+                value=1
+            )
+            db.session.add(new_behavior)
+            db.session.commit()
+            return jsonify({'message': '收藏成功', 'favorited': True})
+        return jsonify({'message': '已收藏', 'favorited': True})
+    
+    elif request.method == 'DELETE':
+        # 取消收藏
+        if behavior:
+            db.session.delete(behavior)
+            db.session.commit()
+            return jsonify({'message': '已取消收藏', 'favorited': False})
+        return jsonify({'message': '未收藏', 'favorited': False})
+
+# 获取帖子互动状态（是否点赞/收藏） - 修改为包含用户ID
+@app.route('/api/users/<int:user_id>/posts/<int:post_id>/interaction-status')
+def get_post_interaction_status(user_id, post_id):
+    # 检查用户是否登录
+    if 'user_id' not in session:
+        return jsonify({
+            'liked': False,
+            'favorited': False
+        })
+    
+    # 验证请求用户ID与登录用户ID是否一致
+    if session['user_id'] != user_id:
+        return jsonify({
+            'liked': False,
+            'favorited': False
+        })
+    
+    liked = Behavior.query.filter_by(
+        user_id=user_id,
+        post_id=post_id,
+        type='like'
+    ).first() is not None
+    
+    favorited = Behavior.query.filter_by(
+        user_id=user_id,
+        post_id=post_id,
+        type='favorite'
+    ).first() is not None
+    
+    return jsonify({
+        'liked': liked,
+        'favorited': favorited
+    })
+
 
 if __name__ == '__main__':
     app.run(debug=True,port='5715',host='0.0.0.0')
\ No newline at end of file
