整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript实现的转盘抽奖html页面前端源码

家好,今天给大家介绍一款,JavaScript实现的转盘抽奖html页面前端源码 (图1)。送给大家哦,获取方式在本文末尾。

图1

点击中间的开始按钮,就可以转动转盘(图2)

图2

源码完整,需要的朋友可以下载学习(图3)

图3

本源码编码:10165,需要的朋友,点击下面的链接后,搜索10165,即可获取。

就爱UI - 分享UI设计的点点滴滴

击右上方红色按钮关注“web秀”,让你真正秀起来

前言

最近在头条也是给小伙伴们送出3.8福利,由于是小用户,头条也没有给出抽奖活动的功能,所以必须自己来一个,顺道补充一下JS随机数的小知识。结尾附上本次抽奖代码,一次抽出中奖者,明天(3.8)12:00公布结果,也是第一次做出这样的活动,感谢大家的支持。没有参与的小伙伴还有一天时间,希望大家可以参与。

JavaScript生成随机数, 来个抽奖活动

基础知识

向上取整

Math.ceil();
// 示例
Math.ceil(1.5); // 2
Math.ceil(2.4); // 3

向下取整

Math.floor();
// 示例
Math.floor(1.2); // 1
Math.floor(0.5); // 0

四舍五入

Math.round();
// 示例
Math.round(1.2); // 1
Math.round(0.5); // 1

0.0 ~ 1.0 之间的一个伪随机数。【包含0不包含1】

Math.random(); // 0.8647578968666494

获取从1到10的随机整数

Math.ceil(Math.random()*10); // 取0的概率极小。

均衡获取0到1的随机整数

Math.round(Math.random());

均衡获取0到9的随机整数

Math.floor(Math.random()*10);

均衡获取0到10的随机整数

Math.round(Math.random()*10); // 其中获取最小值0和最大值10的几率少一半。因为结果在0~0.4 为0,0.5到1.4为1...8.5到9.4为9,9.5到9.9为10。所以头尾的分布区间只有其他数字的一半。

生成[n,m]的随机整数

函数功能:生成[n,m]的随机整数。 在js生成验证码或者随机选中一个选项时很有用

//生成从minNum到maxNum的随机数
function randomNum(minNum,maxNum){
 switch(arguments.length){
 case 1:
 return parseInt(Math.random()*minNum+1,10);
 break;
 case 2:
 return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
 break;
 default:
 return 0;
 break;
 }
}

解析

Math.random() 生成[0,1)的数,所以

Math.random()*5 生成{0,5)的数。

通常期望得到整数,所以要对得到的结果处理一下。

parseInt(),Math.floor(),Math.ceil()和Math.round()都可得到整数。

parseInt()和Math.floor()结果都是向下取整。

所以Math.random()*5生成的都是[0,4]的随机整数。

所以生成[1,max]的随机数,公式如下:

// max - 期望的最大值
parseInt(Math.random()*max,10)+1;
Math.floor(Math.random()*max)+1;
Math.ceil(Math.random()*max);

所以生成[0,max]到任意数的随机数,公式如下:

// max - 期望的最大值
parseInt(Math.random()*(max+1),10);
Math.floor(Math.random()*(max+1));

所以希望生成[min,max]的随机数,公式如下:

// max - 期望的最大值
// min - 期望的最小值
parseInt(Math.random()*(max-min+1)+min,10);
Math.floor(Math.random()*(max-min+1)+min);

3.8抽奖代码

.0版本的时候没有前端页面,会使这个系统看起来很简陋,但由于自己前端水平实在有限,所以在github上找了一个抽奖的前端,直接套用一下。抽奖也改用前端实现,只有抽奖名单和中间名单使用了后台。

跨域处理

引入前端界面的同时,引入了另一个问题:跨域!

什么是跨域呢?

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

简单来说就是当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

origins = [
    "*",
    "http://localhost",
    "http://localhost:8080",
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


新增数据上传接口

新增数据model,中奖描述,还有中奖名单,因为没有其他业务逻辑,这里就直接通过pymysql 插入数据,不做其他的处理了



class Info(BaseModel):
    description: str
    name: str


@app.post("/push/lottery")
async def push_lottery(info: Info):


    db = pymysql.connect(host='localhost', port=3306, user='root', password='root', database='test_data_platform',
                         charset='utf8')
    cursor = db.cursor()
    sql = "INSERT INTO user_info(name,description)values('%s','%s')" % (info.description, info.name.rstrip(','))
    try:
        cursor.execute(sql)
        db.commit()
    except Exception as e:
        db.rollback()
        print("push error:"+e)
    db.close()
    return {"message": "push success"}

前端页面

github代码地址,上面有这个动态效果的源代码https://github.com/fouber/lottery ,将其中的部分代码替换为请求后台数据

member.js

window.member;
$(document).ready(function(){
  $.get("http://127.0.0.1:8000/lottery/employees",function(data,status){
    localStorage.setItem('member', JSON.stringify(data.data));
  });

});

前端显示界面

<!DOCTYPE html>
<html>
<head>
    <meta name="screen-orientation" content="portrait">
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0"/>
    <title>年会抽奖小程序</title>
    <link rel="stylesheet" type="text/css" href="css/reset.css">
    <link rel="stylesheet" type="text/css" href="css/wall.css">
   
</head>
<body>
<div id="main" class="wall">
    <div class="result-btn">
       <a href="./result.html" target="_blank">获奖名单</a>
    </div>
</div>
<div id="result" class="result">
</div>

<div id="tools" class="tools">
       <form-item label="抽奖人数">
        <input type="textarea" v-model="btns"></input>
      </form-item>
    <button
       class="pure-button"
       @click="toggle"
       :class="{'button-secondary': !running,
               'button-success': running}">{{running?'停!':'开始'}}</button>
    <button class="pure-button button-warning" @click="reset">重置</button>
</div>
<script type="text/javascript" src="js/zepto.js"></script>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript" src="js/tagcanvas.js"></script>
<script type="text/javascript" src="js/member.js"></script>
<script type="text/javascript">
    (function(){
        var employees = JSON.parse(localStorage.getItem('member'))
        var choosed = JSON.parse(localStorage.getItem('choosed')) || {};
        // 转动效果
        var speed = function(){
            return [0.1 * Math.random() + 0.01, -(0.1 * Math.random() + 0.01)];
        };
        var getKey = function(item){
            return item.name + '-' + item.phone;
        };
        var createHTML = function(){
            var html = [ '<ul>' ];
                employees.forEach(function(item, index){
                item.index = index;
                var key = getKey(item);
                var color = choosed[key] ? 'yellow' : 'white';
                html.push('<li><a href="#" style="color: ' + color + ';">' + item.name + '</a></li>');
            });
            html.push('</ul>');
            return html.join('');
        };
        var lottery = function(count){
            var list = canvas.getElementsByTagName('a');
            var color = 'yellow';
            var names = "";
            var ret = employees
                .filter(function(m, index){
                    m.index = index;
                    return !choosed[getKey(m)];
                })
                .map(function(m){
                    return Object.assign({
                      score: Math.random()
                    }, m);
                })
                .sort(function(a, b){
                    return a.score - b.score;
                })
                .slice(0, count)
                .map(function(m){
                  choosed[getKey(m)] = 1;
                  list[m.index].style.color = color;
                  names = m.name +","+names
                  return m.name + '<br/>'; 
                });
            localStorage.setItem('choosed', JSON.stringify(choosed));
            var info = {"name":names,"description":"一等奖"}
            $.ajax({
                url:'http://127.0.0.1:8000/push/lottery',
                type:'post',
                dateType:'json',
                headers:{
                    'Content-Type':'application/json'
                },
                data:JSON.stringify(info)
            })
            return ret;
        };
        var canvas = document.createElement('canvas');
        canvas.id = 'myCanvas';
        canvas.width = document.body.offsetWidth;
        canvas.height = document.body.offsetHeight;
        document.getElementById('main').appendChild(canvas);
        new Vue({
            el: '#tools',
            data: {
                selected: 30,
                running: false,
                btns: ''
            },
            mounted () {
                canvas.innerHTML = createHTML();
                TagCanvas.Start('myCanvas', '', {
                    textColour: null,
                    initial: speed(),
                    dragControl: 1,
                    textHeight: 14
                });
            },
            methods: {
                reset: function(){
                    if(confirm('确定要重置么?所有之前的抽奖历史将被清除!')){
                        localStorage.clear();
                        location.reload(true);
                    }
                },

                toggle: function(){
                    if(this.running){
                        TagCanvas.SetSpeed('myCanvas', speed());
                        var ret = lottery(this.btns);
                        if (ret.length === 0) {
                            $('#result').css('display', 'block').html('<span>已抽完</span>');
                            return
                        }
                        $('#result').css('display', 'block').html('<span>' + ret.join('</span><span>') + '</span>');
                        TagCanvas.Reload('myCanvas');
                        setTimeout(function(){
                            localStorage.setItem(new Date().toString(), JSON.stringify(ret));
                            $('#main').addClass('mask');
                        }, 300);
                    } else {
                        $('#result').css('display', 'none');
                        $('#main').removeClass('mask');
                        TagCanvas.SetSpeed('myCanvas', [5, 1]);
                    }
                    this.running = !this.running;
                }
            }
        });
    })();
</script>
</body>
</html>

抽奖效果

抽奖效果

结果记录

上传抽奖记录到数据库

前后端所有代码已上传 https://github.com/627886474/lottery