diff --git a/Merge/back_ljc/app.py b/Merge/back_ljc/app.py
index 182a6e5..0e10b68 100644
--- a/Merge/back_ljc/app.py
+++ b/Merge/back_ljc/app.py
@@ -1,7 +1,6 @@
 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'
@@ -352,10 +351,9 @@
     return jsonify(following_list)
 
 # 关注/取消关注用户
-@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)
+@app.route('/api/follow/<int:followee_id>', methods=['POST', 'DELETE'])
+def follow_user(followee_id):
+    follower_id = session.get('user_id', 1)
     if follower_id == followee_id:
         return jsonify({'error': 'Cannot follow yourself'}), 400
     
@@ -470,130 +468,6 @@
         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
