ThinkPHP5+jQuery+MySql實(shí)現(xiàn)投票功能
ThinkPHP5+jQuery+MySql實(shí)現(xiàn)投票功能,先給大家展示下效果圖,如果大家感覺(jué)效果不錯(cuò),請(qǐng)參考實(shí)例代碼。
效果圖:

前端代碼:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>基于THINKPHP5實(shí)現(xiàn)紅藍(lán)投票功能</title>
<style type="text/css">
.vote{width:288px; height:300px; margin:40px auto;position:relative}
.votetitle{width:100%;height:62px; background:url(/static/index/images/icon.png) no-repeat 0 30px; font-size:15px}
.red{position:absolute; left:0; top:64px; height:80px;}
.blue{position:absolute; right:0; top:64px; height:80px;}
.red p,.blue p{line-height:22px}
.redhand{position:absolute; left:0;width:36px; height:36px; background:url(/static/index/images/icon.png) no-repeat -1px -38px;cursor:pointer}
.bluehand{position:absolute; right:0;width:36px; height:36px; background:url(/static/index/images/icon.png) no-repeat -41px -38px;cursor:pointer}
.grayhand{width:34px; height:34px; background:url(/static/index/images/icon.png) no-repeat -83px -38px;cursor:pointer}
.redbar{position:absolute; left:42px; margin-top:8px;}
.bluebar{position:absolute; right:42px; margin-top:8px; }
.redbar span{display:block; height:6px; background:red; width:100%;border-radius:4px;}
.bluebar span{display:block; height:6px; background:#09f; width:100%;border-radius:4px; position:absolute; right:0}
.redbar p{line-height:20px; color:red;}
.bluebar p{line-height:20px; color:#09f; text-align:right; margin-top:6px}
</style>
<script type="text/javascript" src="/static/index/js/jquery.js"></script>
<script type="text/javascript">
$(function(){
// 獲取初始數(shù)據(jù)
getdata('',1);
$(".redhand").click(function(){
getdata("red",1);
});
$(".bluehand").click(function(){
getdata("blue",1);
});
});
function getdata(type,vid){
$.ajax({
url: "{:url('/index/vote/vote')}",
data: {type:type,vid:vid},
type:'POST',
dataType: 'json',
success: function (res) {
console.log(res)
if (res.status == 0) {
alert('投票成功')
var w = 208;
$("#red_num").html(res.msg.rednum);
$("#red").css("width",res.msg.red_percent*100+"%");
var red_bar_w = w*res.msg.red_percent-10;
$("#red_bar").css("width",red_bar_w);
$("#blue_num").html(res.msg.bluenum);
$("#blue").css("width",res.msg.blue_percent*100+"%");
var blue_bar_w = w*res.msg.blue_percent;
$("#blue_bar").css("width",blue_bar_w);
}else{
alert('投票失敗');
}
}
});
}
</script>
</head>
<body>
<div id="main">
<h2 class="top_title"><a href="http://chabaoo.cn/article/71504.htm">ThinkPHP5+jQuery+MySql實(shí)現(xiàn)紅藍(lán)投票功能</a></h2>
<div class="vote">
<div class="votetitle">您對(duì)Thinkphp5的看法?</div>
<div class="red" id="red">
<p>非常實(shí)用</p>
<div class="redhand"></div>
<div class="redbar" id="red_bar">
<span></span>
<p id="red_num"></p>
</div>
</div>
<div class="blue" id="blue">
<p style="text-align:right">完全不懂</p>
<div class="bluehand"></div>
<div class="bluebar" id="blue_bar">
<span></span>
<p id="blue_num"></p>
</div>
</div>
</div>
</div>
</body>
</html>
控制器:
<?php
namespace app\index\controller;
use think\Controller;
/**
* 投票
*/
class Vote extends Controller
{
/**
* 首頁(yè)
*/
public function index()
{
return $this->fetch();
}
/**
* 投票
* @param vid type ip
*/
public function Vote()
{
$data = input('post.');
if (!empty($data)) {
$data['ip'] = get_ip(); //獲取Ip
// 先檢測(cè)當(dāng)前ip是否已經(jīng)投過(guò)票
$count = model('Vote')->checkIp($data);
// 檢測(cè)是否提交了type,提交了即代表點(diǎn)擊了按鈕,沒(méi)提交即代表頁(yè)面初次渲染
if (!empty($data['type'])) {
if ($count == '0') { //當(dāng)前還未投過(guò)票
// 更新票數(shù) 添加用戶ip表
$res = model('Vote')->postVote($data);
if ($res) {
// 投票成功 獲取當(dāng)前各自的票數(shù)
$info = $this->getPercent($data);
return return_succ($info);
}else{
return return_error('投票失敗');
}
}else{
// 已經(jīng)投過(guò)票
return return_error('您已經(jīng)投過(guò)票了');
}
}else{
// 初次渲染,獲取初始數(shù)據(jù)
$info = $this->getPercent($data);
return return_succ($info);
}
}else{
return return_error('數(shù)據(jù)不能為空');
}
}
// 計(jì)算比例
public function getPercent($data)
{
// 投票成功 獲取當(dāng)前各自的票數(shù)
$info = model('Vote')->getInfo($data);
// 計(jì)算比例 保留3位小數(shù)
$info['red_percent'] = round($info['rednum'] / ($info['rednum'] + $info['bluenum']),3);
$info['blue_percent'] = 1 - $info['red_percent'];
return $info;
}
}
模型:
<?php
namespace app\index\model;
use think\Model;
use think\Db;
class Vote extends Model
{
// 檢測(cè)當(dāng)前ip是否已經(jīng)投過(guò)票
public function checkIp($data)
{
$res = Db::table('votes_ip')->where(['vid'=>$data['vid'],'ip'=>$data['ip']])->count();
return $res;
}
// 投票
public function postVote($data)
{
$info = $this->getInfo($data);
if ($info) {
Db::startTrans();
try {
if ($data['type'] == "red") {
// 更新票數(shù)表
Db::table('votes')->where(['id'=>$data['vid']])->update(['rednum'=>$info['rednum']+1]);
}elseif ($data['type'] == "blue") {
Db::table('votes')->where(['id'=>$data['vid']])->update(['bluenum'=>$info['bluenum']+1]);
}
// 添加用戶投票ip
Db::table('votes_ip')->insert(['vid'=>$data['vid'],'ip'=>$data['ip']]);
Db::commit();
return true;
} catch (Exception $e) {
Db::rollback();
return false;
}
}
}
// 獲取當(dāng)前各自的票數(shù)
public function getInfo($data)
{
// 獲取各自的票數(shù)
$info = Db::table('votes')->where(['id'=>$data['vid']])->find();
return $info;
}
}
總結(jié)
以上所述是小編給大家介紹的ThinkPHP5+jQuery+MySql實(shí)現(xiàn)投票功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
thinkPHP訂單數(shù)字提醒功能的實(shí)現(xiàn)方法
這篇文章主要介紹了thinkPHP訂單數(shù)字提醒功能的實(shí)現(xiàn)方法,涉及thinkPHP數(shù)據(jù)庫(kù)查詢、遍歷及前臺(tái)顯示相關(guān)功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-12-12
php處理?yè)屬?gòu)類(lèi)功能的高并發(fā)請(qǐng)求
這篇文章主要為大家詳細(xì)介紹了php處理?yè)屬?gòu)類(lèi)功能的高并發(fā)請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
php設(shè)計(jì)模式之組合模式實(shí)例詳解【星際爭(zhēng)霸游戲案例】
這篇文章主要介紹了php設(shè)計(jì)模式之組合模式,結(jié)合星際爭(zhēng)霸游戲案例形式分析了php設(shè)計(jì)模式之組合模式相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03
codeigniter中實(shí)現(xiàn)一次性加載多個(gè)view的方法
這篇文章主要介紹了codeigniter中實(shí)現(xiàn)一次性加載多個(gè)view的方法,實(shí)例分析了codeigniter中view方法的實(shí)用技巧,需要的朋友可以參考下2015-03-03
PHP實(shí)現(xiàn)多關(guān)鍵字加亮功能
關(guān)鍵字加亮可以更好的幫助閱讀,本篇文章主要PHP實(shí)現(xiàn)多關(guān)鍵字加亮功能,具有一定的參考價(jià)值,有需要的可以看一下。2016-10-10
laravel請(qǐng)求參數(shù)校驗(yàn)方法
今天小編就為大家分享一篇laravel請(qǐng)求參數(shù)校驗(yàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10

