第 16 章 综合案例:客户信息管理系统
16.1 需求说明
16.1.1 主菜单

16.1.2 添加客户
1)添加id
输入纯数字则正常添加。

否则提示id必须为纯数字,并再次输入。

第三次输入时有额外提醒。

三次输入失败后终止添加客户。

id若已存在则终止添加。

- 添加姓名
输入字母或汉字则正常添加。

否则提示姓名必须为字符,并再次输入。

第三次输入时有额外提醒。

三次输入失败后终止添加客户。

- 添加年龄
输入纯数字则正常添加。

否则会有提示,并跳过添加年龄。

- 添加电话
输入符合手机号码格式则正常添加。

不常见的电话号码也可以添加。

不是电话号码则提示,并跳过添加电话。

- 添加邮箱
输入大致符合邮箱格式则正常添加。

若不符合邮箱格式则提示,并跳过添加邮箱。

16.1.3 删除客户
输入要删除的客户的id,不存在则终止,存在则删除。


16.1.4 修改客户
输入要修改的客户的id,只能修改年龄、电话、邮箱。

未设置的属性保持历史数据不变。

16.1.5 查询客户
可以按id或姓名查询,之前未设置的年龄、电话、邮箱显示 None。


16.1.5 显示客户
系统内若没有客户则提示暂无客户信息。

若有客户则显示所有客户信息,之前未设置的年龄、电话、邮箱显示 None。

16.1.6 退出
输入6,或按下 Ctrl + D / Ctrl + C 退出。
16.2 代码实现
16.2.1 客户类
Python
"""
客户类
"""
import re
class Customer:
"""客户类"""
# 这里需要用"None",而不是None:又要有默认参数,又不能让__str__格式化的时候报错
def __init__(self,id,name,age="None",phone="None",email="None"):
self.id = id
self.name = name
self.age = age
self.phone = phone
self.email = email
def __str__(self):
*"""打印客户信息"""*
* *# :<15 : 格式化,左对齐 15个字符
return f"ID:{self.id:<15}NAME:{self.name:<15}AGE:{self.age:<15},PHONE:{self.phone:<15} EMAIL:{self.email:<15}"
# 校验
@staticmethod
def check_id(id):
*"""检查id格式"""*
* *# 检查客户id是否为纯数字
return id.isdigit()
@staticmethod
def check_name(name):
*"""检查name格式"""*
* *# 检查客户姓名是否为字符
return name.isalpha()
@staticmethod
def check_age(age):
*"""检查age格式"""*
* *# 检查客户年龄是否为整数
return age.isdigit()
@staticmethod
def check_phone(phone):
*"""检查phone格式"""*
* *# 检查客户电话是否合法
# 正则表达式
pattern = r"^1[345789]\d{9}$"
# 三元表达式
return True if re.match(pattern, phone) else False
@staticmethod
def check_email(email):
*"""检查email格式"""*
* *pattern = r"[\w!#$%&'*+-/=?^`{|}~.]+@[\w!#$%&'*+-/=?^`{|}~.]+\.[a-zA-Z]{2,}$"
return True if re.match(pattern, email) else False
# 测试,可以查看输出效果
# zs = Customer(100,"zs")
# print(zs) # 自动调用__str__方法
-
创建客户类, 一个客户包含 id,name,age,phone,email
-
可以查看打印效果
-
校验也写在了类中。 校验不需要创建实例,也不需要类本身,因此使用静态方法,在校验电话和邮箱的时候,正则返回的是
match对象,因此需要通过三元表达式输出布尔值
16.2.2 客户管理系统类
1)客户类基本构建:
Python
*"""*
* 客户管理系统类*
*"""*
import sys
class CMS:
*"""客户管理系统类"""*
* *def __init__(self):
# 定义存储客户的容器,选择字典, 两种方式查询信息,id和name,
self.customer_id_dict = {}
self.customer_name_dict = {}
def start(self):
while True:
print("~~~~~~~~~~~~客户管理系统~~~~~~~~~~~~~~")
print("1.添加客户")
print("2.删除客户")
print("3.修改客户")
print("4.查询客户")
print("5.显示所有客户")
print("6.退出系统")
print(">>>>>>")
# 获取用户信息
choice = input("请输入您要进入的操作:")
match choice:
case "1":
print("添加客户")
case "2":
print("删除客户")
case "3":
print("修改客户")
case "4":
print("查询客户")
case "5":
print("查询所有客户")
case "6":
print("退出系统")
# break, 或者 return 或者 sys.exit()都可实现退出效果
sys.exit()
case _:
print("输入不合理,请重新输入")
if __name__ == '__main__':
cms = CMS()
# 启动
cms.start()
- 这里还没有学到数据库,暂时放到 内存中,为了方便后续进行查询操作,容器应选择字典
现在的代码可以优化,把菜单展示 单独 提取出来作为一个方法,选择这段代码使用快捷键: Ctrl + Alt +m提取方法,输出变量为空,定义一个方法名称为:

2)实现添加客户功能:

在功能1中实现添加客户的功能,定义好方法后,可把光标 点击到 方法 身上,选择第一个快速添加方法,然后进行具体实现
Python
*"""*
* 客户管理系统类*
*"""*
import sys
from test.customer import Customer
class CMS:
*"""客户管理系统类"""*
* *def __init__(self):
# 定义存储客户的容器,选择字典, 两种方式查询信息,id和name,
self.customer_id_dict = {}
self.customer_name_dict = {}
def start(self):
while True:
self.display_menu()
# 获取用户信息
choice = input("请输入您要进入的操作:")
match choice:
case "1":
self.add_customer()
case "2":
print("删除客户")
case "3":
print("修改客户")
case "4":
print("查询客户")
case "5":
print("查询所有客户")
case "6":
print("退出系统")
# break, 或者 return 或者 sys.exit()都可实现退出效果
sys.exit()
case _:
print("输入不合理,请重新输入")
# 展示菜单
def display_menu(self):
print("~~~~~~~~~~~~客户管理系统~~~~~~~~~~~~~~")
print("1.添加客户")
print("2.删除客户")
print("3.修改客户")
print("4.查询客户")
print("5.显示所有客户")
print("6.退出系统")
print(">>>>>>")
# 添加客户
def add_customer(self):
customer_id = ""
customer_name = ""
customer_age = ""
customer_phone = ""
customer_email = ""
# 封装添加客户的实例
customer = Customer(customer_id, customer_name, customer_age, customer_phone, customer_email)
# 将客户信息放到id字典中
self.customer_id_dict[customer_id] = customer
#将客户信息放到name字典中
# name字典的形式为:
"""
{
"zs":{
100:customer(100,zs...),
200:customer(200,zs...),
}
}
"""
# 先判断当前客户在字典中是否存在
# customer_name_inner_dict = self.customer_name_dict[customer_name],这里用get方法,[]有可能报错,而get方法返回None
customer_name_inner_dict = self.customer_name_dict.get(customer_name)
if customer_name_inner_dict:
# 如果内层字典不为空,说明已经有这个名字的客户,直接将当前客户放到内层字典上
customer_name_inner_dict[customer_id] = customer
else:
# 如果内层字典为空, 说明系统还没有这个名字的客户, 将这个客户封装为内层字典,放到名字字典中
self.customer_name_dict[customer_name] = {customer_id:customer}
print("~~~~~~添加客户成功~~~~~~~~~")
if __name__ == '__main__':
cms = CMS()
# 启动
cms.start()
先实现基本的将 客户信息放到字典中存储,
1.实现添加id

在开头添加这个方法,光标放在方法名身上,快速添加这个方法:
Python
# 添加客户id
def add_customer_id(self):
# 最多输入三次
for i in range(3):
if i <2:
customer_id = input("请输入客户的id:")
if Customer.check_id(customer_id):
break
else:
print("客户的id必须为数字")
else:
customer_id = input("最后一次机会!请输入客户的id:")
if Customer.check_id(customer_id):
break
else:
print("机会耗尽,放弃添加客户")
return False
# 判断客户id是否存在
if customer_id in self.customer_id_dict:
print("当前客户的id已经存在,放弃添加客户")
return False
return customer_id
根据返回的结果判断是否继续往下进行:
Python
def add_customer(self):
#customer_id = self.add_customer_id()
#if not customer_id:
# return
if not (customer_id := self.add_customer_id()):
return
这里使用海象运算符 等同于上边,
2.添加name
Python
# 添加客户
def add_customer(self):
customer_id = self.add_customer_id()
Python
# 添加客户名称
def add_customer_name(self):
# 最多输入三次
for i in range(3):
if i <2:
customer_name = input("请输入客户的姓名:")
if Customer.check_name(customer_name):
break
else:
print("客户的姓名必须为纯字母")
else:
customer_name = input("最后一次机会!请输入客户的姓名:")
if Customer.check_name(customer_name):
break
else:
print("机会耗尽,放弃添加客户")
return False
return customer_name
根据添加的id进行判断
Python
# 添加客户
def add_customer(self):
if not (customer_name := self.add_customer_name()):
return
3.添加age,phone,email
Python
def add_customer(self):
customer_age = self.add_customer_age()
customer_phone = self.add_customer_phone()
customer_email = self.add_customer_email()
# 添加年龄
def add_customer_age(self):
age = input("请输入客户年龄:")
if Customer.check_age(age):
return age
else:
# 不写默认返回None,为了防止后续格式化报错,主动返回字符串
print("年龄不合法,使用默认值")
return "None"
# 添加电话
def add_customer_phone(self):
phone = input("请输入客户电话:")
if Customer.check_phone(phone):
return phone
else:
# 不写默认返回None,为了防止后续格式化报错,主动返回字符串
print("电话不合法,使用默认值")
return "None"
# 添加邮箱
def add_customer_email(self):
email = input("请输入客户邮箱:")
if Customer.check_email(email):
return email
else:
# 不写默认返回None,为了防止后续格式化报错,主动返回字符串
print("邮箱不合法,使用默认值")
return "None"
3) 删除客户
Python
case "2":
self.del_customer()
Python
# 删除客户
def del_customer(self):
customer_id = input("请输入要删除的id:")
# 校验
if not Customer.check_id(customer_id):
print("客户id必须为纯数字")
print("终止删除客户")
return
if not self.customer_id_dict.get(customer_id):
print("客户id不存在")
print("终止删除客户")
return
else:
customer_name = self.customer_id_dict[customer_id].name
#将客户id从id字典中删除
del self.customer_id_dict[customer_id]
# 将客户从name字典中删除
customer_inner_dict = self.customer_name_dict.get(customer_name)
del customer_inner_dict[customer_id]
if len(self.customer_id_dict) == 0:
del self.customer_name_dict[customer_name]
print(f"客户{customer_id}删除完毕")
4) 修改客户
Python
case "3":
self.update_customer()
Python
# 修改客户
def update_customer(self):
customer_id = input("请输入你要修改的id:")
if not Customer.check_id(customer_id):
print("客户id必须为纯数字")
print("终止修改客户")
return
if customer_id not in self.customer_id_dict:
print("客户id不存在")
print("终止修改客户")
return
# 修改客户年龄
print(f"客户{customer_id}的历史年龄:",self.customer_id_dict[customer_id].age)
if not (customer_age := self.set_customer_age()):
self.customer_id_dict[customer_id].age = customer_age
# 修改客户电话
if not (customer_phone := self.set_customer_phone()):
self.customer_id_dict[customer_id].phone = customer_phone
#修改客户邮箱
if not (customer_email := self.set_customer_email()):
self.customer_id_dict[customer_id].email = customer_email
print(f"客户{customer_id}修改完毕")
def set_customer_age(self):
customer_age = input("请输入客户年龄:")
if Customer.check_age(customer_age):
return customer_age
else:
print("好吧,暂时不修改年龄也可以")
return "None"
def set_customer_phone(self):
customer_phone = input("请输入你要修改的电话:")
if Customer.check_phone(customer_phone):
return customer_phone
elif re.search(r"^[\d-]+$",customer_phone):
print("这个电话号码不太常见,但是可以添加")
return customer_phone
else:
print("好吧,暂时不添加电话号码也可以")
return "None"
def set_customer_email(self):
customer_email = input("请输入客户邮箱:")
if Customer.check_email(customer_email):
print("邮箱合法")
return customer_email
else:
print("好吧,暂时不添加邮箱也可以")
return "None"
5) 查询客户
Python
case "4":
self.search_customer()
Python
def search_customer(self):
customer_info = input("请输入要查询的id或者姓名:")
if Customer.check_id(customer_info):
# 如果输入的是id
if customer_info in self.customer_id_dict:
print(self.customer_id_dict[customer_info])
else:
print("客户id不存在")
elif Customer.check_name(customer_info):
if customer_info in self.customer_name_dict:
for customer_id in self.customer_name_dict[customer_info]:
print(self.customer_name_dict[customer_info][customer_id])
else:
print("客户姓名不存在")
else:
print("输入的好像不是客户id或者姓名")
6) 显示所有客户
Python
case "5":
self.display_all_customer()
Python
# 显示所有客户
def display_all_customer(self):
if len(self.customer_id_dict) == 0:
print("暂时没有客户")
else:
for customer in self.customer_id_dict.values():
print(customer)
7)完整代码
Python
*"""*
* 客户管理系统类*
*"""*
import sys
from customer import Customer
import re
class CMS:
*"""客户管理系统类"""*
* *def __init__(self):
# 定义存储客户的容器,选择字典, 两种方式查询信息,id和name,
self.customer_id_dict = {}
self.customer_name_dict = {}
def start(self):
while True:
self.display_menu()
# 获取用户信息
choice = input("请输入您要进入的操作:")
match choice:
case "1":
self.add_customer()
case "2":
self.del_customer()
case "3":
self.update_customer()
case "4":
self.search_customer()
case "5":
self.display_all_customer()
case "6":
print("退出系统")
# break, 或者 return 或者 sys.exit()都可实现退出效果
sys.exit()
case _:
print("输入不合理,请重新输入")
# 展示菜单
def display_menu(self):
print("~~~~~~~~~~~~客户管理系统~~~~~~~~~~~~~~")
print("1.添加客户")
print("2.删除客户")
print("3.修改客户")
print("4.查询客户")
print("5.显示所有客户")
print("6.退出系统")
print(">>>>>>")
# 添加客户
def add_customer(self):
# customer_id = self.add_customer_id()
# if not customer_id:
# return
if not (customer_id := self.add_customer_id()):
return
if not (customer_name := self.add_customer_name()):
return
customer_age = self.add_customer_age()
customer_phone = self.add_customer_phone()
customer_email = self.add_customer_email()
# 封装添加客户的实例
customer = Customer(customer_id, customer_name, customer_age, customer_phone, customer_email)
# 将客户信息放到id字典中
self.customer_id_dict[customer_id] = customer
# 将客户信息放到name字典中
# name字典的形式为:
"""
{
"zs":{
100:customer(100,zs...),
200:customer(200,zs...),
}
}
"""
# 先判断当前客户在字典中是否存在
# customer_name_inner_dict = self.customer_name_list[customer_name],这里用get方法,[]有可能报错,而get方法返回None
customer_name_inner_dict = self.customer_name_dict.get(customer_name)
if customer_name_inner_dict:
# 如果内层字典不为空,说明已经有这个名字的客户,直接将当前客户放到内层字典上
customer_name_inner_dict[customer_id] = customer
else:
# 如果内层字典为空, 说明系统还没有这个名字的客户, 将这个客户封装为内层字典,放到名字字典中
self.customer_name_dict[customer_name] = {customer_id: customer}
print("~~~~~~添加客户成功~~~~~~~~~")
# 添加客户id
def add_customer_id(self):
# 最多输入三次
for i in range(3):
if i < 2:
customer_id = input("请输入客户的id:")
if Customer.check_id(customer_id):
break
else:
print("客户的id必须为数字")
else:
customer_id = input("最后一次机会!请输入客户的id:")
if Customer.check_id(customer_id):
break
else:
print("机会耗尽,放弃添加客户")
return False
# 判断客户id是否存在
if customer_id in self.customer_id_dict:
print("当前客户的id已经存在,放弃添加客户")
return False
return customer_id
# 添加客户名称
def add_customer_name(self):
# 最多输入三次
for i in range(3):
if i < 2:
customer_name = input("请输入客户的姓名:")
if Customer.check_name(customer_name):
break
else:
print("客户的姓名必须为纯字母")
else:
customer_name = input("最后一次机会!请输入客户的姓名:")
if Customer.check_name(customer_name):
break
else:
print("机会耗尽,放弃添加客户")
return False
return customer_name
# 添加年龄
def add_customer_age(self):
age = input("请输入客户年龄:")
if Customer.check_age(age):
return age
else:
# 不写默认返回None,为了防止后续格式化报错,主动返回字符串
print("年龄不合法,使用默认值")
return "None"
# 添加电话
def add_customer_phone(self):
phone = input("请输入客户电话:")
if Customer.check_phone(phone):
return phone
else:
# 不写默认返回None,为了防止后续格式化报错,主动返回字符串
print("电话不合法,使用默认值")
return "None"
# 添加邮箱
def add_customer_email(self):
email = input("请输入客户邮箱:")
if Customer.check_email(email):
return email
else:
# 不写默认返回None,为了防止后续格式化报错,主动返回字符串
print("邮箱不合法,使用默认值")
return "None"
# 显示所有客户
def display_all_customer(self):
if len(self.customer_id_dict) == 0:
print("暂时没有客户")
else:
for customer in self.customer_id_dict.values():
print(customer)
# 删除客户
def del_customer(self):
customer_id = input("请输入要删除的id:")
# 校验
if not Customer.check_id(customer_id):
print("客户id必须为纯数字")
print("终止删除客户")
return
if not self.customer_id_dict.get(customer_id):
print("客户id不存在")
print("终止删除客户")
return
else:
customer_name = self.customer_id_dict[customer_id].name
# 将客户id从id字典中删除
del self.customer_id_dict[customer_id]
# 将客户从name字典中删除
customer_inner_dict = self.customer_name_dict.get(customer_name)
del customer_inner_dict[customer_id]
if len(self.customer_id_dict) == 0:
del self.customer_name_dict[customer_name]
print(f"客户{customer_id}删除完毕")
# 修改客户
def update_customer(self):
customer_id = input("请输入你要修改的id:")
if not Customer.check_id(customer_id):
print("客户id必须为纯数字")
print("终止修改客户")
return
if customer_id not in self.customer_id_dict:
print("客户id不存在")
print("终止修改客户")
return
# 修改客户年龄
print(f"客户{customer_id}的历史年龄:", self.customer_id_dict[customer_id].age)
if not (customer_age := self.set_customer_age()):
self.customer_id_dict[customer_id].age = customer_age
# 修改客户电话
if not (customer_phone := self.set_customer_phone()):
self.customer_id_dict[customer_id].phone = customer_phone
# 修改客户邮箱
if not (customer_email := self.set_customer_email()):
self.customer_id_dict[customer_id].email = customer_email
print(f"客户{customer_id}修改完毕")
def set_customer_age(self):
customer_age = input("请输入客户年龄:")
if Customer.check_age(customer_age):
return customer_age
else:
print("好吧,暂时不修改年龄也可以")
return "None"
def set_customer_phone(self):
customer_phone = input("请输入你要修改的电话:")
if Customer.check_phone(customer_phone):
return customer_phone
elif re.search(r"^[\d-]+$", customer_phone):
print("这个电话号码不太常见,但是可以添加")
return customer_phone
else:
print("好吧,暂时不添加电话号码也可以")
return "None"
def set_customer_email(self):
customer_email = input("请输入客户邮箱:")
if Customer.check_email(customer_email):
print("邮箱合法")
return customer_email
else:
print("好吧,暂时不添加邮箱也可以")
return "None"
def search_customer(self):
customer_info = input("请输入要查询的id或者姓名:")
if Customer.check_id(customer_info):
# 如果输入的是id
if customer_info in self.customer_id_dict:
print(self.customer_id_dict[customer_info])
else:
print("客户id不存在")
elif Customer.check_name(customer_info):
if customer_info in self.customer_name_dict:
for customer_id in self.customer_name_dict[customer_info]:
print(self.customer_name_dict[customer_info][customer_id])
else:
print("客户姓名不存在")
else:
print("输入的好像不是客户id或者姓名")
if __name__ == '__main__':
cms = CMS()
# 启动
cms.start()