Python基础-第 16 章 综合案例:客户信息管理系统

第 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()
相关推荐
用户3721574261351 小时前
如何使用 Python 给 PDF 添加附件:文档附件与附件注释
python
无小道1 小时前
C/C++——可变参数
c语言·开发语言·c++·可变参数
λqaq71 小时前
Redis 数据库基础:安装、5 大核心数据类型与常用命令
linux·数据库·redis·python·缓存
BioRunYiXue1 小时前
科研干货 | IC50全面解读:概念解析、实验设计与数据分析要点
java·开发语言·javascript·人工智能·算法·数据挖掘·数据分析
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day34|AOP 进阶、权限思维导图复盘
java·开发语言·spring boot·学习
天天被压力1 小时前
【零依赖量化数据实战 #31】沪深A实时盘口全景:逐笔·全盘实时·最新价·历史逐笔
java·人工智能·python
WK100%1 小时前
LeetCode双题:滑动窗口破解最小子数组
c++·经验分享·笔记·算法
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.09.02 题目:3875.构造奇偶一致的数组 I
笔记·算法·leetcode
每天吃饭的羊1 小时前
WebAssembly
开发语言·javascript·wasm