问题
我不确定是否应该使用数据库或不使用数据库。但是,我知道有一种更简单的方法可以节省投票数。
您如何解决这些问题?
[编辑]
服务器端编程语言是Python。
答案 0 :(得分:59)
这是一个使用jQuery / Django的脏/未经测试的理论实现。
我们将假设上下投票是针对本网站上的问题/答案,但显然可以根据您的实际使用情况进行调整。
<div id="answer_595" class="answer">
<img src="vote_up.png" class="vote up">
<div class="score">0</div>
<img src="vote_down.png" class="vote down">
Blah blah blah this is my answer.
</div>
<div id="answer_596" class="answer">
<img src="vote_up.png" class="vote up">
<div class="score">0</div>
<img src="vote_down.png" class="vote down">
Blah blah blah this is my other answer.
</div>
$(function() {
$('div.answer img.vote').click(function() {
var id = $(this).parents('div.answer').attr('id').split('_')[1];
var vote_type = $(this).hasClass('up') ? 'up' : 'down';
if($(this).hasClass('selected')) {
$.post('/vote/', {id: id, type: vote_type}, function(json) {
if(json.success == 'success') {
$('#answer_' + id)
.find('img.' + vote_type);
.attr('src', 'vote_' + vote_type + '_selected.png')
.addClass('selected');
$('div.score', '#answer_' + id).html(json.score);
}
});
} else {
$.post('/remove_vote/', {id: id, type: vote_type}, function(json) {
if(json.success == 'success') {
$('#answer_' + id)
.find('img.' + vote_type);
.attr('src', 'vote_' + vote_type + '.png')
.removeClass('selected');
$('div.score', '#answer_' + id).html(json.score);
}
});
}
});
});
def vote(request):
if request.method == 'POST':
try:
answer = Answer.objects.get(pk=request.POST['id'])
except Answer.DoesNotExist:
return HttpResponse("{'success': 'false'}")
try:
vote = Vote.objects.get(answer=answer, user=request.user)
except Vote.DoesNotExist:
pass
else:
return HttpResponse("{'success': 'false'}")
if request.POST['type'] == 'up':
answer.score = answer.score + 1
else:
answer.score = answer.score - 1
answer.save()
Vote.objects.create(answer=answer,
user=request.user,
type=request.POST['type'])
return HttpResponse("{'success':'true', 'score':" + answer.score + "}")
else:
raise Http404('What are you doing here?')
def remove_vote(request):
if request.method == 'POST':
try:
answer = Answer.objects.get(pk=request.POST['id'])
except Answer.DoesNotExist:
return HttpResponse("{'success': 'false'}")
try:
vote = Vote.objects.get(answer=answer, user=request.user)
except Vote.DoesNotExist:
return HttpResponse("{'success': 'false'}")
else:
vote.delete()
if request.POST['type'] == 'up':
answer.score = answer.score - 1
else:
answer.score = answer.score + 1
answer.save()
return HttpResponse("{'success':'true', 'score':" + answer.score + "}")
else:
raise Http404('What are you doing here?')
让人惊讶。当我开始回答这个问题时,我并不是故意写这么多,但我得到了一点点。您仍然缺少初次请求以在首次加载页面时获得所有投票,但我会将其作为练习留给读者。无论如何,如果你 实际上使用Django并且对Stackoverflow投票的更加经过测试/真实的实现感兴趣,我建议你查看source code cnprog.com,一个中国克隆用Python / Django编写的Stackoverflow。他们发布了他们的代码并且相当不错。
答案 1 :(得分:8)
没有人提到过几点:
src="http://stackoverflow.com/question_555/vote/up/answer_3/"
在我的网站上放置图片。答案 2 :(得分:3)
您可以创建按钮,可以是链接或图像等。现在将JavaScript函数挂钩到每个按钮的click事件。单击时,该功能将触发并
UPDATE posts SET score=score+1 WHERE score_id={{insert id here}};
一样。您可以将代码存储在变量中,但这很复杂,取决于您对代码运行时环境的语义的了解程度。无论如何最终都需要将其推送到持久存储,因此使用100%数据库是一个很好的初始解决方案。当优化性能的时候到来时,世界上有足够的软件来缓存数据库查询,让你感到恍惚,所以这不是什么大不了的事。
答案 3 :(得分:0)