教室预约系统

最近写了一个这篇文章的续,做了一些改动,分享一些资源,有兴趣的朋友可以看看

前言

上个月,朋友的学校需要做实验,实验器材是固定的,因此为了避免做实验冲突,需要提前预约,他们是采用人工用Excel表格的方式,我看了一下需求,做了一个简单的 教室预约软件,实现了需求。

需求

提出的需求,大概有以下几点:

  1. 每天从8点开始,23点结束,每两个小时为一个时间段,最后一个时间段为3个小时;
  2. 最多只能预约三天后的时间;
  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元,比官网还便宜!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fuzizhu1/article/details/103580128