跟踪用户投票(每个主题一票,即Reddit)

时间:2018-01-23 00:03:33

标签: reactjs firebase firebase-realtime-database

我正在开发一个应用程序,允许用户影响玩家排名和现场板(趋势足球)的趋势。

enter image description here

正如您所看到的,您可以上传或下注玩家(仅当您通过Firebase(Google帐户)登录并进行身份验证时)。否则,如果您没有登录,则不会投票。目前工作正常。

我的问题是,让每个用户只能投票 一次 的最简单方法是什么。目前的实施允许任何玩家无限制上下投票。我想这样,所以我可以赞成汤姆布拉迪,但不能再投票给他。从那时起,我只能将其更改为不投票(通过再次点击)或downvote。我看到firebase中有User UID,所以我可以在允许投票通过之前检查UserUID是否已经对firebase数据库中的特定玩家进行了投票,但是如果用户只想更改一下该怎么办呢?投票投票?

以下是处理投票的代码 -

downvotePlayer(playerId) {

this.state.user ?
  this.database.child(playerId).transaction(function (player) {
    if (player) {
      player.votes--
    }
    return player;
  })
  :
  console.log("Must log in to vote")

}

upvotePlayer(playerId) {
this.state.user ?
  this.database.child(playerId).transaction(function (player) {
    if (player) {
      console.log(player)
      player.votes++
    }
    return player;
  })
  :
  console.log("Must be logged in to vote.")

}

以下是Firebase的布局:

enter image description here

如果我遗漏任何重要信息,请告诉我,我会把它扔进一把。提前谢谢。

修改

初始DB ref

    this.database = firebase.database().ref().child('players');

在向玩家添加upvote时,我这样做:

    this.database.child(playerId).transaction(function (player) {

    if (player) {
      var ref = firebase.database().ref('players').child('voters');
      ref.child(uid).set(1);
    }

除了在firebase中一起创建一个新节点外,它几乎正在做它需要做的事情。

enter image description here

“选民”应该在其上方的独特球员内。我的问题显而易见吗?我很感谢帮助先生。

2 个答案:

答案 0 :(得分:3)

对此进行建模的最简单方法是为每个玩家存储一个单独的计数器"他们可以投票的东西"。例如:

"Votes": {
  "Tom Brady": {
    "uidOfVoter1": 1,
    "uidOfVoter2": -1
  }
}

uidOfVoter值是您为每个玩家提供的唯一值,即他们从Firebase身份验证获得的UID。在这样的结构中,每个UID只能出现一次。然后,您可以确保每个用户只能使用Firebase安全规则编写自己的投票:

{
  "rules": {
    "Votes": {
      "$thing": {
        "$uid": {
          ".write": "auth.uid === $uid",
          ".validate": "data.isNumber() && data.val() >= -1 && data.val() <= 1"
        }
      }
    }
  }
}

现在获得总票数:

  • 下载投票并在客户端计算。
  • 每当用户投票时更新一个计数器,编写安全规则以确保他们所写的投票和计数匹配。
  • 使用云功能在投票/更改投票时更新计数。

答案 1 :(得分:2)

布尔值。 +是真的 - 是假的。 UID的存在表明投票(r)。

我无法专门对编码做出反应,但似乎这是表示你所追求的最简单(最佳)方式。

一旦投票任何一种方式,禁用/灰显客户端用户界面上的相应投票按钮。即使他们攻击用户界面,服务器端(数据库端)它也是一个布尔值,所以你不能为+2做真的。

DB Structure
thing
  votes
    <uid1>:true,
    <uid2>:true,
    <uid3>:false,

如果用户撤消投票,只需从他们投票的东西中删除uid即可。