使用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()
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 >
中间页面略过…
感谢你的浏览~
不要完全盗用哦~