最近写了一个这篇文章的续,做了一些改动,分享一些资源,有兴趣的朋友可以看看
前言
上个月,朋友的学校需要做实验,实验器材是固定的,因此为了避免做实验冲突,需要提前预约,他们是采用人工用Excel表格的方式,我看了一下需求,做了一个简单的 教室预约软件,实现了需求。
需求
提出的需求,大概有以下几点:
- 每天从8点开始,23点结束,每两个小时为一个时间段,最后一个时间段为3个小时;
- 最多只能预约三天后的时间;
- 可以取消预约;
思路
首先,对需求进行分析,实现相应的功能;
然后,对代码进行封装,形成exe可执行文件;
最后对功能以及其他发面进行优化
需求分析,以及对应功能的实现
在预约时,可预约的时间段为:
8-10
10-12
12-14
14-16
16-18
18-20
20-23
这七个时间段,
预约可以预约三天之内的,也就是说不止需要时间段,还需要对应的是哪一天。
这里的哪一天必须取具体日期,不能简单的取“今天”,“明天”,“后天”,因为哪一天去预约时不一定的。
因此,每一次预约时,系统必须获取到当时的北京时间,根据当时的北京时间来计算后三天的时间
import time, datetime
today = datetime.date.today()
tomorrow = today + datetime.timedelta(days=1)
after_tomorrow = today + datetime.timedelta(days=2)
分别得到当前时间,第二天时间,第三天时间
如果预约成功,我们就在数据库插入预约的信息,为了能够区分每个人的预约,设计数据库时,至少设计两个字段,一个时预约的时哪一天,另一个时哪一个时段,这样,每一次预约玩以后在查询数据库时,我们就可以判断该时间段是否已经被预约。
在这里,我的数据库设计了三个字段,除了上面说的两个还加了一个用户的名字,之后我们就可以实现预约的代码了,实现预约的函数如下:
def order(user_name, choose_day_flag, choose_time):
if choose_day_flag == '今天':
choose_day = today
elif choose_day_flag == '明天':
choose_day = tomorrow
else:
choose_day = after_tomorrow
order_time = str(choose_time)
order_day = str(choose_day)
conn1 = MySQLdb.connect('***.***.***.***', '***', '****', '****', charset="utf8", use_unicode=True)
cur1 = conn1.cursor()
cur1.execute("SELECT * FROM `order_list` ")
result1 = cur1.fetchall()
order_error = 0
for result in result1:
if result[1] == order_time and result[0] == order_day:
order_error = 1
return 0
if order_error == 0:
inset_sql = """
INSERT INTO order_list(order_day, order_time,user)
VALUES (%s, %s, %s)
"""
conn2 = MySQLdb.connect('***.***.***.***', '***', '****', '****', charset="utf8", use_unicode=True)
cur2 = conn2.cursor()
cur2.execute(inset_sql, (order_day, order_time, user_name))
conn2.commit()
return 1
链接数据库的几个参数分别为"ip地址",“用户名”,“密码”,“数据库名”,这里改成自己的就好了,为了隐私,这里我就用*代替了。
这里实现的就是预约功能,如果数据库没有所选择的时间,则插入,并且函数返回1,预约成功;
如果数据库有所选择的时间,则不插入,并且函数返回0,也就是预约失败
同理,取消预约的代码如下:
def quit_order(user_name, choose_day_flag, choose_time):
choose_day_flag = choose_day_flag
if choose_day_flag == '今天':
choose_day = today
elif choose_day_flag == '明天':
choose_day = tomorrow
else:
choose_day = after_tomorrow
order_time = str(choose_time)
order_day = str(choose_day)
inset_sql = """
delete from order_list
where order_day=%s and order_time=%s and user=%s;
"""
conn2 = MySQLdb.connect('***.***.***.***', '***', '****', '****', charset="utf8", use_unicode=True)
cur2 = conn2.cursor()
cur2.execute(inset_sql, (order_day, order_time,user_name))
conn2.commit()
这里就是将所选择的时间从数据库中删除,至此,功能已经基本实现。
接下来将代码进行简单的封装
封装
封装我才用的时Tkinter这个包,
Python GUI编程(Tkinter)这个网站有相应的用法。
在封装时主要注意以下几点:
1、需要两个文本框,一个输入用户名,一个输入密码,避免可以修改他人的预订信息,这里如何实现放在后面说
2、需要两个下拉列表,一个选择预约哪一天,另一个选择预约的时段。当然,你设计成文本框或者是按钮也都可以,我感觉还是下拉列表好一些
3、需要两个按钮,一个用来预约,另一个用来取消。其他设计也都无所谓。
4、展示一个表格,类似课程表,行为时间段,列为哪一天,如果对应的那个位置有人预约就显示占用,没有人预约就显示空闲,从而方便用户可以直接看出哪一天的时间是空闲的,这个方法在后面再说怎么实现。
优化
用户名密码的实现
设计一个表,保存用户名和密码,然后可以填写一些账号和密码,保存下来
每次预约时判断用户名和密码是否是数据库中保存的账号密码,如果不是,则弹窗,用户名,密码不正确
def is_name(name,password):
conn1 = MySQLdb.connect('***.***.***.***', '***', '****', '****', charset="utf8", use_unicode=True)
cur1 = conn1.cursor()
cur1.execute("SELECT * FROM `order_user` ")
result1 = cur1.fetchall()
flag = 0
for result in result1:
if result[0] == name and result[1] == password:
flag = 1
break
if flag == 1:
return 1
else:
return 0
如果正确返回1,错误返回0,跟按钮绑定起来即可。
展示各个时段是否被占用的表格
def get_time():
day_list = [
str(today),
str(tomorrow),
str(after_tomorrow),
]
time_list = [
"8:00-10:00",
"10:00-12:00",
"12:00-14:00",
"14:00-16:00",
"16:00-18:00",
"18:00-20:00",
"20:00-23:00",
]
final_list = []
for one_day in day_list:
for one_time in time_list:
final_time = []
final_time.append(one_day)
final_time.append(one_time)
final_time.append("空闲")
final_list.append(final_time)
# list.remove(obj)
conn1 = MySQLdb.connect('***.***.***.***', '***', '****', '****', charset="utf8", use_unicode=True)
cur1 = conn1.cursor()
cur1.execute("SELECT * FROM `order_list` ")
result1 = cur1.fetchall()
for result in result1:
for final in final_list:
if final[0] == result[0] and final[1] == result[1]:
final[2] = "已被" + result[2] + "预约"
return final_list
上述代码,返回一个list,将list按照行列的形式显示出来即可。
打包成exe
因为只有一个py文件打包起来比较容易,直接cmd打开命令行,用“cd”命令切换到py文件所在的根目录下,执行命令
pyinstaller.exe -F wenjian.py
执行完命令后,根目录下会生成一个文件,两个文件夹,打开名为“dist”的文件夹,里面就是打包后的exe,复制,粘贴到任意位置,都可以直接直接执行。
如果你想重新自己定义一个图标,可以用如下命令
pyinstaller.exe -F -i tubiao.ico wenjian.py
图标的后缀名为ico,免费在线设计制作Logo,这个网址有很多图标,你也可以自己制作,放在根目录下。
后记
这个项目,只是突然觉得有想法,大概花了半天的时间做的,有很多可以改进的地方。
如果后续有时间,可能会写一个管理的软件,用来发放账号等功能
安利一门Python超级好课!
扫码下单输优惠码【csdnfxzs】再减5元,比官网还便宜!