年底了,又到了一年一度咸鱼转卖年会奖品的好时节,对于年会没有中大奖的我来说,心里自然是愤愤不平。说起来工作这么长时间,就没有中过大奖,基本就是阳关普照。所以突发奇想,自己动手来写一个小小的抽奖系统吧
技术选型
因为是个小项目,而且娱乐为主,开发速度当然是最重要的,再加上自己有段时间没有用python了,所以我们就用python来完成吧。
- Python3.7
- fastapi
因为目前没有其他数据的需求,我们就用excel来存储抽奖名单吧,后期再改用其他的方式吧!
模拟数据
python 有个faker包,专门用来模拟测试数据的,使用起来也非常简单,这里我们用它来生成中文名字用来做抽奖员工
if __name__ == "__main__":
from faker import Faker
f = Faker(locale='zh_CN')
name_list = []
for i in range(100):
name_list.append(f.name())
for i in range(100):
excel_write(name_list)
生成员工如下
随机选取员工
要不说python 快呢,随机抽取员工也是一个random包就能搞定
import random
# 随机选取员工
def random_employees(lists, nums):
employees_list = random.sample(lists, nums)
return employees_list
其中lists 就是从excel中读取的员工列表数据,而nums 就是抽取的员工数
已中奖的不能再参加抽奖
年会抽奖的规则一般都是如果你已经中了一次,后面的奖项自然与你无缘。所以我以往参加年会的时候不到最后一刻,我都以为自己是大奖,最后获得个阳光普照。。。。
这里的逻辑我们先需要通过openpyxl来获取和删除数据
from openpyxl import load_workbook, Workbook
file = "/Users/le/Documents/pyproject/lottery/utils/抽奖员工.xlsx"
class ExcelUtils:
def __init__(self):
self.file = file
self.wb = load_workbook(self.file)
self.ws = self.wb['Sheet']
def excel_read(self):
lists = []
print(self.ws.max_row)
# 遍历excel中数据
for i in range(1, self.ws.max_row + 1):
name = self.ws.cell(i, 1).value
lists.append(name)
return lists
# 通过值获取行数
# 通过值获取行数
def get_cell_row(self, cell_value):
lists = []
for i in range(1, self.ws.max_row + 1):
name = self.ws.cell(i, 1).value
for value in cell_value:
if name == value:
lists.append(i)
return lists
# 删除一行
def delete_row(self, which_rows):
for i in which_rows:
self.ws.delete_rows(int(i))
self.wb.save(self.file)
然后我们再取消已中间员工的抽奖名单
# 已获奖的员工不能再抽奖
def del_employees(list_employees):
utils = ExcelUtils()
list_had_lottery = utils.get_cell_row(list_employees)
try:
utils.delete_row(list_had_lottery)
except Exception as e:
print("删除数据失败 :{}".format(e))
启动项目
打开官方文档,查看示例
@app.get("/lottery/{id}/{nums}")
async def lottery(nums):
lists = ExcelUtils().excel_read()
employees_list = employess.random_employees(lists, int(nums))
# 删除已中奖的员工
employess.del_employees(employees_list)
return employees_list
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8000)
我们将id 的意思为几等奖,nums 为抽取的人数
启动项目后我们来抽奖
3等奖抽10个
这时我们的excel 中会删除10个员工,剩下90个
然后我们直接抽2等奖5个
剩余85人参与1等奖的瓜分
项目总结
如果真的只拿这个东西去抽奖那可是太简陋了,年会抽奖玩的是气氛,前端要有动效,有音效才刺激。如果真要我写年会抽奖项目,我肯定要往代码里面"下毒",我必须要拿个大奖啊!我的好伙伴 二狗子们,必须榜上有名啊!
先将项目上传,后面慢慢整活。。。
https://github.com/627886474/lottery