Firebase 的喜欢/不喜欢功能

2024-01-08

该系统本身很容易理解,但实施起来却很棘手。此外,安全原因让我思考如何做到这一点。

我正在考虑让该功能在前端 Firebase 脚本中工作,只需执行所有操作即可检查该用户是否已经发布了喜欢/不喜欢的内容,并在用户单击时删除/添加/切换。问题在于此方法的安全性:用户不能创建一个不检查是否发布了类似内容的新函数吗?

如果可能的话,这个系统应该如何运作?现在我的逻辑是:

Clicked like:
    locally activate/deactivate like button and remove dislike active class if on
    check docs for this user/doc like
        `1`? -> remove this doc from collection
        `0`? -> switch to `1`, because `0` is dislike
        `undefined`? -> create doc with `vote: 1`
            change (+1/-1 or +2/-2) the value of post votes fields

不喜欢也一样。但对于这么小的功能来说,这听起来确实很复杂。也许可以在不失去安全级别的情况下通过用户/投票进行额外的收集?或者使用 http-triggers 可能会以某种方式帮助解决这个问题?这个功能在一些类似 PHP 的语言上会容易得多,所以我现在很害怕。


这是我的假设。

  1. 您有一个具有唯一 ID 的帖子,我们称之为post_id
  2. 您有一个具有唯一 ID 的用户,我们称其为user_id
  3. 有 3 种有效状态:(未定义)、(喜欢)、(不喜欢)

基本流程如下

为了存储喜欢/不喜欢的内容,您创建一个名为的集合feelings它使用post_id+':'+user_id因为它是文档 ID(这使得查找起来很容易)。

文件位于feelings有一个名为state那个商店-1因为不喜欢,1对于喜欢。

正如您所提到的,您可以简单地将此值设置或覆盖为用户想要的任何值。如果他们决定消除他们的“感觉”并且既不喜欢也不不喜欢,请发出删除命令(这比执行写入将状态设置为 0 更便宜)。

使用云函数收听feelings根据此状态如何变化(或创建/删除)收集和更新帖子文档的喜欢/不喜欢计数。

安全规则只能执行允许的状态-1 and 1,如果您使用 Firebase Auth,您可以简单地强制只允许用户匹配user_id能够改变状态。

你现在有什么?

您现在拥有一个具有以下属性的系统:

  • 用户可以喜欢和不喜欢帖子
  • 用户可以删除和/或更改他们的喜欢/不喜欢
  • 用户只能喜欢或不喜欢一个帖子一次 - 他们不能多次这样做
  • 只有有效的状态(喜欢、不喜欢)才能写入数据库
  • 只有用户可以更新他们的喜欢/不喜欢
  • 可扩展:无论是 10 个帖子,还是数百万个帖子,该系统都可以工作

奖金积分

使用您注册来更新计数的同一 Cloud Functions 事件,您还可以使用它在喜欢和不喜欢数组中的用户 ID 列表中添加或删除。这将允许您列出喜欢或不喜欢某个帖子的用户,而无需查询该帖子中的每个单独文档。feelings收藏

另请记住,Cloud Functions 对于单个事件触发多次的可能性很小。如果您希望保证计数准确,请使代码幂等,或者仅手动触发“重新计数”过程,如果您或用户检测到计数似乎相差一,则可以触发该过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 的喜欢/不喜欢功能 的相关文章

  • Access / Word 2010 VBA 邮件合并尝试打开 [文件夹名称].mdb 而不是 ACCDB 源

    我们正在尝试从 Access 中自动执行邮件合并过程 单击按钮后 VBA 将运行指定当前数据库 accdb 作为数据源并运行 SQL 具体代码如下 Set up Word Dim objWord As Object Set objWord
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse
  • 没有 OAuth 的 Spring Security JWT

    最近我开始学习如何使用oauth 2 0 jwt配置spring boot 我有一个问题 是否可以使用spring boot security jwt避免oauth 2 0 是的 可以使用JWT无需使用标准化的功能OAuth 2 0 flo
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • 如何为 Windows toast 注册协议?

    如何注册 Windows toast 协议 样本中来自https blogs msdn microsoft com tiles and toasts 2015 07 02 adaptive and interactive toast not
  • ngmodel与Angular2中复选框的动态数组绑定

    我有一个 Angular 2 组件 其中我从数组生成复选框列表 现在我需要根据选中的复选框填充不同的数组 这应该是双向绑定 这意味着如果复选框的值已在数组中 则必须已经检查了复选框 我在 Angular 1 中使用了一个名为 checkli
  • 闪亮井板宽度

    library shiny library shinydashboard ui lt dashboardPage dashboardHeader dashboardSidebar dashboardBody wellPanel tags d
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显
  • 自定义 Visual Studio 2008 中的位置栏

    有人成功定制了 VS 2008 的 Places Bar 吗 我从 VS 2005 进行的自定义设置并没有转移到 2008 显然 并且无论我如何处理注册表 我都无法使我的自定义位置出现在 打开 对话框中 我已经阅读并应用了相关的MS KB文
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议
  • android ndk 硬件调试内存

    背景 我对 C 很有经验 对 Android 和 Java 还很陌生 但这是编程的环境问题 我已经用 ANSI C 开发了一个管理应用程序 可以移植到任何操作系统 只需在依赖于操作系统的代码中添加 UI 即可 它使用相当多的内存 特别是对于
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do

随机推荐

  • Xamarin iOS 防止特定视图控制器旋转

    需要防止特定视图控制器上的屏幕旋转我在下面尝试过 public override bool ShouldAutorotateToInterfaceOrientation UIInterfaceOrientation toInterfaceO
  • Select2:动态隐藏某些选项

    基本上我正在寻找的是能够从所选项目的下拉列表中隐藏选项的能力 因此 从技术上讲 它们仍然是选项 但您只是无法单击它们 因为它们是隐藏的 我浏览了文档并发现了与禁用相关的内容 不幸的是我非常特别想要隐藏项目的能力 有人对如何实现这一目标有建议
  • 继承构造函数

    为什么这段代码 class A public explicit A int x class B public A int main void B b new B 5 delete b 导致这些错误 main cpp In function
  • Java 制作一个单独的注释,结合其他注释

    使用 Play Framework 2 2 制作 RESTful API 在我正在使用的模型中 我只想输出 Json with Jackson 相关对象的 Id 而不是整个对象 我找到了如何做到这一点 如下所示 JsonIdentityIn
  • 使用 FileProvider 在 Android N 上打开下载的文件

    由于 FileProvider 的更改 我必须修复适用于 Android N 的应用程序 我基本上已经阅读了关于这个主题的所有内容 但没有找到适合我的解决方案 这是我们之前的代码 它开始从我们的应用程序下载 并将它们存储在Download文
  • Dart/Flutter 中什么时候应该使用分号?

    我是 Dart Flutter 的初学者并尝试阅读this https dart dev guides language language tour但我仍然不明白什么时候使用分号 为什么我们不在小部件的每个括号末尾插入分号 Dart中有两种
  • 我可以查出坐标是否在城市内吗?

    假设我有一个 LatLng 对象 有什么方法可以检查它是否代表城市内的可能位置 如何获得城市的边界 我正在使用谷歌地图V3 您尝试过反向地理编码吗 http code google com apis maps documentation j
  • 程序收到信号:“EXC_BAD_ACCESS”

    我有一个字符串变量 它存储日期选择器中的日期 但是当我在其他函数中使用它的值时 我收到类似程序收到信号的错误 EXC BAD ACCESS 注意 变量是全局定义的 code void changedDate UIDatePicker pic
  • 从相机预览中的触摸事件中检索准确的 RGB 值

    我一直在开发一个 Android 应用程序 它只需要检索并在相机预览上显示触摸事件的坐标和 RGB 值 我是这种编程语言的初学者 我只是想尝试一下 但应用程序在触摸事件期间不断崩溃 这是我在 Android 中尝试过的代码 When cop
  • 在 PyQt 中显示其他语言字符

    PyQt4 有没有办法显示其他语言字符 如果有 我应该采取什么方法 方向 提前致谢 Qt 使用 Unicode 并且应该能够以您拥有合适字体的任何语言显示 Unicode 文本 例如 Roberto Alesina 的简单 Hello Wo
  • 新的“dynamic”C# 4.0 关键字是否弃用了“var”关键字?

    当 C 4 0 出现时 我们有了如此处描述的动态关键字excellent presentation by Anders Hejlsberg http channel9 msdn com pdc2008 TL16 C 的发展速度比我能跟上的要
  • OSGi - 这项技术有多成熟?

    我有一个要求 我需要共享一些网络资源 jsp html js images css等 跨越不同Spring based Struts 2应用程序 似乎OSGi可以用来实现这个吗 有人可以指点一下如何实现这一目标吗OSGi 其次我想知道的是O
  • Java 线程/易失性

    我有一个线程 class Foo extends Thread boolean active true public void run while active do stuff public void end active false p
  • 'in' 表示两个复杂度最低的排序列表

    我有两个sorted列表 例如 a 1 4 7 8 b 1 2 3 4 5 6 我想知道其中的每一项a如果它在b 对于上面的例子 我想找到 a in b True True False False 或具有索引 其中a in b is Tru
  • php检查数组值是否重复[重复]

    这个问题在这里已经有答案了 我有以下数组 PHP arr array A A B C 我想检查值 如果值重复则必须发出警报错误 PHP chk array count values array if chk 0 lt 1 chk 2 lt
  • Visual Studio 2015突然不想在类中创建新变量[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我几乎一整天都在为这个问题苦苦挣扎 我在互联网上找不到任何答案 我知道这个修复只是为了改变一件小事 但我不知道是哪一件 卸载 使用
  • SQL LIKE % 未搜索

    我想使用 SQL LIKE 函数执行简单的搜索 不幸的是 由于某种原因 它似乎不起作用 下面是我的代码 private void gvbind connection Open string sql if txtSearch Text Tri
  • 将小数转换为另一种基数的时间复杂度

    这是计算十进制数的基本版本的代码 我不确定它的时间复杂度 谢谢 public static String convertToBase int num int base if base gt 36 throw new IllegalArgum
  • 我有一个包含 14 个静态方法和 4 个静态属性的类 - 这很糟糕吗?

    我一直在编写一个 PHP 类 该类正好有 450 行长 它包含 14 个静态方法和 4 个静态属性以及 6 个常量 以及私有 construct and clone 我想知道我是不是做错了什么 我的班级是邪恶的吗 当您使用该类时 您总是调用
  • Firebase 的喜欢/不喜欢功能

    该系统本身很容易理解 但实施起来却很棘手 此外 安全原因让我思考如何做到这一点 我正在考虑让该功能在前端 Firebase 脚本中工作 只需执行所有操作即可检查该用户是否已经发布了喜欢 不喜欢的内容 并在用户单击时删除 添加 切换 问题在于