图书馆志愿者值班管理系统:请假、换班、调班一键搞定

引言

作为图书馆管理者,你是否经常为管理志愿者值班而头疼?遇到有人请假、换班,你需要手动修改值班表,并且需要审批他们的请求。这不仅费时费力,还容易出错。

现在,你可以使用Python开发一个便捷的图书馆志愿者值班管理系统,轻松解决这些问题!

系统功能

  • **导入日常值班表:**直接将你的值班表(表格格式)导入系统,无需手动录入。
  • **请假:**志愿者可申请请假,管理者审批通过后自动更新值班表。
  • **换班:**志愿者可申请与其他人换班,管理者审批通过后自动更新值班表。
  • **调班:**管理者可根据需要调整志愿者的值班日期。
  • **审批流程:**所有请假、换班、调班请求都需要经过管理者审批,确保值班安排的合理性。

技术实现

本系统使用Python语言开发,主要依赖以下库:

  • **pandas:**用于读取和处理 Excel 表格数据。
  • **numpy:**用于数据处理和计算。
  • **tkinter:**用于创建用户界面。
  • **sqlite3:**用于创建和管理数据库。

安装第三方库

pip install pandas numpy tkinter sqlite3

创建数据库

import sqlite3

conn = sqlite3.connect('duty.db')  # 创建名为 'duty.db' 的数据库文件
cursor = conn.cursor()

cursor.execute('''CREATE TABLE duty_table
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                  name TEXT,
                  date TEXT,
                  time TEXT,
                  reason TEXT,
                  status TEXT)''')  # 创建名为 'duty_table' 的表格

conn.commit()
conn.close()

导入日常值班表

import pandas as pd
import sqlite3

conn = sqlite3.connect('duty.db')
cursor = conn.cursor()

df = pd.read_excel('duty_schedule.xlsx')  # 读取名为 'duty_schedule.xlsx' 的 Excel 表格

for index, row in df.iterrows():
    name = row['姓名']
    date = row['日期']
    time = row['时间']
    reason = ''
    status = '待审核'
    cursor.execute('INSERT INTO duty_table (name, date, time, reason, status) VALUES (?, ?, ?, ?, ?)', (name, date, time, reason, status))

conn.commit()
conn.close()

实现功能函数

  • 值班操作:
import tkinter as tk
import sqlite3

def add_duty(name, date, time):
    conn = sqlite3.connect('duty.db')
    cursor = conn.cursor()
    reason = ''
    status = '待审核'
    cursor.execute('INSERT INTO duty_table (name, date, time, reason, status) VALUES (?, ?, ?, ?, ?)', (name, date, time, reason, status))
    conn.commit()
    conn.close()

def duty():
    def submit():
        name = name_entry.get()
        date = date_entry.get()
        time = time_entry.get()
        add_duty(name, date, time)
        duty_window.destroy()

    duty_window = tk.Toplevel()
    duty_window.title('值班')
    name_label = tk.Label(duty_window, text='姓名:')
    name_label.grid(row=0, column=0)
    name_entry = tk.Entry(duty_window)
    name_entry.grid(row=0, column=1)
    date_label = tk.Label(duty_window, text='日期:')
    date_label.grid(row=1, column=0)
    date_entry = tk.Entry(duty_window)
    date_entry.grid(row=1, column=1)
    time_label = tk.Label(duty_window, text='时间:')
    time_label.grid(row=2, column=0)
    time_entry = tk.Entry(duty_window)
    time_entry.grid(row=2, column=1)
    submit_button = tk.Button(duty_window, text='提交', command=submit)
    submit_button.grid(row=3, column=1)

  • 请假操作:
def ask_leave(id, reason):
    conn = sqlite3.connect('duty.db')
    cursor = conn.cursor()
    cursor.execute('UPDATE duty_table SET reason=?, status=? WHERE id=?', (reason, '待审核', id))
    conn.commit()
    conn.close()

def leave():
    def submit():
        index = listbox.curselection()
        if len(index) > 0:
            id = int(listbox.get(index[0]).split()[0])
            reason = reason_entry.get()
            ask_leave(id, reason)
            leave_window.destroy()

    conn = sqlite3.connect('duty.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM duty_table WHERE status='已通过' OR status='待审核'')
    rows = cursor.fetchall()

    leave_window = tk.Toplevel()
    leave_window.title('请假')
    listbox = tk.Listbox(leave_window)
    for row in rows:
        listbox.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
    listbox.pack()
    reason_label = tk.Label(leave_window, text='请假原因:')
    reason_label.pack()
    reason_entry = tk.Entry(leave_window)
    reason_entry.pack()
    submit_button = tk.Button(leave_window, text='提交', command=submit)
    submit_button.pack()

    conn.close()
  • 换班操作:
def change(id1, id2):
    conn = sqlite3.connect('duty.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM duty_table WHERE id=?', (id1,))
    row1 = cursor.fetchone()
    cursor.execute('SELECT * FROM duty_table WHERE id=?', (id2,))
    row2 = cursor.fetchone()
    cursor.execute('UPDATE duty_table SET name=?, date=?, time=? WHERE id=?', (row2[1], row2[2], row2[3], row1[0]))
    cursor.execute('UPDATE duty_table SET name=?, date=?, time=? WHERE id=?', (row1[1], row1[2], row1[3], row2[0]))
    conn.commit()
    conn.close()

def change_duty():
    def submit():
        index1 = listbox1.curselection()
        index2 = listbox2.curselection()
        if len(index1) > 0 and len(index2) > 0:
            id1 = int(listbox1.get(index1[0]).split()[0])
            id2 = int(listbox2.get(index2[0]).split()[0])
            change(id1, id2)
            change_window.destroy()

    conn = sqlite3.connect('duty.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM duty_table WHERE status='已通过'')
    rows = cursor.fetchall()

    change_window = tk.Toplevel()
    change_window.title('换班')
    label1 = tk.Label(change_window, text='选择值班人员1:')
    label1.grid(row=0, column=0)
    listbox1 = tk.Listbox(change_window)
    for row in rows:
        listbox1.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
    listbox1.grid(row=1, column=0)
    label2 = tk.Label(change_window, text='选择值班人员2:')
    label2.grid(row=0, column=1)
    listbox2 = tk.Listbox(change_window)
    for row in rows:
        listbox2.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
    listbox2.grid(row=1, column=1)
    submit_button = tk.Button(change_window, text='提交', command=submit)
    submit_button.grid(row=2, column=1)

    conn.close()
  • 调班操作:
def adjust(id1, id2):
    conn = sqlite3.connect('duty.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM duty_table WHERE id=?', (id1,))
    row1 = cursor.fetchone()
    cursor.execute('SELECT * FROM duty_table WHERE id=?', (id2,))
    row2 = cursor.fetchone()
    cursor.execute('UPDATE duty_table SET date=? WHERE id=?', (row2[2], row1[0]))
    cursor.execute('UPDATE duty_table SET date=? WHERE id=?', (row1[2], row2[0]))
    conn.commit()
    conn.close()

def adjust_duty():
    def submit():
        index1 = listbox1.curselection()
        index2 = listbox2.curselection()
        if len(index1) > 0 and len(index2) > 0:
            id1 = int(listbox1.get(index1[0]).split()[0])
            id2 = int(listbox2.get(index2[0]).split()[0])
            adjust(id1, id2)
            adjust_window.destroy()

    conn = sqlite3.connect('duty.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM duty_table WHERE status='已通过'')
    rows = cursor.fetchall()

    adjust_window = tk.Toplevel()
    adjust_window.title('调班')
    label1 = tk.Label(adjust_window, text='选择值班人员1:')
    label1.grid(row=0, column=0)
    listbox1 = tk.Listbox(adjust_window)
    for row in rows:
        listbox1.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
    listbox1.grid(row=1, column=0)
    label2 = tk.Label(adjust_window, text='选择值班人员2:')
    label2.grid(row=0, column=1)
    listbox2 = tk.Listbox(adjust_window)
    for row in rows:
        listbox2.insert(tk.END, '{} {} {} {}'.format(row[0], row[1], row[2], row[3]))
    listbox2.grid(row=1, column=1)
    submit_button = tk.Button(adjust_window, text='提交', command=submit)
    submit_button.grid(row=2, column=1)

    conn.close()

总结

以上代码实现了一个简单的图书馆志愿者值班管理系统,可以帮助你更高效地管理志愿者值班。你可以在此基础上进一步完善系统功能,例如添加用户登录、权限管理、邮件通知等功能,使其更加完善和实用。

提示:

  • 你需要根据自己的实际情况调整代码中的数据库文件名、表格名和Excel文件名。
  • 你可以将以上代码整合到一个Python文件中,并运行它。
  • 建议你使用一个支持Python的集成开发环境(IDE)进行代码开发,它可以提供代码提示、调试等功能,方便你进行代码开发。
图书馆志愿者值班管理系统:请假、换班、调班一键搞定

原文地址: https://www.cveoy.top/t/topic/npvB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录