龙空技术网

年会抽奖2.0系统

大佬喝可乐 2149

前言:

目前你们对“css抽奖”大概比较着重,各位老铁们都想要学习一些“css抽奖”的相关知识。那么小编也在网络上收集了一些对于“css抽奖””的相关资讯,希望大家能喜欢,小伙伴们快快来了解一下吧!

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

跨域处理

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

什么是跨域呢?

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

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

origins = [    "*",    ";,    ";,]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代码地址,上面有这个动态效果的源代码 ,将其中的部分代码替换为请求后台数据

member.js

window.member;$(document).ready(function(){  $.get(";,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:';,                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>
抽奖效果

抽奖效果

结果记录

上传抽奖记录到数据库

前后端所有代码已上传

标签: #css抽奖