教师预约系统-源码版

鉴于之前写的博客,很多人都问我源码,再次分享给大家,当时处于初学阶段,代码赘余和不规范蛮多的,多多包涵。
这个是从文件读取数据的,可以自行修改成数据库版本。

# -*- coding: utf-8 -*-
"""
@Time : 2019/12/6 11:52
@Author : Spider fu
@File : paiban.py
"""
import pandas as pd


import time, datetime
today = datetime.date.today()
today_time = datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S")
tomorrow = today + datetime.timedelta(days=1)
after_tomorrow = today + datetime.timedelta(days=2)
"""
8-10
10-12
12-14
14-16
16-18
18-20
20-23
预约最多到第三天
取消预约需要提前一天
超时
"""
import tkinter.messagebox
from tkinter import ttk

from tkinter import *
from tkinter.messagebox import *
import os
import csv
path_data = os.getcwd()
path_order_list = path_data + '/data/order_list.csv'
path_user = path_data + '/data/user.csv'

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)

    order_list = pd.read_csv(path_order_list, header=0, sep=',')
    for order in order_list.values:
        for final in final_list:
            if final[0] == order[0] and final[1] == order[1]:
                final[2] = "已被" + order[2] + "预约"

    return final_list


def order(user_name, choose_day_flag, choose_time, nn):
    flag_a = 1
    panduan_time = re.match("\d*-\d*-\d* ?(\d*):\d*:\d*", str(today_time)).group(1)
    print(panduan_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)
    order_list = pd.read_csv(path_order_list, header=0, sep=',')
    order_error = 0
    for order in order_list.values:
        if order[1] == order_time and order[0] == order_day:
            order_error = 1
    if order_error == 0:
        if choose_day_flag == "今天" and nn < int(panduan_time):
            flag_a = 2
        else:
            f1 = [
                order_day,
            ]
            f2 = [
                order_time,
            ]
            f3 = [
                user_name,
            ]
            dataframe = pd.DataFrame({'order_day': f1, 'order_time': f2, 'user_name': f3})

            # 将DataFrame存储为csv,index表示是否显示行名,default=True
            dataframe.to_csv(path_order_list, mode='a', index=False, sep=',',header=False)
            flag_a = 3
    return flag_a


def quit_order(user_name, choose_day_flag, choose_time):
    # choose_day_flag = input("请输入取消哪一天的预约,今天0,明天1,后天2:")
    choose_day_flag = choose_day_flag
    if choose_day_flag == '今天':
        return 3
    elif choose_day_flag == '明天':
        choose_day = tomorrow
    else:
        choose_day = after_tomorrow
    # choose_time_flag = input("请输入取消预约的时段编号:")

    order_time = str(choose_time)
    order_day = str(choose_day)
    order_list = pd.read_csv(path_order_list, header=0, sep=',')
    order_error = 0
    for order in order_list.values:
        if order[1] == order_time and order[0] == order_day:
            order_error = 1
    if order_error == 1:
        # csv 写入
        f1 = [
            order_day,
        ]
        f2 = [
            order_time,
        ]
        f3 = [
            user_name,
        ]
        dataframe = pd.DataFrame({'order_day': f1, 'order_time': f2, 'user_name': f3})

        # 将DataFrame存储为csv,index表示是否显示行名,default=True
        dataframe.to_csv(path_order_list, mode='a', index=False, sep=',', header=False)
        return 1
    else:
        return 2


def is_name(name, password):
    users = pd.read_csv(path_user, header=0, sep=',')
    flag = 0
    for user in users.values:
        if user[0] == name and str(user[1]) == password:
            flag = 1
            break
    if flag == 1:
        return 1
    else:
        return 0


class MainWindow(Frame):

    # 预约
    def get_num1(self, event=None):
        nn = int(re.match("(\d*):00-.*", self.comboxlist2.get()).group(1))
        flag = order(self.user_name, self.comboxlist1.get(), self.comboxlist2.get(), nn)

        if flag == 3:
            tkinter.messagebox.showinfo("提示", "预约成功")
            self.frame.destroy()
            self.__init__(get_time(), self.user_name, self.password)
        elif flag == 2:
            tkinter.messagebox.showinfo("警告", "已过预约时间")

        else:
            tkinter.messagebox.showinfo("警告", "该时间已有人预约")

    # 取消预约
    def get_num2(self, event=None):
        flag = quit_order(self.user_name, self.comboxlist1.get(), self.comboxlist2.get())
        if flag == 1:
            tkinter.messagebox.showinfo("提示", "取消成功")
            self.frame.destroy()
            self.__init__(get_time(), self.user_name, self.password)
        elif flag == 2:
            tkinter.messagebox.showinfo("提示", "该时间空闲")
        else:
            tkinter.messagebox.showinfo("提示", "请提前一天取消")

    def __init__(self, final_time_list, name, password):

        self.frame = Tk()
        self.frame.title("预约系统")
        self.user_name = name
        self.day = StringVar()
        self.time = StringVar()
        self.password = password
        self.comvalue1 = tkinter.StringVar()  # 窗体自带的文本,新建一个值
        self.comvalue2 = tkinter.StringVar()  # 窗体自带的文本,新建一个值
        # LoginPage.destroy(self)
        # 定义标题
        self.title1 = Label(self.frame, text="北邮实验预约系统")
        self.title1.grid(row=0, column=0, padx=5, pady=5, columnspan=4)

        # 获取当前时间
        self.title2 = Label(self.frame, text="当前北京时间为:" + str(today_time))
        self.title2.grid(row=5, column=3, padx=5, pady=5, columnspan=2)

        # 选择时间
        self.title2 = Label(self.frame, text="选择哪天")
        self.title2.grid(row=1, column=0, padx=5, pady=5, columnspan=2)
        self.title2 = Label(self.frame, text="预约的时段")
        self.title2.grid(row=2, column=0, padx=5, pady=5, columnspan=2)

        # 预约,取消预约,退出,三个按钮
        self.button1 = Button(self.frame, text="预约", width=8, height=1, bg="green")
        self.button2 = Button(self.frame, text="取消预约", width=8, height=1, bg="red")
        self.button3 = Button(self.frame, text="退出", command=self.frame.destroy, width=8, height=1, bg="red")
        self.button1.grid(row=3, column=0, padx=5, pady=1)
        self.button2.grid(row=3, column=1, padx=5, pady=1)
        self.button3.grid(row=3, column=2, padx=5, pady=1, columnspan=2)
        self.button1.bind("<ButtonRelease-1>", self.get_num1) # 绑定函数get_num1
        self.button2.bind("<ButtonRelease-1>", self.get_num2) # 绑定函数get_num2

        # 选择哪一天,下拉列表,默认第一个
        self.comboxlist1 = ttk.Combobox(self.frame, textvariable=self.comvalue1)
        self.comboxlist1['values'] = ("今天", "明天", "后天")
        self.comboxlist1.current(0)
        self.comboxlist1.grid(row=1, column=2, padx=5, pady=5, columnspan=2)

        # 选择时间段,下拉列表,默认第一个
        self.comboxlist2 = ttk.Combobox(self.frame, textvariable=self.comvalue2)
        self.comboxlist2['values'] = (
                "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",
        )
        self.comboxlist2.grid(row=2, column=2, padx=5, pady=5, columnspan=2)
        self.comboxlist2.current(0)

        # 定义所有预定信息表格形式展示
        self.tree = ttk.Treeview(self.frame)  # #创建表格对象
        self.tree["columns"] = (today, tomorrow, after_tomorrow)  # #定义列
        self.tree.column(today, width=100)  # #设置列
        self.tree.column(tomorrow, width=100)
        self.tree.column(after_tomorrow, width=100)
        self.tree.heading(today, text=today)  # #设置显示的表头名
        self.tree.heading(tomorrow, text=tomorrow)
        self.tree.heading(after_tomorrow, text=after_tomorrow)
        self.tree.insert("", 0, text="8:00-10:00", values=(final_time_list[0][2], final_time_list[7][2], final_time_list[14][2]))  # #给第0行添加数据,索引值可重复
        self.tree.insert("", 1, text="10:00-12:00", values=(final_time_list[1][2], final_time_list[8][2], final_time_list[15][2]))
        self.tree.insert("", 2, text="12:00-14:00", values=(final_time_list[2][2], final_time_list[9][2], final_time_list[16][2]))
        self.tree.insert("", 3, text="14:00-16:00", values=(final_time_list[3][2], final_time_list[10][2], final_time_list[17][2]))
        self.tree.insert("", 4, text="16:00-18:00", values=(final_time_list[4][2], final_time_list[11][2], final_time_list[18][2]))
        self.tree.insert("", 5, text="18:00-20:00", values=(final_time_list[5][2], final_time_list[12][2], final_time_list[19][2]))
        self.tree.insert("", 6, text="20:00-23:00", values=(final_time_list[6][2], final_time_list[13][2], final_time_list[20][2]))
        self.tree.grid(row=4, column=0, padx=5, pady=3, columnspan=4)

        self.frame.mainloop()


class LoginPage(Frame):

    def loginCheck(self, event=None):
        name = self.bu1.get()
        secret = self.bu2.get()
        if name == "":
            showinfo(title='错误', message='账号不能为空!')
        elif secret == "":
            showinfo(title='错误', message='密码不能为空!')
        elif is_name(name, secret):
            self.frame.destroy()
            MainWindow(get_time(), name, secret)
        else:
            showinfo(title='错误', message='账号或密码错误!')

    def __init__(self):

        self.frame = Tk()
        self.frame.title('登录')
        self.width = 280
        self.height = 200
        self.screenwidth = self.frame.winfo_screenwidth()
        self.screenheight = self.frame.winfo_screenheight()
        self.alignstr = '%dx%d+%d+%d' % (self.width, self.height, (self.screenwidth - self.width) / 3, (self.screenheight - self.height) / 3)
        self.frame.geometry(self.alignstr)  # 居中对齐

        self.username = StringVar()
        self.password = StringVar()

        self.lable1 = Label(self.frame).grid(row=0, stick=W, pady=10)
        self.lable2 = Label(self.frame, text='账户: ').grid(row=1, stick=W, pady=10)
        self.bu1 = Entry(self.frame, textvariable=self.username)
        self.bu1.grid(row=1, column=1, stick=E)
        self.lable3 = Label(self.frame, text='密码: ').grid(row=2, stick=W, pady=10)
        self.bu2 = Entry(self.frame, textvariable=self.password, show='*')
        self.bu2.grid(row=2, column=1, stick=E)
        self.bu3 = Button(self.frame, text='登陆', command=self.frame.destroy)
        self.bu3.grid(row=3, stick=W, pady=10)
        self.bu3.bind("<ButtonRelease-1>", self.loginCheck)
        self.bu4 = Button(self.frame, text='退出', command=self.frame.quit).grid(row=3, column=1, stick=E)
        self.frame.mainloop()


if __name__ == "__main__":
    LoginPage()














  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程内容主要讲解如下几点:1:如何使用navaicat导入sql2:如何设置网站的的数据库账号等,如何使用iis发布网站3:演示后台管理功能4:如何使用HBuilder X导入app项目,如何设置发布,以及app功能演示 该系统主要分网站管理员、游客、注册用户这几个角色网站管理员系统设置关于我们设置:设置关于我们、联系我们、加入我们、法律声明广告和留言       首页轮播图设置:支持上传轮播图;       留言列表:用户的所有留言信息、支持删除资讯中心       添加资讯:类型、标题、资讯内容等       管理资讯:查看所有资讯列表;支持修改功能;支持删除功能会员管理查看会员信息列表、支持删除功能    查看会员注册时间、手机用户名、姓名、QQ、邮箱、备注等。教室管理       录入教室:选择是上课教室/自习室,录入教室名称和内容(备注不显示)       管理教室:查看后台管理员开放的教室列表;支持修改功能;支持删除功能 教室预约订单管理       教室预约订单列表:查看所有注册的用户的订单信息,包括下单时间,下单用户,用户的手机、姓名、QQ邮箱联系,预约的日期,预约教室名称,预约的哪节课,留言备注信息。       教室预约订单管理:可以修改状态。       状态有:等待审核、拒绝、审核通过游客功能查看平台介绍关于我们、联系我们、加入我们、法律声明资讯中心查看网站的所有资讯列表和详情:通知公告、帮助中心等查看首页广告  查看首页轮播滚动的广告留言反馈给网站管理员留言:主题、联系人、电话、邮箱、内容等查看教室开放信息可以查看已开放教室的所有相关信息:是否已经预约不能进行预约,需要注册登录的用户才可以。 注册用户注册用户除了享有游客的特别功能外,还有一些功能。注册和登录注册功能:填写用户名和密码注册登录:登录后可以享有会员功能。教室预约步骤如下:第一步:通过点击“预约”栏目或进入教室预约页面第二步:选择教室,然后选择需要预约的日期(只开放4天内),点击预约,跳转到提交页面第三步:在提交页面填写联系信息;确认信息后;提交预约,等待后台管理员审核。 我的教室预约可以查看我所有的教室预约订单信息:预约哪个教室预约的哪天、预约的哪节课、预约时候填写的信息。默认提交的教室预约订单信息是“待审核”状态,这个状态的时候可以“取消申请”。后台管理员审核后,状态变更为“已审核”,只能查看不能进行其他操作。 用户信息维护自己的会员信息,包括:头像、姓名、QQ、邮箱、备注等;支持修改功能 密码修改和退出登录密码修改:修改自己的密码退出登录:清除登录的cookie、跳转到首页
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值