图书馆志愿者值班管理系统:请假、换班、调班一键搞定
图书馆志愿者值班管理系统:请假、换班、调班一键搞定
引言
作为图书馆管理者,你是否经常为管理志愿者值班而头疼?遇到有人请假、换班,你需要手动修改值班表,并且需要审批他们的请求。这不仅费时费力,还容易出错。
现在,你可以使用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 著作权归作者所有。请勿转载和采集!