我正在我的网站上实施一个小型投票系统.我提出了三种实现方法,我希望得到您的反馈.
我想让我的用户能够对某些用户生成的内容进行多种投票.这是关于游戏的微观问答,与SO和他们的投票系统不同,它的规模要小得多.
用以下方法玩弄后,我无法确定哪种方法最好.
方法1:使用URL参数和表单
方法2:使用URL params和jQuery
方法3:使用以上的以太方法,但从数据库中检索其信息
该模式假设Q和A都是具有不同postTypeId的post对象,以及以下两个表:
voteTypes(id, voteTypeId, voteName)
votes(id, postId, parentId, userId, ownerUserId, voteTypeId)
Run Code Online (Sandbox Code Playgroud)
- parentId表示父帖子的id.如果被投票的帖子是答案帖子,则用于确保问题帖子(postTypeId = 1)只能有一个接受的答案.
- ownerUserId表示帖子(正在投票)所有者的userId.它与来自会话的userId进行比较,以确保用户无法对自己的帖子进行投票.
- userId来自会话并代表投票的人.
方法1在查询循环每个帖子时在视图中创建一个投票表单.使用隐藏字段捕获数据:
<input type="hidden" value="@voteTypeId" etc...
Run Code Online (Sandbox Code Playgroud)
postId,parentId和ownerUserId将来自输出到视图的查询.userId将来自会话.
缺点: 1.用户可以操纵数据.由于ownerUserId设置在视图级别,因此用户可以接受他没有问过的问题的答案.2.繁琐:我必须创建与视图中的帖子一样多的表单.每个帖子将有4个表格.一个包含10个帖子的页面可以有40个表单.
优点: 1.很简单.
方法2使用带有自定义数据标记和jQuery的锚点来构造投票URL.
<a data-vote-type-id="@voteTypeId" data-post-id="@postId" etc...
Run Code Online (Sandbox Code Playgroud)
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.
缺点: 1.费力.要求数据库查找帖子并检索视图级别已有的详细信息似乎是不必要的.2.数据在某些情况下是非规范化的,因此在成功投票(例如,投票)之后,我必须通过对象回调增加posts表(例如,向现有的向上投票数添加+1),是对数据库的另一个调用,其中包含视图中已有的信息,然后是控制器级别.
我没有考虑的其他事项:1.找出投票是否已经存在并切换它,这将需要另一个查询.2.验证组合是一场噩梦.
我正在寻找反馈或其他想法.所以请分享!非常感谢!
我会选择方法 2,但要进行一些更改。
用于投票、更改投票等的钩子,这些钩子简单地返回true或false取决于成功。输入 PostID、VoteTypeID、UserID 等。你不能忽略它,如果这是你的瓶颈,请重新考虑数据库模型(如果你不能将其放入关系数据库中,请使用 noSQL 东西)。
如果您忽略验证,我会亲自将您的网站降级为遗忘,进行服务器端验证。
总是。
客户端从视图中获取信息,然后它可以向服务器发出特定的调用,我们在这里假设一个非恶意用户,如果不是这种情况他将在后端失败。
一旦有人施放/切换,我们就会执行以下操作:
false我们将撤消该操作并给出错误消息这种方法的好处: