ThinkPHP5+jQuery+MySql实现投票功能

 更新时间:2020年01月17日 08:45:53   作者:下页、再停留  
这篇文章主要介绍了ThinkPHP5+jQuery+MySql实现投票功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

ThinkPHP5+jQuery+MySql实现投票功能,先给大家展示下效果图,如果大家感觉效果不错,请参考实例代码。

效果图:

前端代码:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>基于THINKPHP5实现红蓝投票功能</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(){
  // 获取初始数据
  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="//www.jb51.net/article/71504.htm">ThinkPHP5+jQuery+MySql实现红蓝投票功能</a></h2>
  <div class="vote">
    <div class="votetitle">您对Thinkphp5的看法?</div>
    <div class="red" id="red">
      <p>非常实用</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
{
  /**
   * 首页
   */
  public function index()
  {
    return $this->fetch();
  }
  /**
   * 投票
   * @param vid type ip
   */
  public function Vote()
  {
    $data = input('post.');
    if (!empty($data)) {
      $data['ip'] = get_ip();  //获取Ip
      // 先检测当前ip是否已经投过票
      $count = model('Vote')->checkIp($data);
      // 检测是否提交了type,提交了即代表点击了按钮,没提交即代表页面初次渲染
      if (!empty($data['type'])) {
        if ($count == '0') {  //当前还未投过票 
          // 更新票数 添加用户ip表
          $res = model('Vote')->postVote($data);
          if ($res) {
            // 投票成功 获取当前各自的票数
            $info = $this->getPercent($data);
            return return_succ($info);
          }else{
            return return_error('投票失败');
          }
        }else{
          // 已经投过票
          return return_error('您已经投过票了');
        }
      }else{
        // 初次渲染,获取初始数据
        $info = $this->getPercent($data);
        return return_succ($info);
      }
    }else{
      return return_error('数据不能为空');
    }
  }
  // 计算比例
  public function getPercent($data)
  {
    // 投票成功 获取当前各自的票数
    $info = model('Vote')->getInfo($data);
    // 计算比例 保留3位小数
    $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
{
  // 检测当前ip是否已经投过票
  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") {
          // 更新票数表 
          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;
      }
    }
  }
  // 获取当前各自的票数
  public function getInfo($data)
  {
    // 获取各自的票数
    $info = Db::table('votes')->where(['id'=>$data['vid']])->find();
    return $info;
  }
}

总结

以上所述是小编给大家介绍的ThinkPHP5+jQuery+MySql实现投票功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • 再谈PHP中单双引号的区别详解

    再谈PHP中单双引号的区别详解

    单引号和双引号到底有啥区别呢?很多朋友都不太清楚,下面通过本文给大家介绍PHP中单双引号的区别详解,感兴趣的朋友一起学习吧
    2016-06-06
  • Laravel框架视图和模型操作方法分析

    Laravel框架视图和模型操作方法分析

    这篇文章主要介绍了Laravel框架视图和模型操作方法,结合实例形式详细分析了laravel框架视图和模型的概念、原理、创建及使用方法,需要的朋友可以参考下
    2019-12-12
  • Symfony生成二维码的方法

    Symfony生成二维码的方法

    这篇文章主要介绍了Symfony生成二维码的方法,实例分析了采用google开放api和PHP类库phpqrcode两种方法,并结合实例详细说明了Symfony下使用EndroidQrCodeBundle生成二维码的具体步骤与实现方法,需要的朋友可以参考下
    2016-02-02
  • thinkPHP订单数字提醒功能的实现方法

    thinkPHP订单数字提醒功能的实现方法

    这篇文章主要介绍了thinkPHP订单数字提醒功能的实现方法,涉及thinkPHP数据库查询、遍历及前台显示相关功能实现技巧,需要的朋友可以参考下
    2016-12-12
  • php微信支付之公众号支付功能

    php微信支付之公众号支付功能

    这篇文章主要为大家详细介绍了php微信支付之公众号支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • php处理抢购类功能的高并发请求

    php处理抢购类功能的高并发请求

    这篇文章主要为大家详细介绍了php处理抢购类功能的高并发请求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • php设计模式之组合模式实例详解【星际争霸游戏案例】

    php设计模式之组合模式实例详解【星际争霸游戏案例】

    这篇文章主要介绍了php设计模式之组合模式,结合星际争霸游戏案例形式分析了php设计模式之组合模式相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-03-03
  • codeigniter中实现一次性加载多个view的方法

    codeigniter中实现一次性加载多个view的方法

    这篇文章主要介绍了codeigniter中实现一次性加载多个view的方法,实例分析了codeigniter中view方法的实用技巧,需要的朋友可以参考下
    2015-03-03
  • PHP实现多关键字加亮功能

    PHP实现多关键字加亮功能

    关键字加亮可以更好的帮助阅读,本篇文章主要PHP实现多关键字加亮功能,具有一定的参考价值,有需要的可以看一下。
    2016-10-10
  • laravel请求参数校验方法

    laravel请求参数校验方法

    今天小编就为大家分享一篇laravel请求参数校验方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10

最新评论