Home > PHP Framework > ThinkPHP > body text

ThinkPHP5+jQuery+MySql method to implement voting function

藏色散人
Release: 2020-01-21 17:45:04
forward
3202 people have browsed it

The following column ThinkPHP Tutorial will introduce to you how to implement the voting function in ThinkPHP5 jQuery MySql. I hope it will also be helpful to friends in need!

ThinkPHP5+jQuery+MySql method to implement voting function

The first rendering is as follows:

ThinkPHP5+jQuery+MySql method to implement voting function

Then share the code as follows:

Front-end code:

<!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(&#39;&#39;,1);
    
    $(".redhand").click(function(){
        getdata("red",1);
    });
    $(".bluehand").click(function(){
        getdata("blue",1);
    });
});
function getdata(type,vid){
    $.ajax({
      url: "{:url(&#39;/index/vote/vote&#39;)}",
      data: {type:type,vid:vid},
      type:&#39;POST&#39;,
      dataType: &#39;json&#39;,
      success: function (res) {
          console.log(res)
          if (res.status == 0) {
              alert(&#39;投票成功&#39;)
              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(&#39;投票失败&#39;);
          }
      }
    });
}
</script>
</head>
<body>
<div id="main">
   <h2 class="top_title"><a href="http://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>
Copy after login

Controller:

<?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(&#39;post.&#39;);
        if (!empty($data)) {
            $data[&#39;ip&#39;] = get_ip();    //获取Ip
            // 先检测当前ip是否已经投过票
            $count = model(&#39;Vote&#39;)->checkIp($data);
            // 检测是否提交了type,提交了即代表点击了按钮,没提交即代表页面初次渲染
            if (!empty($data[&#39;type&#39;])) {
                if ($count == &#39;0&#39;) {    //当前还未投过票 
                    // 更新票数  添加用户ip表
                    $res = model(&#39;Vote&#39;)->postVote($data);
                    if ($res) {
                        
                        // 投票成功  获取当前各自的票数
                        $info = $this->getPercent($data);
                        return return_succ($info);
                    }else{
                        return return_error(&#39;投票失败&#39;);
                    }
                }else{
                    // 已经投过票
                    return return_error(&#39;您已经投过票了&#39;);
                }
            }else{
                // 初次渲染,获取初始数据
                $info = $this->getPercent($data);
                return return_succ($info);
            }
        }else{
            return return_error(&#39;数据不能为空&#39;);
        }
    }
    // 计算比例
    public function getPercent($data)
    {
        // 投票成功  获取当前各自的票数
        $info = model(&#39;Vote&#39;)->getInfo($data);
        // 计算比例 保留3位小数
        $info[&#39;red_percent&#39;] = round($info[&#39;rednum&#39;] / ($info[&#39;rednum&#39;] + $info[&#39;bluenum&#39;]),3);
        $info[&#39;blue_percent&#39;] = 1 - $info[&#39;red_percent&#39;];
        return $info;
    }
}
Copy after login

Model:

<?php
namespace app\index\model;
use think\Model;
use think\Db;
class Vote extends Model
{
    // 检测当前ip是否已经投过票
    public function checkIp($data)
    {
        $res = Db::table(&#39;votes_ip&#39;)->where([&#39;vid&#39;=>$data[&#39;vid&#39;],&#39;ip&#39;=>$data[&#39;ip&#39;]])->count();
        return $res;
    }
    // 投票
    public function postVote($data)
    {
        $info = $this->getInfo($data);
        if ($info) {
            Db::startTrans();
            try {
                
                if ($data[&#39;type&#39;] == "red") {
                    // 更新票数表  
                    Db::table(&#39;votes&#39;)->where([&#39;id&#39;=>$data[&#39;vid&#39;]])->update([&#39;rednum&#39;=>$info[&#39;rednum&#39;]+1]);
                }elseif ($data[&#39;type&#39;] == "blue") {
                    Db::table(&#39;votes&#39;)->where([&#39;id&#39;=>$data[&#39;vid&#39;]])->update([&#39;bluenum&#39;=>$info[&#39;bluenum&#39;]+1]);
                }
                // 添加用户投票ip
                Db::table(&#39;votes_ip&#39;)->insert([&#39;vid&#39;=>$data[&#39;vid&#39;],&#39;ip&#39;=>$data[&#39;ip&#39;]]);
                Db::commit();
                return true;
            } catch (Exception $e) {
                Db::rollback();
                return false;
            }
        }
    }
    // 获取当前各自的票数
    public function getInfo($data)
    {
        // 获取各自的票数
        $info = Db::table(&#39;votes&#39;)->where([&#39;id&#39;=>$data[&#39;vid&#39;]])->find();
        return $info;
    }
}
Copy after login

The above is the detailed content of ThinkPHP5+jQuery+MySql method to implement voting function. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:cnblogs.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template