python 客户管理系统 增删改查 以及 用户带权限的功能。

news2024/11/15 8:43:04

# 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7.JDK下载和安装

文章目录 一、下载二、安装三、JDK的安装目录介绍 写JAVA代码不是随随便便能写的&#xff0c;我们得先做一点准备工作。例如&#xff0c;我们平时想要玩一把游戏&#xff0c;就需要先下载、安装才能玩游戏。JAVA也是一样的&#xff0c;也是需要下载并安装相关的软件&#xff0c…

win10休眠功能误删了

背景&#xff1a; 今天用某电脑管家清理C盘&#xff0c;不小心把休眠文件给删了&#xff0c;结果电脑失去了休眠功能。这玩意对我太重要了&#xff0c;我合上盖子就是要电脑休眠带走的。于是开始找办法&#xff0c;终于在官网找到了。并且恢复成功。 话不多说直接上技能&#…

浏览器如何渲染页面

浏览器渲染页面的过程是一个多步骤的复杂流程&#xff0c;下面我将通过一个简单的例子来逐步说明这一过程&#xff1a; 以下是浏览器渲染该页面的主要步骤&#xff1a; 请求HTML文档&#xff1a; 用户在浏览器中输入URL并回车&#xff0c;浏览器向服务器发送HTTP请求。 服务器…

Spring面试题整理(持续更新)

Spring框架中的单例Bean是线程安全的吗&#xff1f; Spring中的Bean默认是单例模式的&#xff0c;框架并没有对bean进行多线程的封装处理。如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证&#xff0c;最简单的办法就是改变bean的作用域 把 "singleton"…

【YOLOv5改进系列(5)】高效涨点----添加密集小目标检测NWD方法

文章目录 &#x1f680;&#x1f680;&#x1f680;前言一、1️⃣ 修改loss.py文件1.1 &#x1f393; 修改11.2 ✨ 修改21.3 ⭐️相关代码的解释 二、2️⃣NWD实验2.1 &#x1f393; 实验一&#xff1a;基准模型2.2 ✨实验二&#xff1a;NWD权重设置0.52.3 ⭐️实验三&#xf…

安捷伦Agilent E5071B网络分析仪

181/2461/8938产品概述&#xff1a; Agilent E5071B 网络分析仪可为射频组件提供快速、准确的测量。与同类网络分析仪相比&#xff0c;其宽动态范围和低迹线噪声可实现更高的测试质量和吞吐量。内置 2、3 和 4 个测试端口可同时测量具有最多四个端口的组件的所有信号路径。Agi…

大促销活动时期如何做好DDoS防护?

每一次活动大促带来的迅猛流量&#xff0c;对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意DDoS攻击&#xff0c;无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量DDoS攻击&#xff0c;且对延迟敏感&#xff0c;因此只需要在活动期间按需使用DDoS防护。本…

设置asp.net core WebApi函数输入和返回类型中的属性名称开头大小写格式

以下列类型定义为例创建简单的ASP.NET Core的WebApi函数&#xff0c;此时输入参数和返回结果的属性名称开头默认为小写&#xff0c;如下图所示。 public class UserInfo { public string UserName { get; set; }public string UserSex { get; set; }public string UserP…

腾讯云免费云服务器申请流程详解

随着云计算的普及&#xff0c;越来越多的企业和个人开始选择使用云服务器。腾讯云作为国内领先的云计算服务提供商&#xff0c;为用户提供了丰富的云产品和服务。本文将为大家详细介绍腾讯云免费云服务器的申请流程。 一、注册腾讯云账号 首先&#xff0c;需要注册一个腾讯云账…

Qt 压缩/解压文件

前面讲了很多Qt的文件操作&#xff0c;文件操作自然就包括压缩与解压缩文件了&#xff0c;正好最近项目里要用到压缩以及解压缩文件&#xff0c;所以就研究了一下Qt如何压缩与解压缩文件。 QZipReader/QZipWriter QZipReader 和 QZipWriter 类提供了用于读取和写入 ZIP 格式文…

Healix Protocol 的 HLX 通证预售:医疗领域的未来展望

Healix Protocol推出 HLX 通证预售&#xff0c;将带来医疗领域的重要变革。通过其区块链技术&#xff0c;Healix Protocol致力于重新定义医疗服务的可及性与负担性&#xff0c;成为医疗行业的希望之光。该项目旨在增强透明度、可及性和效率&#xff0c;推动医疗体系向更加公平和…

Shut down, sleep, or hibernate your PC 关闭、睡眠或休眠

最近一段时间没有整服务器了~自己开始捉摸18年买的笔记本-x280&#xff0c;除了发现usb type c和thunderbolt 3接口的不一样外&#xff0c;也开始研究这个待机的功能了~找了官方文档&#xff0c;做个简易的翻译&#xff0c;给大家一起看看学习把。 关于Windows的 “睡眠” 和 …

【网络】:数据链路层

数据链路层 一.以太网帧格式二.认识MTU三.ARP协议1.ARP协议的工作流程2.ARP数据报的格式3.ARP欺骗 四.其他重要协议或技术1.DNS2.ICMP协议3.NAT技术&#xff08;重点&#xff09;4.代理服务器 五.一些问题 认识以太网 “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含…

mysql 索引 B+tree

B树&#xff08;BTree&#xff09;&#xff1a; 结构&#xff1a; B树是一种自平衡的多路查找树&#xff0c;每个节点可以拥有M个子节点&#xff08;M通常是一个较大的常数&#xff0c;比如几百&#xff09;&#xff0c;每个节点最多含有M-1个键和M个指向子节点的指针。叶子节点…

C++类模板详解

在学习类模板之前可以了解一下函数模板&#xff0c;可以参考我的另一篇文章C函数模板详解&#xff08;结合代码&#xff09;-CSDN博客 讲解的比较详细&#xff0c;有助于理解类模板。 目录 1、什么是类模板&#xff1f; 2、类模板与函数模板区别 3、类模板对象做函数参数 …

《早起的奇迹》要么躺在床上等待生活的暴击,要么早起创造奇迹 - 三余书屋 3ysw.net

精读文稿 今天我们讲述的是关于《早起的奇迹》。通过神奇的早起&#xff0c;我们可以获得改变人生的力量。首先我要给你讲一个故事&#xff0c;这个故事的主人公是一个年轻人&#xff0c;他在少年时就取得了巨大的成就&#xff0c;在15岁时他已经拥有了自己的电台节目&#xff…

Failed to load plugin because libnvinfer.so.8: 无法打开共享目标文件: 没有那个文件或目录

首先查看自己是否安装了tensorrt&#xff08;如果没有&#xff0c;就先执行下面安装&#xff09; pip install tensorrt控制台输入如下代码&#xff0c;查看tensorrt包的路径 python3 -c "import tensorrt; print(tensorrt.__path__)"找到自己安装包的对应路径 3.…

鸿蒙OS开发实例:【工具类封装-http请求】

import http from ohos.net.http; import promptAction from ohos.promptAction; 封装HTTP接口请求类&#xff0c;提供格式化的响应信息输出功能。 使用 DevEco Studio 3.1.1 Release 及以上版本&#xff0c;API 版本为 api 9 及以上。 示例&#xff1a; import { MyHttpUtil…

centos安装jdk的坑

文章目录 一、安装jdk二、查找jdk的目录三、配置JAVA_HOME 一、安装jdk 我们一般用yum search java | grep jdk查询可以安装的jdk 但是一定要注意如下图&#xff0c;必须知道jdk和jre的区别 yum install java-1.8.0-openjdk-devel.x86_64二、查找jdk的目录 用如下命令 sudo…