文章目录
第一部分 需求分析
1.1 问题背景
随着办公智能化的发展,为方便对大学生宿舍的动态管理,宿舍管理系统储存了每个宿舍学生的基本个人信息,同时需要针对一些特殊情况,如转专业、退学等,对宿舍的信息实现动态调整,支持显示、增加、删除、修改、查询成员信息,从而实现宿舍管理员对学生宿舍更有效的统一管理。
1.2 功能需求
设计一个学生宿舍管理系统,实现对学生基本个人信息(姓名、学号、班级、学院、宿舍号、床位号)的录入、添加、删除、修改、查询以及显示功能,能够读取并保存数据至Excel文件中。
需要采集的学生数据如下(以下信息均为虚构):
姓名 | 学号 | 班级 | 学院 | 宿舍号 | 床位号 | 电话号码 |
---|---|---|---|---|---|---|
张三 | 21110801 | 8班 | 管理学院 | 303 | 1 | 18811223344 |
李四 | 21110802 | 8班 | 管理学院 | 303 | 2 | 13599006666 |
钱五 | 21110803 | 8班 | 管理学院 | 303 | 3 | 15544789022 |
王柳 | 21110804 | 8班 | 管理学院 | 303 | 4 | 13855667799 |
肖明 | 21110805 | 8班 | 管理学院 | 303 | 5 | 15811332244 |
黄莉 | 21110901 | 9班 | 管理学院 | 401 | 1 | 18900551177 |
刘茜 | 21110902 | 9班 | 管理学院 | 401 | 2 | 13366554411 |
程星 | 21110903 | 9班 | 管理学院 | 401 | 3 | 13611335577 |
林霞 | 21110904 | 9班 | 管理学院 | 401 | 4 | 18500998833 |
宋慧 | 21110905 | 9班 | 管理学院 | 401 | 5 | 13411662299 |
薛杰 | 21010101 | 1班 | 通信学院 | 202 | 1 | 13888851111 |
杨旭 | 21010102 | 1班 | 通信学院 | 202 | 2 | 15822225555 |
徐宇 | 21010103 | 1班 | 通信学院 | 202 | 3 | 18544448888 |
杨璐 | 21020501 | 5班 | 经济学院 | 205 | 1 | 15755880901 |
周怡 | 21020502 | 5班 | 经济学院 | 205 | 2 | 13266670835 |
朱悦 | 21020503 | 5班 | 经济学院 | 205 | 5 | 15552344777 |
第二部分 程序设计
可将宿舍管理系统分为10个模块:密码登录模块(log_in)、主菜单模块(menu)、文件创建模块(setup_workbook)、数据处理模块(some_operations)、添加信息模块(add_information)、删除信息模块(del_information)、修改信息模块(modify_information)、二级菜单模块(show_pattern)、查询信息模块(search_information)、显示信息模块(display_all)。
2.1 功能设计
① 添加功能:添加一条完整的学生信息并保存到Excel文件中。
② 删除功能:搜索学生姓名并删除该生的信息。
③ 修改功能:搜索学生姓名和需要修改的关键字并修改。
④ 查询功能:通过关键字查询相关词条信息。
⑤ 表格排序:实现每个学生信息按宿舍号从小到大自动排序。
⑥ 表格格式调整:实现在Excel表格美观打印。
2.2 界面设计
如下图1、图2、图3、图4所示:
① 登录界面
② 主菜单界面
③ 子菜单界面
④ 退出界面
2.3 代码结构设计
如下图5所示:
2.4 数据存储设计
引入openpyxl 模块,通过Workbook函数新建一个Excel文件,Workbook.active函数锁定当前工作簿,进行对当前工作簿的增、删、改等操作后,再通过Workbook.save函数将数据存储在Excel文件中。如下图6所示:
第三部分 程序开发
3.1 密码登录模块
定义一个密码登录函数,显示登录界面,输入相应的账号和密码,每次只能有三次输入机会,如果三次输入不正确则登录失败,重新进入登录界面;如果三次机会内输入账号、密码正确,则登陆成功。调用time模块的sleep函数来调整程序调用函数的时间来模拟登录加载的过程。
3.1.1 程序流程图
如下图7所示:
3.1.2 密码登录程序代码
密码登录代码源程序(D:\pythonProject\宿舍管理系统\log_in.py)
#!/usr/bin/evn python
# coding: gbk
import time
# 密码登录界面
def LogIn():
user = 'admin'
password = '12345'
Time = 3
print('>>>>>欢迎使用登录界面<<<<<')
while Time:
name = input('请输入帐号名称:').lower()
if name == user:
while Time:
register = input('请输入账号密码:')
if register == password:
print('密码正确!')
time.sleep(1)
print('正在登录...')
time.sleep(2)
print('登录成功!')
time.sleep(0.5)
return
else:
Time -= 1
if Time == 0:
print('登录失败')
else:
print(f'密码错误,还有{Time}次机会')
else:
Time -= 1
if Time == 0:
print('登陆失败')
else:
print(f'账号错误,还有{Time}次机会')
time.sleep(0.5)
return LogIn()
3.2 主菜单模块
设计一个menu模块包含了主菜单显示函数,显示0-5的选项包括了增、删、改、查、退出等功能;同时还包含了main函数来调用所有模块的函数。
3.2.1 程序流程图
如下图8所示:
3.2.2 主菜单程序代码
#!/usr/bin/evn python
# coding: gbk
# 宿舍管理系统主菜单界面
import time
import add_information
import modify_information
import del_information
import search_information
import display_all
import log_in
# 主菜单界面
def Menu():
print('+', '——' * 20, '+')
for i in range(10):
if i == 0:
print('|', '=' * 8, '~~欢迎使用宿舍管理系统~~', '=' * 9, '|')
elif i == 3:
print('{:<5}{:>20}{:>15}'.format('|', '*1.添加学生信息', '|'))
elif i == 4:
print('{:<5}{:>20}{:>15}'.format('|', '*2.删除学生信息', '|'))
elif i == 5:
print('{:<5}{:>20}{:>15}'.format('|', '*3.修改学生信息', '|'))
elif i == 6:
print('{:<5}{:>20}{:>15}'.format('|', '*4.查询宿舍信息', '|'))
elif i == 7:
print('{:<5}{:>20}{:>15}'.format('|', '*5.查看所有信息', '|'))
elif i == 8:
print('{:<5}{:>20}{:>15}'.format('|', '*0.退出管理系统', '|'))
print('{:<5}{:>20}{:>19}'.format('|', ' ', '|'))
print('+', '——' * 20, '+')
def main():
log_in.LogIn()
while True:
Menu()
pattern = input('请输入您要执行操作的对应编号(1/2/3/4/5/0):')
pattern = pattern.strip()
if pattern == '1':
add_information.AddInformation()
time.sleep(1)
elif pattern == '2':
del_information.DelInformation()
time.sleep(1)
elif pattern == '3':
modify_information.ModifyInformation()
time.sleep(1)
elif pattern == '4':
search_information.SearchInformation()
time.sleep(1)
elif pattern == '5':
display_all.DisplayAll()
time.sleep(1)
elif pattern == '0':
break
else:
print('输入错误,请重新输入...')
print()
time.sleep(2)
print('*' * 9, '~~宿舍管理系统结束~~', '*' * 10)
return
if __name__ == '__main__':
main()
3.3 文件创建模块
定义了一个用于创建一个Excel文件的函数,使用openpyxl模块中的Workbook函数在文件夹里新建一个Excel文件,以便后续在该Excel文件中的当前工作簿进行数据的录入、处理、读取等操作。不放在主函数里,需要提前建好文件,否则每次运行时都会新建一个空文件。
3.3.1 程序流程图
如下图9所示:
3.3.2 文件创建代码
建立新文件代码源程序(D:\pythonProject\宿舍管理系统\setup_workbook.py)
#!/usr/bin/evn python
# -coding: gbk-
from openpyxl import Workbook
def SetupWorkBook():
wb = Workbook()
ws = wb.active
ws.append(['姓名', '学号', '班级', '学院', '宿舍号', '床位号', '电话'])
wb.save('./宿舍管理系统.xlsx')
return
SetupWorkBook()
3.4 数据处理模块
定义了一些辅助函数来帮助实现其他模块的功能。IsSave函数用于检验文件操作后是否保存了信息,若保存返回True,否则返回False;IsExist函数用于检验是否存在某学生姓名,若存在返回True,否则返回False;GetRowIndex函数用于获取学生信息的行索引;GetInformation函数用于获取学生信息;PrettyLook函数用于对Excel表格格式进行美观调整;Order函数用于实现对学生信息的排序。
3.4.1 程序流程图
如下图10所示:
3.4.2 数据处理代码
一些辅助功能代码源程序(D:\pythonProject\宿舍管理系\some_operations.py)
#!/usr/bin/evn python
# -coding: gbk-
from openpyxl import load_workbook
from openpyxl.styles import Alignment
import pandas as pd
# 是否保存信息,若保存返回True,否则返回False
def IsSave(stu_num):
wb = load_workbook('./宿舍管理系统.xlsx')
ws1 = wb.active
for i in ws1['B']:
if i.value == stu_num:
return True
return False
# 是否存在信息,若存在返回True,否则返回False
def IsExist(stu_name):
wb = load_workbook('./宿舍管理系统.xlsx')
ws1 = wb.active
for i in ws1['A']:
if i.value == stu_name:
return True
return False
# 获取学生信息的行索引
def GetRowIndex(name):
wb = load_workbook('./宿舍管理系统.xlsx')
ws1 = wb.active
for i in ws1['A']:
if i.value == name:
return i.row
# 获取学生信息
def GetInformation(row_index):
wb = load_workbook('./宿舍管理系统.xlsx')
ws = wb.active
information = []
for i in range(1, ws.max_column + 1):
information.append(ws.cell(row=row_index, column=i).value)
return information
# Excel表格美观调整
def PrettyLook():
wb = load_workbook('./宿舍管理系统.xlsx')
ws = wb.active
row = ws.row_dimensions[1]
row.height = 15
col = ws.column_dimensions['G']
col.width = 20
for i in range(1, ws.max_row + 1):
for j in range(1, ws.max_column + 1):
ws.cell(i, j).alignment = \
Alignment(horizontal='center', vertical='center')
wb.save('./宿舍管理系统.xlsx')
return
# Excel表格按宿舍号排序
def Order():
data = pd.read_excel('./宿舍管理系统.xlsx')
df = pd.DataFrame(data)
df = df.sort_values('宿舍号', ascending=True)
writer = pd.ExcelWriter('./宿舍管理系统.xlsx')
df.to_excel(writer, index=False)
writer.close()
return
3.5 添加信息模块
定义一个添加信息的函数,该函数通过Input函数从用户输入获取学生信息(姓名、学号、班级、学院、宿舍号、床位号、电话)并检查输入格式的正确性,使用while循环结构,如果输入格式不正确需要重新输入,将输入的信息储存在Excel文件中。
3.5.1 程序流程图
如下图11所示:
3.5.2 添加信息代码
添加信息代码源程序(D:\pythonProject\宿舍管理系统\add_information.py)
from openpyxl import load_workbook
from some_operations import IsSave
def AddInformation():
while True:
while True:
name = input('请输入姓名:')
name = name.strip()
if len(name) == 0:
print('姓名不能为空!')
else:
break
while True:
stu_num = input('请输入学号:')
stu_num.strip()
if len(stu_num) != 8 and stu_num.isdigit():
print('学号输入有误!')
elif len(stu_num) == 0:
print('学号不能为空!')
else:
break
while True:
clas = input('请输入班级:')
clas = clas.strip()
if len(clas) == 0:
print('班级不能为空!')
else:
break
while True:
academy = input('请输入学院:')
academy = academy.strip()
if len(academy) == 0:
print('学院不能为空!')
else:
break
while True:
dorm_num = input('请输入宿舍号:')
dorm_num = dorm_num.strip()
if len(dorm_num) == 0:
print('宿舍号不能为空!')
elif len(dorm_num) != 3:
print('宿舍号输入格式不正确!')
else:
break
while True:
bed_num = input('请输入床位号(1~5):')
bed_num = bed_num.strip()
if len(bed_num) == 0:
print('床位号不能为空!')
elif bed_num not in ['1', '2', '3', '4', '5']:
print('床位号输入有误!')
else:
break
while True:
tel_num = input('请输入电话号码:')
if len(tel_num) == 0:
print('电话不能为空!')
if len(tel_num) != 11 and tel_num.isdigit():
print('电话格式输入有误!')
else:
break
oneInformation = [name, stu_num, clas, academy,
dorm_num, bed_num, tel_num]
wb = load_workbook('./宿舍管理系统.xlsx')
ws = wb.active
if IsSave(stu_num):
print('该学生信息已存在')
else:
ws.append(oneInformation)
wb.save('./宿舍管理系统.xlsx')
if IsSave(stu_num):
print('添加成功!')
else:
print('添加失败')
answer = input('是否继续添加...(Y/N)').lower()
if answer == 'y':
continue
elif answer == 'n':
print('退出添加...')
break
return
3.6 删除信息模块
定义一个用于删除信息的函数,给出提示信息输入要删除的学生姓名,先判断该学生是否存在,若不存在则给出提示并要求用户重新输入,若存在则从Excel文件中删除该学生的信息并检验是否删除成功。使用while循环结构可以连续删除多人的信息。
3.6.1 程序流程图
如下图12所示:
3.6.2 删除信息代码
删除信息代码源程序(D:\pythonProject\宿舍管理系统\del_information.py)
from openpyxl import load_workbook
from some_operations import IsExist
from some_operations import GetRowIndex
def DelInformation():
while True:
name = input('请输入要删除的学生姓名:')
if IsExist(name):
wb = load_workbook('./宿舍管理系统.xlsx')
ws = wb.active
row_index = GetRowIndex(name)
ws.delete_rows(row_index)
wb.save('./宿舍管理系统.xlsx')
if IsExist(name):
print('删除失败')
else:
print('删除成功')
else:
print('该学生不存在!')
answer = input('是否继续删除...(Y/N)').lower()
if answer == 'y':
continue
elif answer == 'n':
print('退出删除...')
break
return
3.7 修改信息模块
定义一个用于修改信息的函数,给出提示信息输入学生姓名,并检验该学生是否存在,显示二级菜单界面让用户输入需要修改的选项,从Excel文件修改内容并给出修改前后的对比信息。使用循环结构可以支持连续修改。
3.7.1 程序流程图
如下图13所示:
3.7.2 修改信息代码
修改信息代码源程序(D:\pythonProject\宿舍管理系统\modify _information.py)
from openpyxl import load_workbook
from some_operations import IsExist
from some_operations import GetRowIndex
from some_operations import GetInformation
from show_pattern import ShowPattern
def ModifyInformation():
while True:
name = input('请输入要修改的学生姓名:')
if IsExist(name):
row_index = GetRowIndex(name)
ShowPattern()
pattern = input('请输入要修改的选项(0/1/2/3/4/5):')
if pattern == '0':
print('返回选项...')
return ModifyInformation()
elif pattern in ['1', '2', '3', '4', '5']:
wb = load_workbook('./宿舍管理系统.xlsx')
ws = wb.active
column_index = int(pattern) + 2
print('修改前:', *GetInformation(row_index))
correct = input('请输入修改的内容:')
ws.cell(row=row_index, column=column_index).value = correct
wb.save('./宿舍管理系统.xlsx')
print('修改后:', *GetInformation(row_index))
else:
print('无该选项...')
else:
print('该学生不存在!')
answer = input('是否继续修改...(Y/N)').lower()
if answer == 'y':
continue
elif answer == 'n':
print('退出修改...')
break
return
3.8 二级菜单模块
定义一个显示菜单界面的函数,给出0-5的选项让用户选择要修改的信息选项,选择“0”则退出二级菜单,重新输入要修改的学生姓名。
3.8.1 程序流程图
如下图14所示:
3.8.2 二级菜单代码
#!/usr/bin/evn python
# -coding: gbk-
def ShowPattern():
print('*'*20)
print('{:>6}{:>3}'.format(chr(12288), '1.班级'))
print('{:>6}{:>3}'.format(chr(12288), '2.学院'))
print('{:>6}{:>3}'.format(chr(12288), '3.宿舍号'))
print('{:>6}{:>3}'.format(chr(12288), '4.床位号'))
print('{:>6}{:>3}'.format(chr(12288), '5.电话'))
print('{:>6}{:>3}'.format(chr(12288), '0.返回'))
print('*' * 20)
return
3.9 查询信息模块
定义一个用于查询信息的函数,给出提示信息让用户输入关键词,并根据关键词遍历整个Excel表格如果找到与关键词相匹配的单元格则返回关键词所在行的整条信息,如果找不到与之匹配的单元格则提示查找的信息不存在。
3.9.1 程序流程图
如下图15所示:
3.9.2 查询信息代码
查询信息代码源程序(D:\pythonProject\宿舍管理系统\search_information.py)
from openpyxl import load_workbook
from some_operations import GetInformation
def SearchInformation():
while True:
flag = 1
wb = load_workbook('./宿舍管理系统.xlsx')
ws = wb.active
keywords = input('请输入要查找的关键词:')
for i in ws.rows:
for j in i:
if str(j.value) == keywords:
flag = 0
print(*GetInformation(j.row))
if flag:
print('您要查找的信息不存在')
answer = input('是否继续查找...(Y/N)').lower()
if answer == 'y':
continue
elif answer == 'n':
print('退出查找...')
break
return
3.10 显示信息模块
定义一个用于显示所有信息的函数,对Excel文件内容进行排序,打开Excel文件遍历所有单元格的值并导出全部内容。
3.10.1 程序流程图
如下图16所示:
3.10.2 显示信息代码
显示所有信息代码源程序(D:\pythonProject\宿舍管理系统\display_all.py)
import time
from openpyxl import load_workbook
from some_operations import PrettyLook
from some_operations import Order
def DisplayAll():
Order()
PrettyLook()
wb = load_workbook('./宿舍管理系统.xlsx')
ws = wb.active
for i in ws.values:
print(*i)
answer = input('是否返回主页...(Y/N):').lower()
if answer == 'y':
return
elif answer == 'n':
time.sleep(2)
print('刷新页面...')
return DisplayAll()
第四部分 程序测试
4.1 密码登录模块测试
登录次数有3次,次数超过则登陆失败,需要重新输入,如下图17所示:
登录账号输入不区分大小写,在3次机会内输入正确账号和密码则登录成功,如下图18所示:
4.2 主菜单模块测试
登录成功后显示主菜单界面,如下图19所示:
输入编号,如果输入的数字不在选项内,则给出提示信息重新输入,如下图20所示:
4.3 文件创建模块测试
为避免每次登录运行main函数都要创建新的Excel文件造成覆盖,需要事先独立新建一个Excel文件,运行结果如下图21所示:
4.4 添加信息模块测试
⑤ 输入编号1,添加成功,如下图22所示:
再添加一遍,显示信息已存在无法添加,如下图23所示:
输入Y或y(不区分大小写)继续添加,如果输入格式不正确则需要重新输入,如下图24所示:
输入N或n退出添加,返回主菜单,如下图25所示:
4.5 删除信息模块测试
输入编号2,输入学生姓名,如果该学生不存在给出提示信息,如下图26所示:
输入y继续删除,删除成功,退出删除,如下图27所示:
4.6 修改信息模块测试
输入编号3,若该学生不存在给出提示信息,如下图28所示:
输入1,修改班级,如下图29所示:
输入2,修改学院,如下图30所示:
输入3,修改宿舍号,如下图31所示:
输入4,修改床位号,如下图32所示:
输入5,修改电话,如下图33所示:
输入0,返回,如下图34所示:
输入n退出修改,如下图35所示:
4.7 二级菜单模块测试
输入编号3后自动显示二级菜单界面,如下图36所示:
4.8 查询信息模块测试
输入编号4,查找信息不存在给出提示信息,输入y继续查找,输入“303”,给出所有包含“303”的信息,如下图37所示:
输入n退出查找,如下图38所示:
4.9 显示信息模块测试
输入编号5,查看所有信息,如下图39所示:
输入n刷新页面,如下图40所示:
输入y返回主菜单界面,如下图41所示:
第五部分 总结
略