请选择 进入手机版 | 继续访问电脑版

项目:ATM+购物车(超级详解,已完结)

[复制链接]
小小海 发表于 2021-1-2 12:16:45 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
  python底子要打牢,ATM+购物车拿来练手不错,别的也可以相识开发软件的流程。总之感觉nice()。
  2020.12.31本日是2020年最后一天,意义非凡,ATM+购物车是我第一次写的比力正规巨大的项目……原谅我没做过课设,感觉实在用三层架构来写也没那么难。(不外我筹划上周天和上周一写完的…执行力不敷)且当跨年礼物吧…2021再继续哈哈哈哈哈。

文章目次



一、 需求分析

模仿实现一个ATM + 购物商城步调
  1. 1. 额度 15000或自界说  ==》注册功能2.实现购物商城,买东西到场 购物车,调用信用卡接口结账 ==》购物功能、支付功能3.可以提现,手续费5% ==》提现功能4.支持多账户登录 ==》登岸功能5.支持账户间转账 ==》转账功能6.记载日常消费流水 ==》记载流水功能7.提供还款接口 ==》还款功能8.ATM记载操纵日志 ==》日志功能9.提供管理接口,包罗添加账户、用户额度,冻结账户等。。。==》管理功能10.用户认证用装饰器==》登岸认证装饰器"用户视图层" 展示给用户选择的功能    1、注册功能    2、登录功能    3、查察余额    4、提现功能    5、还款功能    6、转账功能    7、查察流水    8、购物功能    9、查察购物车    10、管理员功能
复制代码
二、步调的架构分析

一个项目怎么从无到有

1.1需求分析

客户提出需求,公司拿到项目
——》公司出人去(一般一个前端一个后端)和客户讨论需求、商品需求功能的可实现性、项目代价、开发周期等,得到一个需求文档
——》公司内部开会得到一个开发文档交给差别岗位的步调员开发。
  1.         - Python: 后端,爬虫        - 差别的岗位:        - UI界面设计:            - 设计软件的布局,会分局软件的外观切成一张张图片。                - 前端:            - 拿到UI交给他的图片,然后去搭建网页面。            - 设计一些页面中,哪些位置需要吸收数据,需要举行数据交互。                - 后端:            - 直接核心的业务逻辑,调理数据库举行数据的增删查改。                - 测试:            - 会给代码举行全面测试,好比压力测试,界面测试(CF卡箱子)。                - 运维:            - 摆设项目。
复制代码
1.2步调的架构设计

  1.         1.步调设计的利益         1)思路清晰    2)不会出现写一半代码时推翻重写的情况    3)方便自己或以后的同事更好维护                2.三层架构设计的利益    1)把每个功能都分层三部分,逻辑清晰    2)如果用户更换差别的用户界面或差别,       的数据储存机制都不会影响接口层的核心       逻辑代码,扩展性强。    3)可以在接口层,准确的记载日志与流水。        3.三层架构        一 用户视图层  用于与用户交互的,可以继承用户的输入,打印接口返回的数据。        二 逻辑接口层  继承 用户视图层 通报过来的参数,根据逻辑判断调用数据层加以处置惩罚,并返回一个效果给 用户视图层。         三 数据处置惩罚层  继承接口层通报过来的参数,做数据的处置惩罚    - 生存数据      - 查察数据      - 更新数据    - 删除数据
复制代码
步调架构图:

1.3分任务开发

1.4测试

1.5上线

三、软件开发目次

  1. conf:项目的设置信息core:核心的代码db:数据interface:接口lib:共用的一些功能log:日志readme:先容项目的功能使用等srart.py:项目的启动文件
复制代码

四、创建用户功能字典及搭建用户视图层

core中src代码如下
  1. # 1.注册功能def register():    ...#2.登录功能def login():    ...#3.查察余额def check_banlance():    ...#4.提现功能def withdraw():    ...#5.还款功能def repay():    ...#6.转账功能def transfer():    ...#7.查察流水def check_flow():    ...#8.购物功能def shopping():    ...#9.查察购物车def check_shop_car():    ...#10.管理员功能def admin():    ...fuc_dic = {    '1':register,    '2':login,    '3':check_banlance,    '4':withdraw,    '5':repay,    '6':transfer,    '7':check_flow,    '8':shopping,    '9':check_shop_car,    '10':admin}def run():    while True:        print('''    ====== ATM+购物车======        1、注册功能            2、登录功能            3、查察余额            4、提现功能            5、还款功能            6、转账功能            7、查察流水            8、购物功能            9、查察购物车            10、管理员功能        ====== THE END======        ''')        #继承用户输入        choice = input('请输入下令编号:').strip()        #判断下令编号是否正当        if choice in fuc_dic:            fuc_dic[choice]()        else:            print('请输入正当的下令编号!')
复制代码
start.py代码如下
  1. import osimport sys# 添加表明器的情况变量sys.path.append(os.path.dirname(__file__))from core import srcif __name__ == '__main__':    src.run()
复制代码
五、详细写各个功能

1、注册功能

核心逻辑分析
用户在视图层输入账号和暗码,将账号和暗码交给逻 辑 处置惩罚层,逻辑处置惩罚层调用数据处置惩罚层的功能来判断账号和暗码是否存在。存在与否,则返回相应效果给逻辑处置惩罚层(接口层),若账号暗码存在,则接口层直接返回,若不存在需要接口层需要完成注册功能,接口层需要做的是组织用户的信息,然后调用数据处置惩罚层的功能将用户信息写入相应json文件并返回,最终由接口层将是否注册乐成返回给用户视图层。
  1. def register():    while True:        # 1.用户输入用户名和暗码举行校验        name = input('请输入用户名:').strip()        pwd = input('请输入暗码:').strip()        re_pwd = input('请确认暗码').strip()        # 2.小的逻辑判断        if pwd == re_pwd:            # 调用接口层来判断是否注册乐成            res,tag= user_interface.register_interface(name,pwd)            if res:                print(tag)                break            else:                print(tag)
复制代码
interface中的注册接口
  1. def register_interface(username,password,balance = 15000):    # 1.调用数据处置惩罚层中的select函数会返回用户信息字典大概None    if db_handler.select(username):        return False,'用户已存在,请重新输入!'    else:        password = common.get_pwd_md5(password)        #1.组织用户信息,准备注册        user_dic = {            'username': username,            'password': password,            'balance': balance,            # 用于记任命户流水的列表            'flow': [],            # 用于记任命户购物车            'shop_car': {},            # locked:用于记任命户是否被冻结            # False: 未冻结   True: 已被冻结            'locked': False        }        # 2.调用数据处置惩罚层的生存函数将用户信息写入文件        #暗码加密        db_handler.save(user_dic)        return True, f'{username} 注册乐成!'
复制代码
数据处置惩罚层功能的select功能
  1. def select(username):    # 1.吸收用户名,拼接用户信息的完整json路径    user_path = os.path.join(        settings.BASE_PATH,f'{username}.json'    )    # 2.判断用户json文件是否存在    if os.path.exists(user_path):        with open(user_path,'r',encoding='utf-8') as f:            user_dic = json.load(f)            return user_dic    # 不return默认返回None
复制代码
conf下的设置信息
  1. import osBASE_PATH = os.path.dirname(    os.path.dirname(__file__))
复制代码
lib中的common.py暗码加密功能
  1. # 暗码加密def get_pwd_md5(pwd):    m = hashlib.md5(pwd.encode('utf-8'))    salt = 'wangxunzhidashuaibi'    m.updae(salt.encode('utf-8'))    return m.hexdegist()
复制代码
2、登录功能

核心逻辑分析
用户在视图层输入账号和暗码交给登录接口层,接口层调用数据处置惩罚层的功能来判断用户是否登录乐成,别的加了一个用户的登录状态变量login_user用于记任命户登录状态和一个用户登录认证装饰器。
  1. def login():    while True:        name = input('请输入你的账号:').strip()        password = input('请输入你的暗码:').strip()        # 登录接口:        #登录乐成返回True,登录乐成        res,tag = user_interface.login_interface(name,password)        if res:            global login_user            login_user = name            print(tag)            break        else:            print(tag)
复制代码
interface中的登录接口
  1. def login_interface(name,password):    # 调用数据处置惩罚层的select功能,来校验用户登录是否乐成    # 返回user_dic 大概None    res = db_handler.select(name)    if res:        # 给用户输入的暗码加密        password = common.get_pwd_md5(password)        if password == res.get('password'):            return True,'登录乐成!'        else:            return False,'暗码错误!'    return False,'用户不存在!请重新输入!'
复制代码
用户登录认证
  1. from core import srcdef login_auth(func):    def outter(*args,**kwargs):        if src.login_user:            res = func(*args,**kwargs)            return res        else:            print('未登录,无法使用该功能!请登录!')            src.login()    return outter
复制代码
3、查察余额

核心逻辑分析
用户登录后(未登录会被强制登录),查察余额,直接调用查察余额接口,查察余额接口调用数据处置惩罚层中的功能,完成任务。
  1. @common.login_authdef check_banlance():    #直接调用查察余额接口    #返回余额    banlance = user_interface.check_balance_interface(login_user)    print(f'====用户{login_user}余额为{banlance}====')
复制代码
interface查察余额接口
  1. # 查察余额接口def check_bal_interface(username):    user_dic = db_handler.select(username)    return user_dic['balance']
复制代码
4、提现功能

核心逻辑分析
用户在登录后(未登录会强制登录),在用户视图层输入提现金额,调用接口层中的提现接口,在提现接口中调用了数据处置惩罚层中的功能返回给接口层,接口层完成逻辑处置惩罚后将效果返回视图层。
记载流水和日志:要在接口层接入记载日志的功能。
原因:接口层是处置惩罚逻辑的核心所在,用户每次有提现/还款等功能都需要颠末接口层。
注意:
转账要注意手续费的处置惩罚,以及用户输入的是否为数字等细节判断。
  1. #4.提现功能@common.login_authdef withdraw():    while True:        # 1.让用户输入提现金额        money = input('请输入提现金额:').strip()        # 2.小逻辑判断:判断用户输入的是否为数字        if money.isdigit():            # 调用提现接口层            # 返回(bool,str)            flag,msg=bank_interface.withdraw_interface(login_user,money)            if flag:                print(msg)                break            else:                print(msg)        else:            print('您的输入不正当,请您输入数字,好比1220')
复制代码
interface提现接口
  1. def withdraw_interface(name,money):    #1.拿到用户信息    user_dic = db_handler.select(name)    #2.查察账户的余额    balance = user_dic.get('balance')    #判断余额是否大于提现金额和手续费    if balance >= int(money) * 1.05:        balance -= int(money) * 1.05        user_dic['balance'] = balance        #记载流水        flow =f'用户{name}提现{money}乐成!' \                    f'手续费为{int(money)*0.05},余额为{balance}'        user_dic['flow'].append(flow)        #生存大概更新用户数据        db_handler.save(user_dic)        #流水既输出在屏幕上,也生存在文件中        bank_logger.info(flow)        return True,flow    else:        return False,'提现失败!请重新输入金额!'
复制代码
common.py中日志功能(在接口层记载日志)
  1. def get_logger(log_type):  # log_type ---> user    '''    :param log_type: 好比是 user日志,bank日志,购物商城日志    :return:    '''    # 1、加载日志设置信息    logging.config.dictConfig(        settings.LOGGING_DIC    )    # 2、获取日志对象    logger = logging.getLogger(log_type)    return logger
复制代码
settings.py新增日志设置字典
  1. """logging设置"""# 界说三种日志输特别式 开始standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \                  '[%(levelname)s][%(message)s]'  # 此中name为getlogger指定的名字simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'# 界说日志输特别式 竣事# ****************注意1: log文件的目次# BASE_PATH = os.path.dirname(os.path.dirname(__file__))logfile_dir = os.path.join(BASE_PATH, 'log')# print(logfile_dir)# ****************注意2: log文件名logfile_name = 'atm.log'# 如果不存在界说的日志目次就创建一个if not os.path.isdir(logfile_dir):    os.mkdir(logfile_dir)# log文件的全路径logfile_path = os.path.join(logfile_dir, logfile_name)LOGGING_DIC = {    'version': 1,    'disable_existing_loggers': False,    'formatters': {        'standard': {            'format': standard_format        },        'simple': {            'format': simple_format        },    },    'filters': {},    'handlers': {        # 打印到终端的日志        'console': {            'level': 'DEBUG',            'class': 'logging.StreamHandler',  # 打印到屏幕            'formatter': 'simple'        },        # 打印到文件的日志,收集info及以上的日志        'default': {            'level': 'DEBUG',            'class': 'logging.handlers.RotatingFileHandler',  # 生存到文件            'formatter': 'standard',            'filename': logfile_path,  # 日志文件            'maxBytes': 1024 * 1024 * 5,  # 日志巨细 5M            'backupCount': 5,            'encoding': 'utf-8',  # 日志文件的编码,再也不消担心中文log乱码了        },    },    'loggers': {        # logging.getLogger(__name__)拿到的logger设置        '': {            'handlers': ['default', 'console'],  # 这里把上面界说的两个handler都加上,即log数据既写入文件又打印到屏幕            'level': 'DEBUG',            'propagate': True,  # 向上(更高level的logger)通报        },    },}
复制代码
interface中新增bank_log日志对象
  1. #银行流水日志对象bank_logger = common.get_logger('bank')
复制代码
5、还款功能

核心逻辑分析
用户在视图层输入还款金额,由接口层举行与数据处置惩罚层举行交互,完乐成能。
  1. @common.login_authdef repay():    while True:        money = input('请输入你要还款的金额:').strip()        if money.isdigit():            if eval(money) >=0:                # 接入还款接口                flag,msg = bank_interface.repay_interface(login_user,money)                if flag:                    print(msg)                    break            else:                print('金额不能小于0!请重新输入!')        else:            print('必须输入数字!请重新输入!')
复制代码
interface还款接口
  1. def repay_interface(name,money):    #1.得到用户信息字典    user_dic = db_handler.select(name)    #2.将还款金额到场用户余额    user_dic['balance'] += eval(money)    #3.记载流水    flow = f'====用户{name}还款{money}元乐成,' \           f'现有{user_dic["balance"]}元===='    bank_logger.info(flow)    #4.生存大概更新用户信息    db_handler.save(user_dic)    return True,flow
复制代码
6、转账功能

核心逻辑分析
用户输入要转入的账户和金额,传入转账接口,转账接口使用数据处置惩罚层的select和save完乐成能。
  1. def transfer():    while True:        #1.吸收转账对象及金额        name = input('请输入你要转账对象:').strip()        money = input('请输入你要转账金额:').strip()        #2.判断用户输入的金额是否为数字以及是否>0        if money.isdigit():            if eval(money) > 0:                flag,msg=bank_interface.transfer_interface(name,money)                if flag:                    print(msg)                    break                else:                    print(msg)            else:                print('转账金额必须大于0!')        else:            print('必须输入数字!')
复制代码
转账接口
  1. def transfer_interface(name,money):    #1.判断被转账用户是否存在    #接入数据处置惩罚层的查找功能,返回user_dic 大概None    res = db_handler.select(name)    if not res:        return False,'目的用户不存在!'    #2.获取当前用户数据    user_dic = db_handler.select(src.login_user)    #3.判断当前用户的余额是否够转账    money = eval(money)    if user_dic.get('balance') > money:        user_dic['balance'] -= money        res['balance'] += money    else:        return False,'用户的钱不敷转账!'    #4.记载流水    from_log_flow = f'用户给用户{name}转账{money}元乐成!'    user_dic['flow'].append(from_log_flow)    to_user_flow = f'用户继承用户{src.login_user}转账{money}元乐成!'    res['flow'].append(to_user_flow)    bank_logger.info(f'用户{src.login_user}给用户{name}转账{money}元乐成!')    #5.更新用户数据    db_handler.save(user_dic)    db_handler.save(res)    return True,from_log_flow
复制代码
7、查察流水

核心逻辑分析
用户在视图层选择查察流水功能,调用查察流水接口,流水接口调用数据处置惩罚层的查察功能完乐成能。
  1. #7.查察流水@common.login_authdef check_flow():    #接入查察流水接口    res = bank_interface.check_flow_interface(login_user)    if res:        n = 1        for i in res:            print(f'{n}:{i}')            n+=1    else:        print('用户{name}无流水记载!')
复制代码
查察流水接口
  1. def check_flow_interface(login_user):    user_dic = db_handler.select(login_user)    return user_dic.get('flow')
复制代码
8、购物功能

核心逻辑分析
用户在视图层选择购物后==》
看到商品信息==》
选择购物/支付/到场购物车==》
  1. 1.购物:需要对用户输入的指令举行判断2.支付:盘算当前购物车总耗费,接入支付接口,完成支付3.到场购物车:读取之前的购物车,若存在到场重复的商品        名,则数量增加,否则新增购物,最后更新购物车
复制代码
  1. #8.购物功能@common.login_authdef shopping():    # 1.打印商品信息    shop_list = []    print(&#39;============欢迎来到有趣用品商城============&#39;)    with open(r&#39;F:\ATM+购物车\db\shoppings.txt&#39;,encoding=&#39;utf-8&#39;) as f:        n = 1 # 记载商品编号        for line in f:            shop_name,shop_price  = line.strip().split(&#39;:&#39;)            shop_price = eval(shop_price)            shop_list.append((shop_name,shop_price))            print(f&#39;商品编号:{n},&#39;                  f&#39;商品名称:{shop_name},&#39;                  f&#39;商品单价:{shop_price}&#39;)            n+=1    print(&#39;================24小时服务================&#39;)    # 2.初始化购物车    shopping_car = {}    #3.模仿用户购物    while True:        choice = input(&#39;请输入商品编号(若结账输入y 添加购物车输入n):&#39;).strip()        #3.1选择结账        if choice == &#39;y&#39;:            # 判断购物车是否为空 ==》            #空==》不能支付            #否则==》调用支付接口            if not shopping_car:                print(&#39;购物车为空,无法支付!&#39;)            else:                #调用商品结算接口                flag,msg=shop_interface.shopping_interface(shopping_car,login_user)                if flag:                    print(msg)                    break                else:                    print(msg)        elif choice == &#39;n&#39;:            #判断购物车内是否为空            # 空==》提示用户选择商品            # 非空 ==》代表用户选择了商品到场了购物车            if not shopping_car:                print(&#39;当前购物车为空,请在该购物车内添加商品!&#39;)            else:                #接入添加购物车接口                res = shop_interface.add_shop_car(login_user,shopping_car)                if res:                    print(&#39;添加购物车乐成!&#39;)                    break                else:                    print(&#39;添加购物车失败!&#39;)        else:            #模仿用户选择商品            #判断用户输入的编号是否正当            if not choice.isdigit():                print(&#39;请输入数字编号!&#39;)            elif not type(eval(choice)) is  int:                print(&#39;请输入整数编号!&#39;)            elif eval(choice) > n or eval(choice) < 1:                print(&#39;请输入1-{n}内的编号!&#39;)            else:                #获取用户所选商品的名字和单价                shop_name,shop_price = shop_list[eval(choice)-1]                #接纳{&#39;name&#39;:[price,number]}形式组织购物车                if shop_name in shopping_car:                    shopping_car[shop_name][1]+=1                else:                    shopping_car[shop_name] = [shop_price,1]                print(f&#39;当前购物车{shopping_car}&#39;)
复制代码
商品结算接口和添加购物车接口
  1. #商品结算接口def shopping_interface(shopping_car,name):    #1.盘算用户商品总花销    cost= 0    # 接纳{&#39;name&#39;:[price,number]}形式组织购物车    for i in shopping_car.values():        price,number = i        cost+=price*number    #2.支付    #调用银行支付接口    flag,msg=bank_interface.pay_interface(name,cost)    return flag,msg#添加购物车接口def add_shop_car(name,shopping_car):    # 获取用户购物车    use_dic = db_handler.select(name)    user_car = use_dic[&#39;shop_car&#39;]    #添加购物车    for shop_name,shop_price_num in shopping_car.items():        shop_price,shop_num  = shop_price_num        #判断商品在不在购物车内里,若在则数量增加        #否则将商品添加到购物车里        #购物车组织{商品名:[单价,数量]}        if shop_name in user_car:            use_dic[&#39;shop_car&#39;][shop_name][1] += shop_num        else:            use_dic[&#39;shop_car&#39;][shop_name] = [shop_price,shop_num]            #等同于use_dic[&#39;shop_car&#39;].update({shop_name:[shop_price,shop_num]})        #更新购物车数据        db_handler.save(use_dic)        return True
复制代码
支付接口
  1. # 支付接口def pay_interface(login_user, cost):    user_dic = db_handler.select(login_user)    # 判断用户金额是否足够    if user_dic.get(&#39;balance&#39;) >= cost:        # 减钱        user_dic[&#39;balance&#39;] -= cost        # 记载消费流水        flow = f&#39;用户消费金额: [{cost}$]&#39;        user_dic[&#39;flow&#39;].append(flow)        # 生存数据        db_handler.save(user_dic)        # return True 或 return False 交给购物接口来做处置惩罚        return True    return False
复制代码
9、查察购物车

核心逻辑分析
和查察余额一样,直接调用接口层,使用数据处置惩罚层查察功能完成任务。
  1. #9.查察购物车@common.login_authdef check_shop_car():    #调用查察购物车接口    res = shop_interface.check_spc(login_user)    if res:        for i in res:            print(i)    else:        print(&#39;用户购物车内没东西!&#39;)
复制代码
查察购物车接口
  1. def check_spc(name):    user_dic = db_handler.select(name)    shop_car = user_dic[&#39;shop_car&#39;]    return shop_car
复制代码
10、管理员功能

核心逻辑分析
有点像写一个小的ATM+购物车,只不外功能不一样。
  1. 管理员需要有的功能分析如下:1.添加用户2.修改用户额度3.冻结用户与写整个项目差别,管理员功能相对来说比力独立,我们在写这个功能的时候,同样接纳三层架构。即管理员视图层=》管理员接口层=》管理员数据处置惩罚层,但这里处置惩罚的是用户的数据,实在也是用户数据处置惩罚层。
复制代码
  1. #添加用户def add_user():    ...#修改用户额度def change_balance():    ...#冻结用户def lock_user():    ...#管理员功能字典admin_dic={}#管理员视图层def admin_run():    print(&#39;=====欢迎进入管理员功能区=====&#39;)   
复制代码
10.1搭建管理员视图层以及管理员功能字典

  1. #管理员功能字典admin_dic={    &#39;0&#39;:[&#39;退出&#39;,None],    &#39;1&#39;:[&#39;添加用户&#39;,add_user],    &#39;2&#39;:[&#39;修改用户额度&#39;,change_balance],    &#39;3&#39;:[&#39;冻结用户&#39;,lock_user]}#管理员视图层def admin_run():    print(&#39;=====欢迎进入管理员功能区=====&#39;)    #展示管理员功能    while True:        for k,v in admin_dic:            print(f&#39;{k}:{v[0]}&#39;)            #管理员选择功能        choice = input(&#39;请输入您想要使用的管理员功能&#39;).strip()                #判断用户输入的正当性        if choice not in admin_dic:            print(&#39;请您输入正当的数字!&#39;)        else:            admin_dic[choice][1]()
复制代码
10.2实现管理员各个功能

1、添加用户功能
  1. #添加用户def add_user():    #相当于注册一个用户    src.register()
复制代码
2、修改用户额度功能
  1. #修改用户额度def change_balance():    #获取要修改对象的账号和所要修改的额度    while True:        name = input(&#39;请输入要修改的账号:&#39;).strip()        balance = input(&#39;请输入要修改的额度:&#39;).strip()        #判断输入额度的正当性        if not balance.isdigit():            print(&#39;输入不正当!&#39;)        else:            #修改用户的额度,调用修改用户额度接口            #修改乐成返回 True和日志            flag,msg = admin_interface.change_balance(name,balance)            if flag:                print(msg)                break            print(msg)
复制代码
修改用户额度接口
  1. #修改用户额度def change_balance(name,money):    #获取用户的信息字典    #接入数据处置惩罚层查察数据:返回用户信息字典大概None    user_dic = db_handler.select(name)    if user_dic:        #修改额度        user_dic[&#39;balance&#39;] = eval(money)        #记载流水        flow = f&#39;管理员{src.login_user}修改{name}用户额度为{money}乐成!&#39;        admin_logger.info(flow)        #生存数据        db_handler.save(user_dic)        return True,flow    return False,&#39;用户不存在!&#39;
复制代码
3、冻结用户功能
  1. #冻结用户def lock_user():    while True:        name = input(&#39;请您输入要冻结的账号名&#39;).strip()        #调用冻结用户接口        flag,msg = admin_interface.lock_user_interface(name)        if flag:            print(msg)            break        print(msg)
复制代码
冻结用户接口
  1. #冻结用户def lock_user_interface(name):    #拿到用户信息字典    user_dic = db_handler.select(name)    if user_dic:        #locked:用于记任命户是否被冻结        # False: 未冻结   True: 已被冻结        user_dic[&#39;locked&#39;] = &#39;True&#39;        #记载日志        msg =f&#39;用户{name}被冻结!&#39;        admin_logger.info(msg)        #生存数据        db_handler.save(user_dic)        return True,msg    return False,&#39;用户不存在!&#39;
复制代码
六、演示视频

ps:ATM+购物车项目压缩包私我

  ATM+购物车


来源:https://blog.csdn.net/qq_49821869/article/details/112007935
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )