python实现名片管理系统

Begin to change 2022-05-14 14:44:03 阅读数:599

Python管理实现名片现名

目录

一、题目描述

二、解析

1、分析

2、结构

        ①封装两个类

        ②工具类

        ③文件管理类

        ④首页类

        ⑤学生管理类

三、源码

1、files_manager.py

2、index.py

3、model.py

4、student_manage.py

5、tools.py


一、题目描述

学生管理系统的数据结构设置:

一个学生信息对应一个字典

整个系统的所有学生:所有学生对应一个列表,列表中的元素全是字典

整个系统:一个字典, 字典中有一个key(all_student)

对应的值是所有学生; 这个字典需要做数据持久化,将数据存储到json文件中, 文件名就是当前登录的账号名

{ 'all_student': [

                {'name': '张三', 'age': 89, 'tel': '237837293'},

                {'name': '张三', 'age': 89, 'tel': '237837293'},

                {'name': '张三', 'age': 89, 'tel': '237837293'},

                {'name': '张三', 'age': 89, 'tel': '237837293'} ],

'num': 4 }

二、解析

1、分析

        在之前的文章中写过银行管理系统,其它的系统在大致的逻辑上与之是没有多大的区别的,区别在于思想层面的框架上,之前的是写在一个.py文件中,功能的实现用的是方法,此次的系统将上升一个层面,运用到封装的思想,但其实也是很简单的。

2、结构

        ①封装两个类

                将两个类的定义封装到一个文件中,需要用到时只需要导入即可;

# -*- coding: utf-8 -*-
from tools import encrypt_password as encrypt
class Teach:
def __init__(self,name,password):
"""
教师用来登录学生管理系统,只有静态属性
:param name:
:param password:
"""
self.name = name
self.password = encrypt(password)
#为了安全起见,导入了一个加密的模块,对密码进行加密
#加密之后的密码不能对其反向解密,只能当相同的密码调用相同的函数时得到的结果相同才算密码箱等
class Student:
def __init__(self,s_id,name,age,gender,tel):
self.s_id = s_id
self.name = name
self.age = age
self.gender = gender
self.tel = tel

        ②工具类

也就是对密码加密的类,对密码加密调用的是hashlib模块加密

# -*- coding: utf-8 -*-
#密码加密
import hashlib
def encrypt_password(password,salt='1234'):
"""
密码加密函数
:param password: 密码
:return: 加密后的密码
"""
h = hashlib.sha256()
h.update(password.encode('utf-8'))
h.update(salt.encode('utf-8'))
return h.hexdigest()#返回16进制

        ③文件管理类

        因为要对数据做持久化管理,也就是将数据存储到文件中,也就涉及到了对文件的操作;系统中只要涉及数据的就都会用到,所以此时的封装大大的减少了代码的复用率;

        文件管理类包括三个方法:第一个是读取普通文件内容;第二个是读取JSON文件;第三个是写入JSON文件;

        第一个跟第二个的区别在于,第一个文件中的数据读出来的是字符串,方便进行操作,而第二个读取出来的是JSON文件,而JSON文件不能直接进行直接操作,需要调用JSON模块的反序列化方法,将JSON格式转化为字符串格式

# -*- coding: utf-8 -*-
base_path = './files/'
def read_file(file_path):
"""
读取普通文件内容
:param file_path:文件路径
:return: 文件内容
"""
try:
with open(base_path + file_path,'r',encoding='utf-8') as f:
content = f.read()
return content
except FileNotFoundError as e:
print('读取文件失败请检查路径',e)
return ''
import json
def read_json(file_path,None_data=None):
"""
读取Json文件
:param file_path:文件路径
:return: 文件内容
"""
try:
with open(base_path + file_path,'r',encoding='utf-8') as f:
content = json.loads(f.read())
return content
except Exception as e:
# print('读取文件失败请检查路径',e)
return None_data
def write_json(file_path,data):
"""
写入json文件
:param file_path: 文件路径
:param data: 写入的数据
:return: None
"""
with open(base_path+file_path,'w',encoding='utf-8') as f:
json.dump(data,f)
if __name__ == '__main__':
print(read_file('welcome.txt'))

        ④首页类

        首页类定义了三个方法,第一个方法是:在用户进入系统之后,会给用户一个欢迎界面,然后让用户选择接下来实现的功能,欢迎界面给出了三个选项,登录、注册和退出

        第二个方法是登录功能,首先从数据库中(也就是文件中获取数据,得到的是一个字典)获取用户名,然后再和用户输入的相比较,如果存在则输密码,不存在则提醒用户重新输入

        第三个是注册功能,对用户名有简单的条件约束,在满足条件之后,再判断数据是否在数据库中,如果都不在,则允许注册,在用户名以及密码合格后,将其实例化给一个老师对象,然后将用户名和密码添加到字典中,再把字典写入文件中,对数据库进行更新

# -*- coding: utf-8 -*-
#老师完成注册登录
#登陆成功以后选择菜单
import files_maneger
import model
import student_manager
from tools import encrypt_password
USERS_FILE = 'teacherinfo.json'
#变量 小写
#常量 大写
#登录
def login():
all_user = files_maneger.read_json(USERS_FILE,{})#加载数据库等
username = input('请输入用户名')
#判断用户名是否已经注册
if username not in all_user:
print('用户名暂未注册,请重新输入')
else:
password = input('请输入密码:')
if all_user[username] == encrypt_password(password):
print('登录成功')
student_manager.USERNAME = username
student_manager.show_system()
return False
#注册
def register():
while True:
username = input('请输入用户名')
if 6 <= len(username) <= 30:
break
else:
print('用户名长度不正确,请重新输入')
#判断用户名是否存在
all_user = files_maneger.read_json(USERS_FILE,{})
print(type(all_user))
if username in all_user:
print('注册失败,用户名已存在')
return
#如果长度符合要求,而且用户名不存在,则让用户输入密码
while True:
password = input('请输入密码')
if 30>= len(password) >=6:
break
print('密码长度不合法,请重新输入')
#创建教师对象
new_teacher = model.Teach(username,password)
all_user[new_teacher.name] = new_teacher.password
files_maneger.write_json(USERS_FILE,all_user)
def start():
content = files_maneger.read_file('welcome.txt')
while True:
print(content)
value = input('请输入要操作的序号')
if value == '1':
login()
elif value == '2':
register()
elif value == '3':
print('退出成功')
exit()
else:
print('输入错误,请重新输入')
if __name__ == '__main__':
start()

        ⑤学生管理类

        在登录成功之后,才能进行对学生的增删改查操作;

        添加学生:

        在登录成功之后,将用户的用户名记录下来,然后去打开对应的文件,获取其中学生的数据,其中数据是以键值对的形式存储的,我们所需要的是字典的值,即要通过键去获得;然后就是根据输入的学生信息构建一个学生对象,再通过魔术方法将对象以字典的形式存储到之前获取的学生数据列表中,然后再对应着之前的键存入到字典中,最后写入文件中,这样就完成了添加功能

def add_studnet():
system_data = files_maneger.read_json(USERNAME+'.json',{})
all_student = system_data.get(ALL_STUDENT,[])
while True:
name = input('请输入学生姓名')
age = input('请输入学生年龄')
gender = input('请输入学生性别')
tel = input('请输入学生的手机号')
#创建学号
count = system_data.get('num',0)
count +=1
s_id = 'stu'+str(count).zfill(4)#长度为4,前面补0
#创建学生对象
new_student = model.Student(s_id=s_id,name=name,age=age,gender=gender,tel=tel)
all_student.append(new_student.__dict__)
print(new_student.__dict__)
print(type(new_student.__dict__))
system_data[ALL_STUDENT] = all_student
system_data['num'] = count
#写入文件
#w 覆盖原文件
files_maneger.write_json(USERNAME+'.json',system_data)
print('添加成功')
#给出选择,是否继续
value = input('1继续\n2返回')
if value != '1':
break

        删除学生:

        删除学生有两种,一种是逻辑删除的(先将原数据复制,然后删除复制中的数据),一种是物理删除;

        系统提供了两种删除的方式,一种是按照姓名,一种是按照学号,两者本质上的逻辑是一样的,无非是要判断的值不一样;

        因为可能出现信息相同的学生,所以在删除之前先把相同信息的学生信息存储起来,然后让客户再进行选择,然后再根据客户选择的序号将数据删除,最后将删除之后的字典写入文件中,这就完成了删除功能

def del_student():
#加载数据库信息
system_data = files_maneger.read_json(USERNAME + '.json', {})
all_student = system_data.get(ALL_STUDENT, [])
del_students = []
#如果没有学生 不能删除
if not all_student:
print('没有学生信息,不能删除')
return
print('1.按姓名删\n,2.按学号删\n其他:返回')
choice = input('请选择要删除的方式')
if choice == '1':
key = 'name'
value = input('请输入要删除的学生姓名')
elif choice == '2':
key = 's_id'
value = input('请输入要删除的学生学号')
else:
return
#上面仅仅是选择删除方式,还需要判断是否由学生信息
for stu in all_student:
if stu[key] == value:
del_students.append(stu)
if not del_students:
print('没有找到要删除的学生')
return
length = len(del_students)
for index,stu in enumerate(del_students):
print('{}.{}'.format(index+1,get_stu_message(stu)))
try:
choice = int(input(f'请选择要删除的学生编号1~{length}:'))
except ValueError:
return
if not 1 <= choice <= length:
return
# 删除学生信息 物理删除
all_student.remove(del_students[choice - 1])
system_data[ALL_STUDENT] = all_student
files_maneger.write_json(USERNAME + '.json', system_data)
print('删除成功')

        查找学生:

查找学生的逻辑是最简单的,就不展开介绍了

def find_student():
#查找单个
#查找所有
system_data = files_manager.read_json(USERNAME + '.json', {})
all_student = system_data.get(ALL_STUDENT, [])
if not all_student:
print('没有学生信息,不能查找')
return
print('1.查找所有的学生2.按姓名查\n3.按学号查\n其他:返回')
choice = input('请选择要查找的方式:')
if choice == '1':
for stu in all_student:
print(get_stu_message(stu))
elif choice == '2':
name = input('请输入要查找的学生姓名')
flag = True
for stu in all_student:
if stu['name'] == name:
print(get_stu_message(stu))
flag = False
if flag:
print('没有找到该学生')
elif choice == '3':
s_id = input('请输入要查找的学生学号')
for stu in all_student:
if stu['s_id'] == s_id:
print(get_stu_message(stu))
break
else:
print('没有找到该学生')
else:
return 

        修改学生

        修改学生的信息和删除学生信息有着相同之处,都是先根据学生的信息去查找到响应的数据,然后再对数据进行操作,其逻辑上是差不多的

def edit_student():
# 编辑 1 查出要编辑的学生 2 编辑学生信息
system_data = files_manager.read_json(USERNAME + '.json', {})
all_student = system_data.get(ALL_STUDENT, [])
if not all_student:
print('没有学生信息,不能编辑')
return
print('1.按照姓名查找并编辑\n2.按照学号查找并编辑学生信息\n其他:返回')
edit_students = []
choice = input('请选择要编辑的方式:')
if choice == '1':
name = input('请输入要编辑的学生姓名')
for stu in all_student:
if stu['name'] == name:
edit_students.append(stu)
if not edit_students:
print('没有找到要编辑的学生的信息')
return
# 如果有学生信息,放到del_students
length = len(edit_students)
for index, stu in enumerate(edit_students):
print('{}.{}'.format(index + 1, get_stu_message(stu)))
try:
choice = int(input(f'请选择要编辑的学生编号1~{length}:'))
# 只能让用户重新输入用户名 性别 年龄 手机号
name = input('请输入学生的姓名:')
gender = input('请输入学生的性别:')
age = input('请输入学生的年龄:')
tel = input('请输入学生的电话号码:')
# name
# gender
# age
# tel
except ValueError:
return
if not 1 <= choice <= length:
return
all_student[choice-1]['name'] = name
all_student[choice-1]['age'] = age
all_student[choice-1]['tel'] = tel
all_student[choice-1]['gender'] = gender
system_data[ALL_STUDENT] = all_student
files_manager.write_json(USERNAME + '.json', system_data)

三、源码

1、files_manager.py

# 这里边实现对文件的读写
base_path = './myfile/'
def read_file(file_path):
"""
读取文件内容
@param file_path: 文件路径
@return: 文件内容
"""
try:
with open(base_path + file_path, 'r', encoding='utf-8') as f:
content = f.read()
return content
except FileNotFoundError as e:
print('读取文件失败请检查路径', e)
return '' # 返回空字符串
import json
def read_json(file_path, None_data=None):
"""
读取json文件
@param file_path: 文件路径
@return: 文件内容
"""
try:
with open(base_path + file_path, 'r', encoding='utf-8') as f:
content = f.read()
return json.loads(content)
except FileNotFoundError as e:
print('读取文件失败请检查路径', e)
return None_data # 返回空内容
def write_json(file_path, data):
"""
写入json文件
@param file_path: 文件路径
@param data: 写入的数据
@return: None
"""
with open(base_path + file_path, 'w', encoding='utf-8') as f:
json.dump(data, f)

2、index.py

# 老师完成注册登录
# 登录成功以后选择菜单
import files_manager
import model
from tools import encrypt_password
import student_manage
import sys
USERS_FILE = 'teacherinfo.json'
# 变量 小写
# 常量 大写
def login():
all_user = files_manager.read_json(USERS_FILE, {}) # 加载数据库等待用户输入用户名
username = input('请输入用户名:')
# 判断用户名是否已经注册
if username not in all_user:
print('用户名暂未注册,请重新输入')
else:
password = input('请输入密码:')
if all_user[username] == encrypt_password(password):
print('登录成功')
student_manage.USERNAME = username
student_manage.show_system()
return False
def register():
while True:
username = input('请输入用户名:')
if 6 <= len(username) <= 30:
break
print('用户名长度不合法,请重新输入')
# 判断用户名是否存在
all_user = files_manager.read_json(USERS_FILE, {})
if username in all_user:
print('注册失败,用户名已存在')
return
# 如果长度符合要求并且用户名不存在,则让用户输入密码
while True:
password = input('请输入密码:')
if 30 >= len(password) >= 6:
break
print('密码长度不合法,请重新输入')
# 创建教师对象
new_teacher = model.Teacher(username, password)
all_user[new_teacher.name] = new_teacher.password
files_manager.write_json(USERS_FILE, all_user)
def start():
content = files_manager.read_file('welcome.txt')
while True:
value = input(content+'\n请输入要操作的序号:')
if value == '1':
login()
elif value == '2':
register()
elif value == '3':
print('退出成功')
# exit()
sys.exit(0) # 退出整个程序
else:
print('输入错误,请重新输入')
if __name__ == "__main__":
start()

3、model.py

# 这个里边放所有的类
from tools import encrypt_password
class Teacher:
'''
教室用来登录学生管理系统 只有静态属性
'''
def __init__(self, name, password) -> None:
self.name = name
self.password = encrypt_password(password)
class Student:
def __init__(self, s_id, name, age, gender, tel) -> None:
self.s_id = s_id
self.name = name
self.age = age
self.gender = gender
self.tel = tel

4、student_manage.py

# 对学生信息进行 增删查改
import files_manager
import model
USERNAME = ''
ALL_STUDENT = 'ALL_STUDENT'
NUM = 'NUM'
def add_student():
# print(123)
#每次学生的操作都要先链接数据库 并且把数据库的信息获取到
system_data = files_manager.read_json(USERNAME + '.json', {})
all_student = system_data.get(ALL_STUDENT, [])
while True:
name = input('请输入学生姓名:')
age = input('请输入学生年龄:')
gender = input('请输入学生的性别:')
tel = input('请输入学生的手机号:')
# 创建学号
count = system_data.get(NUM, 0)
count += 1
s_id = 'stu' + str(count).zfill(4) # 长度为4的字符串,前面补0
# 创建学生对象
new_student = model.Student(s_id=s_id,
name=name,
age=age,
gender=gender,
tel=tel)
all_student.append(new_student.__dict__)
system_data[ALL_STUDENT] = all_student
system_data[NUM] = count
# 写入文件
# w 覆盖源文件
files_manager.write_json(USERNAME + '.json', system_data)
print('添加成功')
# 给出选择
value = input('1继续\n2返回')
if value != '1':
break
# 物理删除 逻辑删除
def del_student():
# 加载数据库的信息
system_data = files_manager.read_json(USERNAME + '.json', {})
all_student = system_data.get(ALL_STUDENT, [])
# 如果没有学生 不能删除
if not all_student:
print('没有学生信息,不能删除')
return
print('1.按姓名删\n2.按学号删\n其他:返回')
del_students = []
choice = input('请选择要删除的方式')
if choice == '1':
key = 'name'
value = input('请输入要删除的学生姓名')
elif choice == '2':
key = 's_id'
value = input('请输入要删除的学生学号')
else:
return
#上面仅仅是选择删除方式,还需要判断是否有学生信息
for stu in all_student:
if stu[key] == value:
del_students.append(stu)
if not del_students:
print('没有找到要删除的学生')
return
# 如果有学生信息,放到del_students
length = len(del_students)
for index, stu in enumerate(del_students):
print('{}.{}'.format(index + 1, get_stu_message(stu)))
try:
choice = int(input(f'请选择要删除的学生编号1~{length}:'))
except ValueError:
return
if not 1 <= choice <= length:
return
# 删除学生信息 物理删除
all_student.remove(del_students[choice - 1])
system_data[ALL_STUDENT] = all_student
files_manager.write_json(USERNAME + '.json', system_data)
print('删除成功')
def get_stu_message(stu):
return '学号是{},姓名{},性别是{},年龄是{},手机号:{}'.format(stu['s_id'], stu['name'],
stu['gender'], stu['age'],
stu['tel'])
#查找
def find_student():
#查找单个
#查找所有
system_data = files_manager.read_json(USERNAME + '.json', {})
all_student = system_data.get(ALL_STUDENT, [])
if not all_student:
print('没有学生信息,不能查找')
return
print('1.查找所有的学生2.按姓名查\n3.按学号查\n其他:返回')
choice = input('请选择要查找的方式:')
if choice == '1':
for stu in all_student:
print(get_stu_message(stu))
elif choice == '2':
name = input('请输入要查找的学生姓名')
flag = True
for stu in all_student:
if stu['name'] == name:
print(get_stu_message(stu))
flag = False
if flag:
print('没有找到该学生')
elif choice == '3':
s_id = input('请输入要查找的学生学号')
for stu in all_student:
if stu['s_id'] == s_id:
print(get_stu_message(stu))
break
else:
print('没有找到该学生')
else:
return
def edit_student():
# 编辑 1 查出要编辑的学生 2 编辑学生信息
system_data = files_manager.read_json(USERNAME + '.json', {})
all_student = system_data.get(ALL_STUDENT, [])
if not all_student:
print('没有学生信息,不能编辑')
return
print('1.按照姓名查找并编辑\n2.按照学号查找并编辑学生信息\n其他:返回')
edit_students = []
choice = input('请选择要编辑的方式:')
if choice == '1':
name = input('请输入要编辑的学生姓名')
for stu in all_student:
if stu['name'] == name:
edit_students.append(stu)
if not edit_students:
print('没有找到要编辑的学生的信息')
return
# 如果有学生信息,放到del_students
length = len(edit_students)
for index, stu in enumerate(edit_students):
print('{}.{}'.format(index + 1, get_stu_message(stu)))
try:
choice = int(input(f'请选择要编辑的学生编号1~{length}:'))
# 只能让用户重新输入用户名 性别 年龄 手机号
name = input('请输入学生的姓名:')
gender = input('请输入学生的性别:')
age = input('请输入学生的年龄:')
tel = input('请输入学生的电话号码:')
# name
# gender
# age
# tel
except ValueError:
return
if not 1 <= choice <= length:
return
all_student[choice-1]['name'] = name
all_student[choice-1]['age'] = age
all_student[choice-1]['tel'] = tel
all_student[choice-1]['gender'] = gender
system_data[ALL_STUDENT] = all_student
files_manager.write_json(USERNAME + '.json', system_data)
def show_system():
content = files_manager.read_file('stuinfo.txt') % USERNAME
while True:
print(content)
value = input('请选择要进行的操作')
if value == '1':
add_student()
elif value == '2':
find_student()
elif value == '3':
edit_student()
elif value == '4':
del_student()
elif value == '5':
return
else:
print('输入错误,请重新输入')

5、tools.py

# 密码的加密
import hashlib
def encrypt_password(password, salt='xiaoyuaoyyds'):
"""
密码加密函数
@param password: 密码
@return: 加密后的密码
"""
h = hashlib.sha256()
h.update(password.encode('utf-8'))
h.update(salt.encode('utf-8'))
return h.hexdigest() # 返回十六进制
# 发送短信
# 发送邮件

版权声明:本文为[Begin to change]所创,转载请带上原文链接,感谢。 https://blog.csdn.net/qq_41404557/article/details/124758557