python和tornado写活动抽奖程序

2 篇文章 0 订阅
1 篇文章 0 订阅

使用python和tornado写 活动抽奖小程序

-------------------不要完全盗用哦~----------------------
建议先了解基础知识:
1.python
2.tonado
3.numpy
4.Visual Studio Code编程环境

  • 实验设计(包括项目结构、方案简要说明等)(1) 项目结构:项目结构包括后端处理函数index1.py辅助处理函数draw.py,templates文件(包含各种html文件),static文件(包含图片(没用到js和css文件))
  • (1) 方案简要说明:·后端处理函数:index1.py,用于处理前端获得的数据并且处理后传入前端。·辅助函数:draw.py,获取参与人员信息,进行处理。·各种页面1) 抽奖页面:抽奖页面设置获取设置信息2) 抽奖结果页面:通过获取从抽奖设置页面输入的信息,处理之后进行抽奖,将抽奖结果显示出来。结果页面分为三次,从三等奖开始,然后二等奖,一等奖,最后将所有结果一起显示。出错页面:如果输入的参与人员名单少于抽奖人数,将会触发出错页面,然后重新跳转到抽奖设置页面。
  • 代码:
    index1.py
import json
import tornado.web
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import tornado.options
from uuid import uuid4
import time
import numpy as np

np.random.seed(1234)
from draw import get_draw, get_members

price_size = {"1": 1, "2": 1, "3": 1}  # 保存抽奖人数,有默认值

choiced = []
times = {'times': 3}


class Getsetting(tornado.web.RequestHandler):
    '''
    抽奖:
    进入抽奖设置页面;
    获得参与人员;
    判断参与人员和中奖人数是否符合;
    '''

    def get(self):
        # 进入设置页面
        self.render(
            "index1.html",
            page_title="Price Draw Activity!",
        )

    # 获得抽奖设置信息
    def post(self):
        num1 = self.get_argument('num1', price_size["1"])
        num2 = self.get_argument('num2', price_size["2"])
        num3 = self.get_argument('num3', price_size["3"])
        # member_str=self.get_argument("members")

        price_size["1"] = int(num1) if num1 else 1
        price_size["2"] = int(num2) if num2 else 1
        price_size["3"] = int(num3) if num3 else 1
        self.redirect('/getmembers')


class memberHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.render(
            'getmembers.html',

        )

    def post(self, *args, **kwargs):
        member_str = self.get_argument("members")
        members = get_members(member_str)
        members_draws, flag = get_draw(members, price_size)
        if flag == False:
            self.render(
                'error.html'
            )
        else:
            # choiced=members_draws
            for i in members_draws:
                choiced.append(i)
            self.render('start.html',
                        num1=price_size['1'],
                        num2=price_size['2'],
                        num3=price_size['3'],
                        members_draws=members_draws,
                        )


class StartPrice(tornado.web.RequestHandler):
    # 获得抽奖结果
    def get(self, *args, **kwargs):
        price_num = self.get_argument('next')
        if price_num == 'finish':
            self.render(
                'allresult.html',
                choiced=choiced,
            )
        else:
            price_num = int(price_num)
            if price_num == 3:
                self.render(
                    'result.html',
                    info={
                        'price_num': '三等奖',
                        'price_mem': choiced[2],
                        'next': '2',
                        'inf': '抽取二等奖',
                    },
                )
            if price_num == 2:
                self.render(
                    'result.html',
                    info={
                        'price_num': '二等奖',
                        'price_mem': choiced[1],
                        'next': '1',
                        'inf': '抽取一等奖',
                    },
                )

            if price_num == 1:
                self.render(
                    'result.html',
                    info={
                        'price_num': '一等奖',
                        'price_mem': choiced[0],
                        'next': 'finish',
                        'inf': '抽奖结束',
                    },
                )


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/', Getsetting),
            (r'/getmembers', memberHandler),
            (r'/result/', StartPrice),
        ]

        settings = {
            'template_path': 'templates',
            'static_path': 'static',
        }

        tornado.web.Application.__init__(self, handlers, **settings)


if __name__ == "__main__":
    tornado.options.parse_command_line()
    server = tornado.httpserver.HTTPServer(Application())
    server.listen(8000)  # 监听端口
    tornado.ioloop.IOLoop.instance().start()

draw.py

 import numpy as np 
import random
import time

np.random.seed(1234)

def get_members(str_members):
    strlist=str_members.split()
    members=[]
    for mem in strlist:
        if mem not in [' ','\n']:
            members.append(mem.strip())
    return members

def get_draw(member_list,price_size):
    n=len(member_list)
    if n<sum(list(price_size.values())):
        flag=False
        return  None,flag
    draw_all=[]
    random_index=list(range(n))
    for i in range(3):
        price_n=int(price_size[str(i+1)])
        int_list=np.random.choice(random_index,price_n,False)
        draw_mem=[]
        for id in int_list:
            draw_mem.append(member_list[id])
            random_index.remove(id)
        draw_all.append(draw_mem)
    return draw_all,True
 

--------------------index1.html---------------------

        <!DOCTYPE html>
        <html>
            <meta charset="utf-8">
            <head><title>设置中奖人数</title></head>
              
     <body style="background-color: rgb(215, 245, 215)" background="/static/b.jpg">
        <center>
        <h1><font style="color:black">奖项设置</font></h1>
        <form method="POST",action="/index1">
        <p><font style="color:black">设置一等奖获奖人数:</font><br><input type="text" name="num1"></p>
        <p><font style="color:black">设置二等奖获奖人数:</font><br><input type="text" name="num2"></p>
        <p><font style="color:black">设置三等奖获奖人数:</font><br><input type="text" name="num3"></p>

        <input type="submit" value="提交名单">
        </form>
        </center>
    </body>
</html> 

-----------------------start.html---------------------

<!DOCTYPE html>
<html>
    <meta charset="utf-8">
    <head><title>设置中奖人数</title></head>
    <body style="background-color: rgb(215, 245, 215)" background="/static/b.jpg">
        <center>
            <h1>确认抽奖人数</h1>
            <p><font s-tyle="color:black">一等奖获奖人数:{{num1}}</font></p>
            <p><font style="color:black">二等奖获奖人数:{{num2}}</font></p>
            <p><font style="color:black">三等奖获奖人数:{{num3}}</font></p>
            <a href="/result/?next=3">确认请开始抽奖</a>
        </center>
    </body>
</html>  

-------------------getmembers.html ----------------------------
<!DOCTYPE html>
<html>
    <meta charset="utf-8">
    <head><title>设置中奖人数</title></head>
    <body style="background-color: rgb(215, 245, 215)" background="/static/b.jpg">
        <form method="POST" action="/getmembers">
        <center>
        <h1><font style="color:black">参与人员设置</font></h1>
        <h4><font style="color:black">请输出抽奖名单(每输入一个名单空格或换行)</font></h4>
        <textarea rows="18" cols="20" name="members" style="opacity: 0.8;"></textarea>
    <br>
        <input type="submit" value="提交名单">
    </form>
        </center>
    </body>
</html> 

---------------------result.html ---------------------

<!DOCTYPE html>
<html>
    <meta charset="utf-8">
    <head>
        <title>抽奖</title>
    </head>

    <body style="background-color: rgb(223, 128, 231)" background="/static/w.jpg">

        <center>
        <h1><font style="color:black">抽奖结果</font></h1>
        <p2 style="color: #f10707">恭喜以下中奖名单!</p2>
        <h4><font style="color:black">{{info['price_num']}}</font></h4>
            {% for i,p in enumerate(info['price_mem'])%}
                {{p}}<br>
                {% end %}
        <br>
        <a href="/result/?next={{info['next']}}">{{info['inf']}}</a>
        </form>
</center>
    </body>
</html> 

---------------allresult.html ----------------

< !DOCTYPE
html >
< html >
< meta
charset = "utf-8" >

< head > < title > 所有结果 < / title > < / head >

< body
style = "color: rgbrgb(223, 128, 231)"
background = "/static/b.jpg" >
< center >
< h1 > 结果显示 < / h1 >
< p > < font
style = "color: red" > 恭喜以下获奖名单 < / font > < / p >
< p > 一等奖:
{ %
for p in choiced[0] %}
{{p}}
{ % end
for %}
< / p >
< p > 二等奖:
{ %
for p in choiced[1] %}
{{p}}
{ % end
for %}
< / p >
< p > 三等奖:
{ %
for p in choiced[2] %}
{{p}}
{ % end
for %}
< / p >
< / center >
< / body >
< / html >

-------------------------error.html-----------------------

< !DOCTYPE
html >
< html >
< meta
charset = "utf-8" >
< meta
http - equiv = "refresh"
content = "3;url=/" >
< head > < title > error! < / title > < / head >

< body
style = "color: rgbrgb(223, 128, 231)"
background = "/static/b.jpg" >
< center >
< br >
< img
src = "/static/8.gif"
alt = "出错了" / >
< title > 出错了》~《 < / title >
< p
style = "color:rgb(238, 23, 23)" > {{error}} < / p >
< br >
< font
style = "color:black" > 请重新设置名单!将重新跳转到设置主页面 < / font >

< / form >
< / center >
< / body >
< / html >

在这里插入图片描述
中间页面略过…

感谢你的浏览~
不要完全盗用哦~

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值