gpt4 book ai didi

javascript - 在这三种方法中,哪种方法最适合实现投票系统?

转载 作者:搜寻专家 更新时间:2023-11-01 04:27:42 24 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

2年前关闭。




Improve this question




我正在我的网站上实现一个小型投票系统。我提出了三种实现方法,希望得到您的反馈。

我想让我的用户能够对某些用户生成的内容进行多种类型的投票。这是关于游戏的微型问答,与 SO 及其投票系统不同,规模要小得多且特化。

在玩弄以下方法后,我无法决定哪种方法最好。

方法一:使用 URL 参数和表单

方法二:使用 URL 参数和 jQuery

方法三:使用上述之一,但从数据库中检索其信息

该架构假定 Q 和 A 都是具有不同 postTypeId 的 post 对象,以及以下两个表:

voteTypes(id, voteTypeId, voteName) 
votes(id, postId, parentId, userId, ownerUserId, voteTypeId)

  1. parentId represents the id of the parent post. If the post being voted on is an answer post, it is used to ensure a question post (postTypeId=1) can have only one accepted answer.
  2. ownerUserId represents the userId of the post's (being vote on) owner. It is compared against the userId, which comes from the session, to ensure a user can't vote on his or her own posts.
  3. userId comes from the session and represents the person casting the vote.


方法一 当查询在每个帖子上循环时,在 View 中创建一个投票表单。使用隐藏字段来捕获数据:
<input type="hidden" value="@voteTypeId" etc... 

postId、parentId 和 ownerUserId 将来自输出到 View 的查询。 userId 将来自 session 。

缺点:
1. 用户可以操作数据。用户可以接受他没有问过的问题的答案,因为 ownerUserId 是在 View 级别设置的。
2. 繁琐:我必须创建与 View 中的帖子一样多的表单。每个帖子将有 4 个表格。一个包含 10 个帖子的页面可以有 40 个表单。

优点:
1. 很简单。

方法二 使用带有自定义数据标签和 jQuery 的 anchor 来构建投票 URL。
<a data-vote-type-id="@voteTypeId" data-post-id="@postId" etc...

ownerUserId、postId、parentId、voteTypeId 将来自 URL。 session 中的用户 ID。

优势
1.重量轻,无形式。一个 jQuery 调用以提交任何投票,例如: var data = 'voteTypeId='$(this).data("vote-type-id")等通过ajax提交!

缺点:
1. JS 禁用 = 没有投票。
2. 数据可以被操纵,因为它是通过 URL 发送的。

方法三 使用方法 1 或 2 通过 URL 仅提交 voteTypeId 和 postId。使用 postId 查询数据库并验证被投票的帖子对象是否存在。这样我也可以验证帖子的 ownerUserId 和 parentId 。

如果帖子是一个对象,则创建一个 newVote 对象。

userId 将来自 session 。 postId 和 voteTypeId 将来自 URL。
parentId 和 ownerUserId 将来自我查询的 post 对象。

优点:
1. 由于帖子的存在可以验证,因此可以防止用户操作的数据,它的 ownerUserId 和 parentId 也可以验证。

缺点:
1. 费力。要求数据库查找帖子并检索 View 级别已经可用的详细信息似乎没有必要。
2. 在某些情况下,数据是非规范化的,因此在成功投票(例如投票)后,我必须通过对象回调增加帖子表(例如,将 +1 添加到现有的投票数量),这是对数据库的又一次调用,其中包含 View 中已经可用的信息,然后是 Controller 级别。

其他我没有考虑的事情:
1. 查找投票是否已经存在并切换它,这将需要另一个查询。 2. 验证组合是一场噩梦。

我正在寻找反馈或其他想法。所以请分享!
非常感谢!

最佳答案

我会选择方法 2,但有一些变化。

服务器端

用于投票、更改投票等的钩子(Hook)返回简单 truefalse取决于成功。
输入 PostID、VoteTypeID、UserID 等你 不能忽略这一点,如果这是您的瓶颈,请重新考虑数据库模型(如果您无法将其放入关系数据库中,请使用 noSQL 的东西)。

如果您忽略验证,我会亲自将您的网站排名下降到遗忘 ,做服务器端验证。
永远 .

客户端

客户端从 View 中获取信息,然后它可以向服务器发出特定调用,我们在这里假设一个非恶意用户,如果不是这种情况,他只会在后端失败。

一旦有人转换/切换,我们就会做以下事情:

  • 使用 View 中可用的数据检查此操作是否可行
  • 更新 UI 以反射(reflect)更改
  • 向服务器发送请求
  • 如果该请求返回 false我们撤消操作并给出错误消息

  • 这种方法的好处:
  • 安全,我不能仅仅通过发送一些http请求做不可能的事情
  • 用户得到快速响应和对错误的体面反馈
  • 由于非恶意用户不太可能发生错误,因此我们不需要在这里进行无休止的检查
  • 恶意用户,如果 UI 出现故障,我们不关心后端是否安全。
  • 关于javascript - 在这三种方法中,哪种方法最适合实现投票系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238704/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com