我正在我的网站上实施一个小型投票系统。我提出了三种实现方法,我希望得到您的反馈。
我想让我的用户能够对某些用户生成的内容进行多种投票。这是关于游戏的微观Q& A,与SO和他们的投票系统不同,它的规模要小得多,专业化。
用以下方法玩弄后,我无法确定哪种方法最好。
方法1:使用网址参数和表格
方法2:使用网址参数和jQuery
方法3:使用以上的以太方法,但从数据库中检索其信息
模式假设Q和A都是具有不同postTypeId的post对象,以及以下两个表:
voteTypes(id, voteTypeId, voteName)
votes(id, postId, parentId, userId, ownerUserId, voteTypeId)
- parentId表示的id 父母的帖子。如果帖子被投票 on是一个答案帖子,它习惯了 确保问题帖子(postTypeId = 1) 只能有一个接受的答案。
- ownerUserId表示userId 帖子(正在投票)所有者。它 与userId进行比较,其中 来自会议,以确保 用户不能自己投票 讯息。
- userId来自会话并代表投射的人 投票。
醇>
方法1 在查看中循环每个帖子时,在视图中创建一个投票表单。使用隐藏字段捕获数据:
<input type="hidden" value="@voteTypeId" etc...
postId,parentId和ownerUserId将来自要输出到视图的查询。 userId将来自会话。
缺点: 1.用户可以操纵数据。由于ownerUserId设置在视图级别,因此用户可以接受他没有问过的问题的答案。 2.繁琐:我必须创建与视图中的帖子一样多的表单。每个帖子将有4个表格。一个包含10个帖子的页面可以有40个表单。
优点: 这很简单。
方法2 使用带有自定义数据标记和jQuery的锚点来构建投票URL。
<a data-vote-type-id="@voteTypeId" data-post-id="@postId" etc...
ownerUserId,postId,parentId,voteTypeId将来自URL。来自会话的userId。
优点
1.重量轻,无形式。一个jQuery调用提交任何投票,如下:
var data = 'voteTypeId='$(this).data("vote-type-id")
等。通过ajax提交!
缺点: 1. JS禁用=没有投票。 2.数据可以通过URL发送来处理。
方法3 使用方法1或方法2仅提交voteTypeId和postId over URL。使用postId查询数据库并验证所投票的帖子对象是否存在。这样我也可以验证帖子的ownerUserId和parentId。
如果帖子是对象,请创建一个newVote对象。
userId将来自会话。 postId和voteTypeId将来自URL。 parentId和ownerUserId将来自我查询的post对象。
优点: 1.数据不受用户操纵影响,因为可以验证帖子的存在,因此可以是ownerUserId和parentId。
缺点: 辛苦的。要求数据库查找帖子并检索视图级别已有的详细信息似乎是不必要的。 2.数据在某些情况下是非规范化的,因此在成功投票(例如,投票)之后,我必须通过对象回调增加posts表(例如,向现有的向上投票数添加+1),是对数据库的另一个调用,其中包含视图中已有的信息,然后是控制器级别。
我没有考虑过的其他事情: 1.查找投票是否已存在并切换,这将需要另一个查询。 2.验证组合是一场噩梦。
我正在寻找反馈或其他想法。所以请分享! 非常感谢!
答案 0 :(得分:3)
我会选择方法2,但会有一些变化。
投票,改变投票等等,根据成功情况,只返回true
或false
。
输入PostID,VoteTypeID,UserID等你不能将其留下,如果这是你的瓶颈重新考虑数据库模型(如果你不能将它放入关系数据库使用noSQL的话)。 / p>
如果您退出验证,我将亲自将您的网站排名为遗忘,请进行服务器端验证。
的 ALWAYS 强>
客户端从视图中获取信息,然后它可以向服务器发出特定的调用,我们在这里假设一个非恶意用户,如果不是这样,他将在后端失败。
只要有人演员/抄袭,我们就会做以下事情:
false
,我们撤消操作并提供错误消息此方法的好处: