关注与取消关注

接口设计

  • URL:/news/followed_user
  • 请求方式:POST
  • 传入参数:JSON格式
  • 参数
参数名 类型 是否必须 参数说明
user_id int 被关注的用户id
action string 指定两个值:'follow', 'unfollow'
  • 返回类型:JSON
参数名 类型 是否必须 参数说明
errno int 错误码
errmsg string 错误信息

代码实现

  • modules/news/views.py 中添加视图函数
@news_blu.route('/followed_user', methods=["POST"])
@user_login_data
def followed_user():
    """关注/取消关注用户"""
    if not g.user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    user_id = request.json.get("user_id")
    action = request.json.get("action")

    if not all([user_id, action]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    if action not in ("follow", "unfollow"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    # 查询到关注的用户信息
    try:
        target_user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据库失败")

    if not target_user:
        return jsonify(errno=RET.NODATA, errmsg="未查询到用户数据")

    # 根据不同操作做不同逻辑
    if action == "follow":
        if target_user.followers.filter(User.id == g.user.id).count() > 0:
            return jsonify(errno=RET.DATAEXIST, errmsg="当前已关注")
        target_user.followers.append(g.user)
    else:
        if target_user.followers.filter(User.id == g.user.id).count() > 0:
            target_user.followers.remove(g.user)

    # 保存到数据库
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据保存错误")

    return jsonify(errno=RET.OK, errmsg="操作成功")
  • detail.js 中实现关注与取消关注的请求
// 关注当前新闻作者
$(".focus").click(function () {
    var user_id = $(this).attr('data-userid')
    var params = {
        "action": "follow",
        "user_id": user_id
    }
    $.ajax({
        url: "/news/followed_user",
        type: "post",
        contentType: "application/json",
        headers: {
            "X-CSRFToken": getCookie("csrf_token")
        },
        data: JSON.stringify(params),
        success: function (resp) {
            if (resp.errno == "0") {
                // 关注成功
                var count = parseInt($(".follows b").html());
                count++;
                $(".follows b").html(count + "")
                $(".focus").hide()
                $(".focused").show()
            }else if (resp.errno == "4101"){
                // 未登录,弹出登录框
                $('.login_form_con').show();
            }else {
                // 关注失败
                alert(resp.errmsg)
            }
        }
    })
})

// 取消关注当前新闻作者
$(".focused").click(function () {
    var user_id = $(this).attr('data-userid')
    var params = {
        "action": "unfollow",
        "user_id": user_id
    }
    $.ajax({
        url: "/news/followed_user",
        type: "post",
        contentType: "application/json",
        headers: {
            "X-CSRFToken": getCookie("csrf_token")
        },
        data: JSON.stringify(params),
        success: function (resp) {
            if (resp.errno == "0") {
                // 取消关注成功
                var count = parseInt($(".follows b").html());
                count--;
                $(".follows b").html(count + "")
                $(".focus").show()
                $(".focused").hide()
            }else if (resp.errno == "4101"){
                // 未登录,弹出登录框
                $('.login_form_con').show();
            }else {
                // 取消关注失败
                alert(resp.errmsg)
            }
        }
    })
})

运行测试