# readme 1、csss.py文件 ,他是一个初始化程序,只运行一次即可 2、有一个目录是data,他是保存客户信息和用户信息 3、customer.py保存了一个客户类 4、user.py保存了一个用户类 5、main.py是客户信息管理程序,可以添加客户信息,删除客户信息,修改客户信息,查询客户信息 6、readme是说明文档 7、 manage_tools.py功能代码,实现了 不同权限显示不同信息的功能。 manage_tools.py功能代码,实现了 添加客户功能。 manage_tools.py功能代码,实现了 修改功能。 manage_tools.py功能代码,实现了 删除功能。
#csss.py # 文件说明: # 建立数据源,包括两个客户的信息,三个用户的信息 # 此程序仅需要执行一次即可 # 根据客户姓名当关键字 import shelve from customer import Customer from user import User if __name__ == '__main__': db = shelve.open('data/customer') customer = Customer('永盛科技', '北京海淀区', "大型", "张永盛", "市场总监", "13912345678", 5000000) db[customer.lxr] = customer customer = Customer('永强科技', '山东青岛市', "中型", "王永强", "技术总监", "13912345678", 2000000) db[customer.lxr] = customer db.close() db = shelve.open('data/user') user = User('user1', '123456', 1) db[user.yhm] = user user = User('user2', '123456', 2) db[user.yhm] = user user = User('user3', '123456', 3) db[user.yhm] = user db.close() print("成功建立数据源,包括两个客户的信息,三个用户的信息")
#main.py import shelve from user import User from manage_tools import show, add, modify, delete commands = [show, add, modify, delete] def get_user(): """ 通过控制台获取用户名和密码,制作一个User对象 :return: 返回一个User对象 """ username = input('请输入用户名: ') password = input('请输入密码: ') return User(username, password) def check(db, user): """ 检查用户名和密码是否匹配 :param db: 数据库 :param user: 用户对象 :return: 如果匹配返回True,否则返回False """ for u in db: if user == db[u]: user.lx = db[u].lx # 找到此人,把记录里的类型给user return True return False def menu(): print('-' * 10 + "系统功能" + '-' * 10) menus = """ 1 查看客户信息 2 新增客户信息 3 修改客户信息 4 删除客户信息 5 退出系统""" print(menus) if __name__ == '__main__': db = shelve.open('data/user') print('~' * 20 + "欢迎使用CRM客户管理系统" + '~' * 20) # 一直输入,只有完全匹配才退出 不需要异常处理 while True: user = get_user() if check(db, user): print('登录成功') db.close() break else: print('用户名或密码错误') # #### 以上内容完成 登录的问题 ########### menu() while True: choice = input('请输入功能序号: ') try: choice = int(choice) if choice == 1: commands[0](user) pass elif choice == 2: commands[1](user) pass elif choice == 3: commands[2](user) pass elif choice == 4: commands[3](user) pass elif choice == 5: break else: print('没有此项功能,请重新输入') except ValueError as e: print('输入错误,请重新输入') else: menu() print('程序结束')
#customer.py class Customer: ''' 客户信息 ''' def __init__(self, gsmc, dz, gm, lxr, zw, dh, njyl): """ :param info: 格式【公司名称 地址 规模 联系人 职务 电话 年交易量】 """ self.gsmc = gsmc self.dz = dz self.gm = gm self.lxr = lxr self.zw = zw self.dh = dh self.njyl = njyl def str_nopwd(self): header =[self.gsmc,self.dz,self.gm,self.lxr,self.zw,self.dh,self.njyl] # 使用制表符 \t 分隔各列,并使用制表符 \t 进行对齐 formatted = "{:<15}{:<10}{:<8}{:<10}{:<8}{:<12}{:<12}".format(*header) return formatted def __str__(self): return f"{self.gsmc}\t{self.dz}\t{self.gm}\t{self.lxr}\t{self.zw}\t{self.dh}\t{self.njyl}" def str_pwd(self): dh = self.dh[:3]+"****"+self.dh[7:] header = [self.gsmc, self.dz, self.gm, self.lxr, self.zw, dh, self.njyl] # 使用制表符 \t 分隔各列,并使用制表符 \t 进行对齐 formatted = "{:<15}{:<10}{:<8}{:<10}{:<8}{:<12}{:<12}".format(*header) return formatted def __eq__(self, other): return self.lxr == other.lxr
#user.py class User: def __init__(self, yhm, mm,lx=1): self.yhm = yhm self.mm = mm self.lx = lx def __str__(self): return f"用户名:{self.yhm}, 密码:{self.mm}, 类型:{self.lx}" # 分析两个对象是否相同 def __eq__(self, other): if not isinstance(other, User): # 不是User类型,无法比较 return False return self.yhm == other.yhm and self.mm == other.mm
#manage_tools.py """ 通过权限管理客户信息 包括,查找 增加,修改,删除 """ import shelve import re from customer import Customer def show(user): """ 通过user的类型,显示客户信息 :param user: :return: """ print("显示功能") if user.lx == 3: print('您没有权限查看信息') return elif user.lx in [1, 2]: db = shelve.open('data/customer') header = "序号\t公司名称\t地址\t规模\t联系人\t职务\t电话\t年交易量" # 使用制表符 \t 分隔各列,并使用制表符 \t 进行对齐 formatted_header = "{:<5}{:<15}{:<10}{:<8}{:<10}{:<8}{:<12}{:<12}".format(*header.split('\t')) print(formatted_header) if user.lx == 1: for i, v in enumerate(db): print(" " + str(i + 1) + " " + db[v].str_nopwd()) # 打印不带星的字符串 else: for i, v in enumerate(db): print(" " + str(i + 1) + " ", end="") print(db[v].str_pwd()) # 打印带星的字符串 db.close() return def add(user): """ 添加功能 user类型为1的可以加,其他类型不可以加 :param user: :return: """ print("添加功能") if user.lx != 1: print("您没有权限添加信息") return # 录信息 # 添加: gsmc = "" # 公司名称 while gsmc == "": gsmc = input("请输入公司名称") gsdz = "" # 公司地址 while gsdz == "": gsdz = input("请输入公司地址") gsgm = "" # 公司规模 while gsgm == "": gsgm = input("请输入公司规模(小型 中型 大型)") gslxr = "" # 公司联系人 while gslxr == "": gslxr = input("请输入公司联系人") gszw = "" # 公司联系人职务 while gszw == "": gszw = input("公司联系人职务") gsdh = "" # 公司电话 p = re.compile(r'^1[3456789]\d{9}$') while not p.match(gsdh): gsdh = input("请输入正确公司电话(开头是1,11位的数字)") gsjyl = "" # 年交易量 while gsjyl == "": gsjyl = input("请输入年交易量") # 将信息组成一个实例对象 c = Customer(gsmc=gsmc, dz=gsdz, gm=gsgm, lxr=gslxr, zw=gszw, dh=gsdh, njyl=gsjyl) # 查找此对象是否在表里,如果在,添加失败,如果不存入表 db = shelve.open('data/customer') if c.lxr in db: print("此联系人已存在,添加失败") else: db[c.lxr] = c print("添加成功") pass db.close() pass def modify(user): """ 修改功能 :param user: :return: """ print("修改功能") # 权限 if user.lx in [2, 3]: print("您没有权限修改信息") return # 先列出所有人名单 db = shelve.open('data/customer') header = "序号\t公司名称\t地址\t规模\t联系人\t职务\t电话\t年交易量" # 使用制表符 \t 分隔各列,并使用制表符 \t 进行对齐 formatted_header = "{:<5}{:<15}{:<10}{:<8}{:<10}{:<8}{:<12}{:<12}".format(*header.split('\t')) print(formatted_header) for i, v in enumerate(db): print(" " + str(i + 1) + " " + db[v].str_nopwd()) # 打印不带星的字符串 # 正确输入联系人 gslxr = "" while gslxr == "": gslxr = input("请输入要修改的联系人:") # 查找此人是否存在 # 如果不在 if gslxr not in db: print("此联系人不存在") else: customer = db[gslxr] # 如果在 提示用户输入要修改的列项【公司名称 地址 规模 职务 电话 年交易量】 lm = "" # 列名 while lm not in ["公司名称", "地址", "规模", "职务", "电话", "年交易量"]: lm = input("请输入要修改的列项【公司名称 地址 规模 职务 电话 年交易量】:") tmp = "" if lm == "公司名称": jsdlm = "请输入新的公司名称" while tmp == "": tmp = input(jsdlm) customer.gsmc = tmp elif lm == "地址": jsdlm = "请输入新的地址" while tmp == "": tmp = input(jsdlm) customer.dz = tmp elif lm == "规模": jsdlm = "请输入新的规模" while tmp == "": tmp = input(jsdlm) customer.gm = tmp elif lm == "职务": jsdlm = "请输入新的职务" while tmp == "": tmp = input(jsdlm) customer.zw = tmp elif lm == "电话": p = re.compile(r'^1[3456789]\d{9}$') jsdlm = "请输入正确的新的公司电话(开头是1,11位的数字)" while not p.match(tmp): tmp = input(jsdlm) customer.dh = tmp elif lm == "年交易量": jsdlm = "请输入新的年交易量" while True: try: tmp = int(input(jsdlm)) customer.njyl = tmp except ValueError as e: print("输入错误,请重新输入") else: break db[customer.lxr] = customer print("修改成功") db.close() return def delete(user): """ 删除联系人 :param user: :return: """ print("删除功能") #权限 # 打开数据库 # 先展示所有人 # 提示输入要删除的联系人 # 分析此人是否在表里 # 如果在 # 如果不在 # 关库 # 权限 if user.lx in [2, 3]: print("您没有权限修改信息") return # 先列出所有人名单 db = shelve.open('data/customer') header = "序号\t公司名称\t地址\t规模\t联系人\t职务\t电话\t年交易量" # 使用制表符 \t 分隔各列,并使用制表符 \t 进行对齐 formatted_header = "{:<5}{:<15}{:<10}{:<8}{:<10}{:<8}{:<12}{:<12}".format(*header.split('\t')) print(formatted_header) for i, v in enumerate(db): print(" " + str(i + 1) + " " + db[v].str_nopwd()) # 打印不带星的字符串 # 正确输入联系人 gslxr = "" while gslxr == "": gslxr = input("请输入要修改的联系人:") # 查找此人是否存在 # 如果不在 if gslxr not in db: print("此联系人不存在") else: del db[gslxr] print("删除成功") db.close() pass