第17章 综合案例:客户信息管理系统
17.1 需求说明
17.1.1 主菜单
系统启动后显示主菜单,包含以下功能选项:
- 添加客户
- 删除客户
- 修改客户
- 查询客户
- 显示客户
- 退出
17.1.2 添加客户
1)添加 id
- 输入纯数字则正常添加。
- 否则提示 id 必须为纯数字,并再次输入。
- 第三次输入时有额外提醒。
- 三次输入失败后终止添加客户。
- id 若已存在则终止添加。
2)添加姓名
- 输入字母或汉字则正常添加。
- 否则提示姓名必须为字符,并再次输入。
- 第三次输入时有额外提醒。
- 三次输入失败后终止添加客户。
3)添加年龄
- 输入纯数字则正常添加。
- 否则会有提示,并跳过添加年龄。
4)添加电话
- 输入符合手机号码格式则正常添加。
- 不常见的电话号码也可以添加。
- 不是电话号码则提示,并跳过添加电话。
5)添加邮箱
- 输入大致符合邮箱格式则正常添加。
- 若不符合邮箱格式则提示,并跳过添加邮箱。
17.1.3 删除客户
输入要删除的客户的 id,不存在则终止,存在则删除。
17.1.4 修改客户
输入要修改的客户的 id,只能修改年龄、电话、邮箱。未设置的属性保持历史数据不变。
17.1.5 查询客户
可以按 id 或姓名查询,之前未设置的年龄、电话、邮箱显示 None。
17.1.6 显示客户
- 系统内若没有客户则提示暂无客户信息。
- 若有客户则显示所有客户信息,之前未设置的年龄、电话、邮箱显示
None。
17.1.7 退出
输入 6,或按下 Ctrl + D / Ctrl + C 退出。
17.2 代码实现
17.2.1 客户类
import re
class Customer:
"""客户类"""
def __init__(self, c_id, name, age="None", phone="None", email="None"):
"""初始化客户信息"""
self.id = c_id # 客户编号
self.name = name # 客户姓名
self.age = age # 客户年龄
self.phone = phone # 客户电话
self.email = email # 客户邮箱
@staticmethod
def check_id(c_id):
"""检查id格式"""
# 检查客户id是否为纯数字
return c_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格式"""
# 检查客户电话是否合法
return True if re.match(r"^1[345789]\d{9}$", 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
def __str__(self):
"""打印客户信息"""
return (
f"Id: {self.id:<5}, Name: {self.name:<10}, Age: {self.age:<5}, "
f"Phone: {self.phone:<15}, Email: {self.email:<25}"
)
17.2.2 客户管理系统类
import re
import time
from customer import Customer
class CMS:
"""客户管理系统类"""
def __init__(self):
"""初始化客户管理系统"""
self.customer_id_dict = {} # 客户id字典
self.customer_name_dict = {} # 客户姓名字典
def display_menu(self):
"""显示菜单"""
print(
"""
----------客户管理系统----------
1. 添加客户
2. 删除客户
3. 修改客户
4. 查询客户
5. 显示客户
6. 退出
"""
)
def add_customer_id(self):
"""添加客户id"""
customer_id = "None"
for i in range(3):
if i < 2:
# 前2次输入,输入错误则重新输入
customer_id = input("请输入客户id:")
if Customer.check_id(customer_id):
break
else:
print("客户id必须为纯数字")
else:
# 第3次输入,输入错误则终止添加
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
else:
return customer_id
def add_customer_name(self):
"""添加客户姓名"""
customer_name = "None"
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 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 add_customer(self):
"""添加客户"""
# 添加客户id
if not (customer_id := self.add_customer_id()):
return
# 添加客户姓名
if not (customer_name := self.add_customer_name()):
return
# 添加客户年龄
customer_age = self.set_customer_age()
# 添加客户电话
customer_phone = self.set_customer_phone()
# 添加客户邮箱
customer_email = self.set_customer_email()
# 创建客户对象
customer = Customer(
customer_id, customer_name, customer_age,
customer_phone, customer_email
)
# 将客户对象添加到客户id字典中
self.customer_id_dict[customer_id] = customer
# 将客户对象添加到客户姓名字典中
customer_inner_dict = self.customer_name_dict.get(customer_name)
if customer_inner_dict is None:
self.customer_name_dict[customer_name] = {customer_id: customer}
else:
customer_inner_dict[customer_id] = customer
print(f"添加客户{customer_id}成功")
def delete_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
else:
customer_name = self.customer_id_dict[customer_id].name
# 将客户id从客户id字典中删除
del self.customer_id_dict[customer_id]
# 将客户id从客户姓名字典中删除
customer_inner_dict = self.customer_name_dict.get(customer_name)
del customer_inner_dict[customer_id]
if len(customer_inner_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 (customer_age := self.set_customer_age()) != "None":
self.customer_id_dict[customer_id].age = customer_age
# 修改客户电话
print(f"客户{customer_id}的历史电话:",
self.customer_id_dict[customer_id].phone)
if (customer_phone := self.set_customer_phone()) != "None":
self.customer_id_dict[customer_id].phone = customer_phone
# 修改客户邮箱
print(f"客户{customer_id}的历史邮箱:",
self.customer_id_dict[customer_id].email)
if (customer_email := self.set_customer_email()) != "None":
self.customer_id_dict[customer_id].email = customer_email
print(f"客户{customer_id}修改完毕")
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或姓名")
def display_customer(self):
"""打印所有客户信息"""
if len(self.customer_id_dict) == 0:
print("暂无客户信息")
for i in self.customer_id_dict:
print(self.customer_id_dict[i])
def start(self):
"""启动客户管理系统"""
try:
while True:
self.display_menu()
choice = input("<< ")
match choice:
case "1":
self.add_customer()
case "2":
self.delete_customer()
case "3":
self.update_customer()
case "4":
self.search_customer()
case "5":
self.display_customer()
case "6":
print("退出客户管理系统")
break
case _:
print(">> ???")
time.sleep(1)
except (EOFError, KeyboardInterrupt):
print("退出客户管理系统")
if __name__ == "__main__":
cms = CMS()
cms.start()