最近项目中需要用到一个投票功能,当时觉得简单,向都没想就动手开始做,没想到走了不少弯路。
后来才发现,是想的太过简单了。来看看改进后的功能。
第一步:数据库设计
两个表:一个主表涉及投票标题,记录,以及当前投票状态,附表,主要存储投票的IP以便防止无限制投票,
这里的IP获取,网上找了一下 改了一些地方,代码如下
var url = 'http://chaxun.1616.net/s.php?type=ip&output=json&callback=?&_=' + Math.random();
$.getJSON(url, function (data) {
var _Ip = data.Ip.toString();
//隐藏域赋值,可自定义
$("#hidIP").val(_Ip);
});
第二部:页面设计
第三部:实现逻辑:
1.获取有效的并是最新的投票数据
var newList = db.Vote.OrderByDescending(s => s.ID).Where(s => s.VoteStatus == "1").Take(1).Select(s => new
{
ID = s.ID,
VoteName = s.VoteName,
VoteStatus = s.VoteStatus,
Result = s.Result,
Agree = s.Agree,
DisAgree = s.DisAgree
}).ToList();
2.接下来就是更新数据库,向主表中更新投票记录数,附表中则添加一条IP记录(当然的显判断IP是否已经存在)
接下来就是对数据库的操作,因为是异步,则想浏览器端返回一条记录,此处省略几个字...
第四部:异步调用:
首次加载投票记录数数据比较简单,来看点击投票的处理:
data: { getValue: a, Vote_IP: $("#hidIP").val() },
success: function (list) {
if (list != null) {
$.each(eval(list), function (i, item) {
if (item.flag === "0") {
var VoteName = item.VoteName;
var Agree = parseInt(item.Agree);
var DisAgree = parseInt(item.DisAgree);
var Count = Agree + DisAgree;
var agreePer = (Agree * 100) / Count;
var result = agreePer.toFixed(2);
var disagreePer = (100 - result).toFixed(2);
$(".f1").remove();
$("#VoteName").append('<span class="f1">' + VoteName + '</span>');
$("#tdbtn").append('<td colspan="2" class="f1" style="text-align: right;">' + Count + '人参与投票</td>');
$("#agree").append('<div class="f1" style="float: left; background-color: Blue; ' + result + 'px;"></div>');
$("#disagree").append('<div class="f1" style="float: left; background-color: Blue; ' + disagreePer + 'px;"></div>');
$("#agreeData").append('<span class="f1">' + result + '%</span>');
$("#disagreeData").append('<span class="f1">' + disagreePer + '%</span>');
} else {
$(".f2").remove();
$("#Notice").append('<span class="f2">一个IP只能投一次票,请不要重复投票...</span>');
$(".f2").fadeTo(7000, 0.0);
return false;
}
});
}
}
});
到此结束,我看了其他的一些投票功能,我的这个写的算是最粗糙的一个,还待以后改进。