idl*_*and 5 firebase reactjs firebase-realtime-database
我正在开发一个应用程序,允许用户影响玩家排名和现场板(趋势足球)的趋势.
正如您所看到的,您可以投票或下注玩家(仅当您通过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.")
}
Run Code Online (Sandbox Code Playgroud)
这是Firebase的布局:
如果我遗漏了任何重要信息,请告诉我,我会把它放在一个要点上.提前致谢.
编辑:
初始DB ref是
this.database = firebase.database().ref().child('players');
Run Code Online (Sandbox Code Playgroud)
在向玩家添加upvote时,我这样做:
this.database.child(playerId).transaction(function (player) {
if (player) {
var ref = firebase.database().ref('players').child('voters');
ref.child(uid).set(1);
}
Run Code Online (Sandbox Code Playgroud)
除了它在firebase中一起创建一个新节点之外,它几乎正在做它需要做的事情.
"选民"应该在其上方的独特球员内部.我的问题显而易见吗?我很感激帮助先生.
对此进行建模的最简单方法是为每个玩家每个“他们可以投票的事情”存储一个计数器。例如:
"Votes": {
"Tom Brady": {
"uidOfVoter1": 1,
"uidOfVoter2": -1
}
}
Run Code Online (Sandbox Code Playgroud)
这些uidOfVoter值是您为每个玩家提供的唯一值,即他们从 Firebase 身份验证获得的 UID。在这样的结构中,每个 UID 只能出现一次。然后使用 Firebase 安全规则确保每个用户只能写自己的投票:
{
"rules": {
"Votes": {
"$thing": {
"$uid": {
".write": "auth.uid === $uid",
".validate": "data.isNumber() && data.val() >= -1 && data.val() <= 1"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在要获得总票数,要么:
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |