模拟实现一个ATM + 购物商城程序

要求:

1、额度 15000或自定义
2、实现购物商城,买东西加入 购物车,调用信用卡接口结账
3、可以提现,手续费5%
4、支持多账户登录
5、支持账户间转账
6、记录每月日常消费流水
7、提供还款接口
8、ATM记录操作日志
9、提供管理接口,包括添加账户、用户额度,冻结账户等。。。
10、用户认证用装饰器

流程图

代码:

优化代码,模块化

    leco@leco:~/PycharmProjects/luxffy/homework/atm$ tree .
    .
    ├── ATM+购物车.bmp                  # 流程图
    ├── bin                  
    │   ├── __init__.py          
    │   └── start.py                   # 启动文件
    ├── conf
    │   ├── __init__.py
    │   └── settings.py                # 全局配置文件
    ├── core
    │   ├── atm.py                     # 主文件
    │   ├── common.py                  # 公共文件
    │   ├── __init__.py 
    │   ├── slog.py                    # 日志文件
    │   └── sys_bill.py                # 流水账文件
    ├── log                            # 购物车,系统,atm,用户信息文件夹(默认不存在,运行时候初始化,相关文件)
    │   ├── atm.log                    # 根据时间记录atm操作
    │   ├── shopping_car.log           # 根据时间记录购物车操作
    │   ├── system.log                 # 根据时间记录系统运行状态
    │   └── user_info                  # 记录用户信息(账号,密码,额度,余额,锁定状态)
    └── readme                         # 程序说明文件
文件代码目录结构
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# print(BASE_DIR)
sys.path.append(BASE_DIR)  #/home/leco/PycharmProjects/luxffy/homework/atm

from core import atm

if __name__ == "__main__":
    atm.main()
bin/start.py
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import os
root_info = {
        "username": "root",
        "password": "root",
        "quota": 15000,
        "balance": 15000,
        "lock": False
    }

# 商品清单列表
product_list = [
    {"name": "电脑", "price": 5000},
    {"name": "鼠标", "price": 300},
    {"name": "电视", "price": 2000},
    {"name": "水果", "price": 800},
]
log_type = {
    "atm": "atm.log",
    "shopping_car": "shopping_car.log",
    "system": "system.log"
}
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# data_name = "data"
data_name = "log"
data_path = os.path.join(BASE_DIR,data_name)
# data_path = BASE_DIR + "/data"
# 数据文件夹
# data_path = "data"
account_file = "user_info"
# 用户账户,密码,余额,额度,锁定状态文件
# account = data_path + "/" + account_file
account = os.path.join(data_path, account_file)

# 收费手续费 5%
ratio = 0.05
conf/settings.py
#!/usr/bin/env python

import os
import shelve
import sys

from conf import settings
from core import shel_file
from core import slog
from core import common
from core import sys_bill


account = settings.account
data_path = settings.data_path
ratio = settings.ratio
sys_login_status = False       # 用户登录了就把这个改成True
sys_login_username = None      # 全部变量记录谁登陆系统
shopping_car = {}


def sys_login(func):
    """
    :param func: 系统三次登录装饰器
    :return:
    """
    def inner(*args, **kwargs):
        all_username_passwd = shel_file.get_all_username_passwd_info(account)
        global sys_login_status, sys_login_username  # 记录系统全局登陆状态和登陆用户

        for count in range(3):
            if not sys_login_status:
                sys_login_username, input_password = common.login_input()
                if not sys_login_username: continue

                if sys_login_username in all_username_passwd:
                    lock_statu = shel_file.get_user_info(account, sys_login_username)["lock"]
                    if lock_statu:
                        print("抱歉该账户 %s 被锁定,请联系管理员" % sys_login_username)
                        sys_logger.error("抱歉该账户 %s 被锁定,请联系管理员" % sys_login_username)
                        break
                    if input_password == all_username_passwd[sys_login_username]:
                        sys_login_status = True
                    else:
                        print("抱歉,密码错误")
                        sys_logger.error("抱歉 %s,你输入的密码错误" % sys_login_username)
                else:
                    print("抱歉,账号不存在")
                    sys_logger.warning("抱歉 %s,账号不存在" % sys_login_username)
        if sys_login_status:
            func(*args, **kwargs)
    return inner



def add_user():
    """
    :return:  创建用户信息
    """
    common.screen_clear()
    username, password = common.login_input()
    all_users_dic = shel_file.get_all_username_passwd_info(account)
    if username in all_users_dic:
        print("抱歉,该用户已经存在")
        sys_logger.warning("抱歉,该用户已经存在")
    else:
        new_user_info = {
            "username": username,
            "password": password,
            "quota": 15000,
            "balance": 15000,
            "lock": False
        }
        shel_file.save_user_info(account, username, new_user_info)
        print("新增用户 %s 创建成功" % username)
        sys_logger.info("新增用户 %s 创建成功" % username)
        common.show_person_data(username)


def del_user():
    count = 0
    all_username_passwd = shel_file.get_all_username_passwd_info(account)
    while True:
        common.screen_clear()
        print("------------------------- 删除用户操作  -------------------------")
        print("当前系统登录用户是: ", sys_login_username)
        count += 1
        username = input("请输入将要被删除的用户名: ").strip()
        if username == "root":
            print("抱歉,你不能删除自己,你是超级管理员啊")
            shopping_car_logger.warning("抱歉,你不能删除自己,你是超级管理员啊")
            break
        elif username in all_username_passwd:
            with shelve.open(account) as fd:
                del fd[username]
                print("用户 %s 已经被删除" % username)
                shopping_car_logger.info("用户 %s 已经被删除" % username)
            break
        elif count == 3:
            print("抱歉,输入次数过多,请稍后再试")
            shopping_car_logger.warning("抱歉,输入次数过多,请稍后再试")
            break
        elif username.lower() == "b":
            break
        else:
            print("抱歉,用户 %s 不存在" % username)
            shopping_car_logger.error("抱歉,用户 %s 不存在" % username)


def show_users():
    for username in shel_file.get_all_username_passwd_info(account):
        common.show_person_data(username)


def modify_user_quota():
    while True:
        common.screen_clear()
        print("------------------------- 用户额度被修改  -------------------------")
        print("当前系统登录用户是:", sys_login_username)
        if sys_login_username == "root":
            name = input("请输入要修改的用户: ")
            if name not in shel_file.get_all_username_passwd_info(account):
                print("抱歉,你输入的用户不存在")
                shopping_car_logger.warning("抱歉,你输入的用户不存在")
                break
        quota = input("请输入额度金额: ")
        if quota.isdigit():
            tmp_user_info = shel_file.get_user_info(account, name)
            tmp_user_info["quota"] = quota
            shel_file.save_user_info(account, name, tmp_user_info)
            break
        else:
            print("抱歉,额度必须是数字")
            shopping_car_logger.warning("抱歉,额度必须是数字")



def add_lock(lock_name, lock=True):
    """
    :param lock_name:  锁定的账号名
    :param lock:      默认锁定账户
    :return:
    """
    user_info = shel_file.get_user_info(account, lock_name)
    user_info["lock"] = True if lock else False
    shel_file.save_user_info(account, lock_name, user_info)


def lock_user():
    """
    通过当前系统账户
    :return:
    """
    all_users_dic = {}
    common.screen_clear()
    all_users_dic = shel_file.get_all_username_passwd_info(account)
    print("------------------------- 冻结账户 -------------------------")
    if sys_login_username != "root":
        user_info = shel_file.get_user_info(account, sys_login_username)
        user_info["lock"] = True
        shel_file.save_user_info(account, sys_login_username, user_info)
        print("用户 %s 已经被锁定,请联系管理员解冻账号" % sys_login_username)
        shopping_car_logger.info("用户 %s 已经被锁定,请联系管理员解冻账号" % sys_login_username)
    else:
        while True:
            lock_user = input("请输入需要被冻结的账号名<b|B 返回上一层>: ").strip()
            if lock_user == "root":
                print("抱歉,你不能冻结你自己,你是超级管理员啊")
                shopping_car_logger.warning("抱歉,你不能冻结你自己,你是超级管理员啊")
                break
            if lock_user in all_users_dic:
                add_lock(lock_user)
                print("用户 %s 已经被锁定" % lock_user)
                shopping_car_logger.info("用户 %s 已经被锁定" % lock_user)
                break
            elif lock_user.lower() == "b":
                break
            else:
                print("抱歉,你要冻结的账号 %s 不存在" % lock_user)
                shopping_car_logger.warning("抱歉,你要冻结的账号 %s 不存在" % lock_user)


def unlock_user():
    while True:
        common.screen_clear()
        all_users_dic = shel_file.get_all_username_passwd_info(account)
        print("------------------------- 解冻账户 -------------------------")
        lock_user = input("请输入需要被解冻的账号名<b|B 返回上一层>: ").strip()
        if lock_user in all_users_dic:
            add_lock(lock_user, lock=False)
            print("亲爱的用户 %s 你的账号已经被解冻" % lock_user)
            shopping_car_logger.info("亲爱的用户 %s 你的账号已经被解冻" % lock_user)
            break
        elif lock_user.lower() == "b":
            break
        else:
            print("抱歉,你要冻结的账号 %s 不存在" % lock_user)
            shopping_car_logger.warning("抱歉,你要冻结的账号 %s 不存在" % lock_user)

def account_balance():
    """
    通过用户名,打印其详细列表,包括余额
    :return: None
    """
    print("------------------------- 账户余额 -------------------------")
    user_info = shel_file.get_user_info(account, sys_login_username)
    msg = """
    ------------ %s 用户信息 ------------ 
        用户  名:   %s                             
        余    额:   %s
        """ % (user_info["username"], user_info["username"], user_info["balance"])
    print(msg)


@sys_login
def shopping():
    common.screen_clear()
    while True:
        product_list = settings.product_list
        user_info = shel_file.get_user_info(account, sys_login_username)
        balance, quota = user_info["balance"], user_info["quota"]  # 当前用户余额,和信用卡剩余额度
        print("
------------------------- 购物 -------------------------")
        print("亲爱的用户 %s你好,你当前的余额 = %s   信用卡额度 = %s" % (sys_login_username, balance, quota))
        for item, p in enumerate(product_list, 1):
            print("%s. %s    价格:  %s" % (item, p['name'], p['price']))
        select = input("请输入商品ID<b|B 返回>: ")
        if select.isdigit():
            if 0 < int(select) < len(product_list) + 1:
                if int(balance) - product_list[int(select) - 1]["price"] > 0:  # 剩余钱充足,不调用信用卡付款
                    print("--> 商品 <%s> 已经被添加到购物车" % product_list[int(select) - 1]["name"])
                    remain_money = int(balance) - product_list[int(select) - 1]["price"]
                    print("亲爱的用户 %s你好,你当前的余额 = %s   信用卡额度 = %s" % (sys_login_username, remain_money, quota))
                    shopping_car_logger.info("--> 商品 <%s> 已经被添加到购物车" % product_list[int(select) - 1]["name"])
                    atm_logger.info("亲爱的用户 %s你好,你当前的余额 = %s   信用卡额度 = %s" % (sys_login_username, remain_money, quota))
                    user_info["balance"] = remain_money
                    shel_file.save_user_info(account, sys_login_username, user_info)
                    if product_list[int(select) - 1]["name"] in shopping_car:
                        number = shopping_car[product_list[int(select) - 1]["name"]]
                        shopping_car[product_list[int(select) - 1]["name"]] = (number + 1)
                    else:
                        shopping_car[product_list[int(select) - 1]["name"]] = 1
                else:  # 余额不足
                    print("你的额度不足,请充值")
                    shopping_car_logger.warning("你的额度不足,请充值")
            else:
                print("抱歉,你输入的商品ID不存在")
                shopping_car_logger.warning("抱歉,你输入的商品ID不存在")
        elif select.lower() == "b":
            break
        else:
            print("抱歉,你输入的商品ID必须为整数")
            shopping_car_logger.warning("抱歉,你输入的商品ID必须为整数")

@sys_login
def recharge():
    """
     为账户充值
    :return: None
    """
    while True:
        common.screen_clear()
        print("------------------------- 充值 -------------------------")
        tmp_user_info = shel_file.get_user_info(account, sys_login_username)
        print("亲爱的用户 %s你好,充值前余额 = %s " % (sys_login_username, tmp_user_info["balance"]))
        recharge_money = input("请输入充值金额: ")
        if recharge_money.isdigit():
            tmp_user_info["balance"] += int(recharge_money)
            shel_file.save_user_info(account, sys_login_username, tmp_user_info)
            print("恭喜,%s 你账户已经成功充值 %s " % (sys_login_username, recharge_money))
            print("亲爱的用户 %s 你好,充值后余额 = %s " % (sys_login_username, tmp_user_info["balance"]))
            atm_logger.info("恭喜,用户 %s你好,你的账户已经成功充值 %s " % (sys_login_username, recharge_money))
            atm_logger.info("亲爱的用户 %s你好,充值后余额 = %s " % (sys_login_username, tmp_user_info["balance"]))
            break
        else:
            print("抱歉,充值金额必须是数字")
            atm_logger.warning("抱歉,充值金额必须是数字")


@sys_login
def shopping_car_manager():
    common.screen_clear()
    if len(shopping_car):
        print(" 购物车清单 ".center(60, "-"))
        for k, v in shopping_car.items():
            print("购买的商品: %s     购买数量: %s" % (k, v))
    else:
        print("购物车空空如也,抓紧去购物吧")
        shopping_car_logger.info("购物车空空如也,抓紧去购物吧")


@sys_login
def settlement():

    print("------------------------- 结算 -------------------------")
    print("功能暂时没开放")
    common.screen_clear()


@sys_login
def transfer_money():
    all_users_dic = shel_file.get_all_username_passwd_info(account)
    tmp_user_info = shel_file.get_user_info(account, sys_login_username)
    current_money = tmp_user_info["balance"]
    common.screen_clear()
    while True:
        print("------------------------- 转账 -------------------------")
        print("当前系统登录用户是: ", sys_login_username)
        print("亲爱的用户 %s你好,汇款前您的余额 = %s" % (sys_login_username, current_money))
        username = input("请输入收款人用户名<b|B 返回上一级>: ")
        if username in all_users_dic:
            if username == sys_login_username:
                print("抱歉亲爱的用户%s 你不能转账给自己" % sys_login_username)
                break
            money = input("请输入汇款金额<b|B 返回上一级>: ").strip()
            if money.isdigit():
                if int(money) > current_money:
                    print("抱歉,你的余额不足")
                    atm_logger.warning("抱歉,你的余额不足")
                else:  # 保存当前汇款方用户余额
                    tmp_user_info = shel_file.get_user_info(account, sys_login_username)
                    tmp_user_info["balance"] = int(current_money) - int(money)
                    shel_file.save_user_info(account, sys_login_username, tmp_user_info)
                    # 保存接受方余额
                    tmp_user_info = shel_file.get_user_info(account, username)
                    tmp_user_info["balance"] = int(money) + tmp_user_info["balance"]
                    shel_file.save_user_info(account, username, tmp_user_info)
                    print("亲爱的用户 %s你好,汇款后您的余额 = %s" % (sys_login_username, int(current_money) - int(money)))
                    atm_logger.info("汇款方 %s,收款方 %s,汇款金额 %s" % (sys_login_username,username,money))
                    break
            elif money.lower() == "b":
                break
            else:
                print("抱歉,输入汇款金额必须是整数")
                atm_logger.warning("抱歉,输入汇款金额必须是整数")
        elif username.lower() == "b":
            break
        else:
            print("抱歉,收款人 %s 不存在" % username)
            atm_logger.warning("抱歉,收款人 %s 不存在" % username)


@sys_login
def cash_withdrawal():
    balance = shel_file.get_user_info(account, sys_login_username)["balance"]
    while True:
        common.screen_clear()
        print("------------------------- 取现 -------------------------")
        print("亲爱的用户 %s你好,你当前的余额 = %s ,取现的手续费比例 = %s" % (sys_login_username, balance, ratio))
        money = input("请输入取款金额<b|B 返回>: ").strip()
        if money.isdigit():
            remain_money = balance - (1 + ratio) * int(money)
            if remain_money > 0:
                print("本次手续费是: %s ,取现后余额是: %s" % (int(money) * ratio, remain_money))
                tmp_user_info = shel_file.get_user_info(account, sys_login_username)
                tmp_user_info["balance"] = remain_money
                shel_file.save_user_info(account, sys_login_username, tmp_user_info)
                break
            else:
                print("抱歉,你的余额不足,无法取现")
                atm_logger.warning("抱歉,你的余额不足,无法取现")
                break

        if money.lower() == "b":
            break
        else:
            print("抱歉,输入取款金额必须是整数")
            atm_logger.warning("抱歉,输入取款金额必须是整数")


@sys_login
def manage_user():
    msg_root_user = """------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    """
    msg_no_root_user = """------------------------- 管理用户操作说明 -------------------------
    5.  冻结账户
    6.  账户余额
    """
    while True:
        print(msg_root_user) if sys_login_username == "root" else print(msg_no_root_user)
        select = input("请选择模式<q|Q 退出> <b|B 返回上一层>: ").strip().lower()
        if select.isdigit():
            if sys_login_username == "root":
                root_account_manage_select.get(select)() if select in root_account_manage_select else print("输入的序号不存在")
            else:
                no_root_account_manage_select.get(select)() if select in no_root_account_manage_select else print("输入的序号不存在")
        elif select == "q":
            sys.exit()
        elif select == "b":
            break
        else:
            print("抱歉输入错误")


@sys_login
def user_bill():
    while True:
        msg_bill = """------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        """
        print(msg_bill)
        if sys_login_username != "root":
            print("抱歉,亲爱的用户 %s,你不是系统管理员你没有此权限,请使用管理员root用户登录查看"  % sys_login_username)
            break
        select = input("请选择模式<q|Q 退出> <b|B 返回上一层>: ").strip().lower()
        if select.isdigit():
            sys_bill.bill_select.get(select)() if select in sys_bill.bill_select else print("输入的序号不存在")
        elif select == "q":
            sys.exit()
        elif select == "b":
            break
        else:
            print("抱歉输入错误")
    common.screen_clear()


user_select = {
    "1": shopping,              # 购物环节
    "2": recharge,              # 充值环节
    "3": shopping_car_manager,  # 购物车管理环节
    "4": settlement,            # 结算环节
    "5": transfer_money,        # 转账环节
    "6": cash_withdrawal,       # 取现环节
    "7": manage_user,           # 管理用户环节
    "8": user_bill,             # 账单环节
}

root_account_manage_select = {
    "1": add_user,              # 新增用户
    "2": del_user,              # 删除用户
    "3": show_users,            # 查看所有用户
    "4": modify_user_quota,     # 修改用户额度
    "5": lock_user,             # 冻结用户
    "6": account_balance,       # 账户余额
    "7": unlock_user,           # 解锁结用户
}

no_root_account_manage_select = {
    "4": modify_user_quota,     # 修改用户额度
    "5": lock_user,             # 冻结用户
    "6": account_balance,       # 账户余额
}
if not os.path.exists(settings.data_path):
    os.mkdir(settings.data_path)

shopping_car_logger = slog.logger('shopping_car.log', "shopping_car")
sys_logger = slog.logger('system.log', "system")
atm_logger = slog.logger('atm.log', "atm")


def main():                            # 主函数
    common.sys_login_info()            # 系统登录提示信息
    common.init_data()                 # 初始化超级管理员数据,并打印相关数据

    sys_logger.info("系统重新启动")
    while True:
        common.sys_operation_info()    # 操作提示
        select = input('请选择模式<q|Q 退出>: ').strip().lower()
        if select.isdigit():
            user_select.get(select)() if select in user_select else print("输入的序号不存在")
        elif select == "q":
            exit()
        else:
            print("请输入正确的序号")
            shopping_car_logger.warning("请输入正确的序号")


if __name__ == "__main__":

    main()
core/atm.py
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import os
import sys
from core import  shel_file
from conf import settings

def init_data():
    """
    初始化 超级管理员数据
    :return: None
    """
    msg = """--------------- 系统超级管理员账户初始化成功 ---------------
1. 账户: root
2. 密码: root
3. 余额: 15000
4. 额度: 15000
请妥善保管好信息"""
    if not os.path.exists(settings.data_path):
        os.mkdir(settings.data_path)
    if not os.path.exists(settings.account):
        shel_file.save_user_info(settings.account, "root", settings.root_info)
        print(msg)


# 登录系统显示样式
def sys_login_info():
    print(''.center(60, '-'))
    print('|', ''.center(56, ' '), '|')
    print('|', '欢迎来到购物广场'.center(48, ' '), '|')
    print('|', ''.center(56, ' '), '|')


def sys_operation_info():
    msg = """------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    """
    print(msg)

def show_person_data(username):
    """
    格式化输出用户信息
    :param username: 用户名
    :return: None
    """
    user_info = shel_file.get_user_info(settings.account, username)
    msg = """
    ------------ %s 用户信息 ------------ 
    用户  名:   %s                             
    密    码:   %s
    余    额:   %s
    额    度:   %s
    锁定状态:  %s 
    """ % (user_info["username"], user_info["username"], user_info["password"],
           user_info["balance"], user_info["quota"], user_info["lock"])
    print(msg)

def login_input():
    """
    获取用户输入的账号和密码
    :return:  None
    """
    user = input("请输入用户名: ").strip()
    passwd = input("请输入密码: ").strip()
    return user,  passwd


def screen_clear():
    """
    清屏
    :return: None
    """
    os.system("clear") if sys.platform == "linux" else os.system("cls")
core/common.py
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import shelve

def get_user_info(account, username):
    """
    :param account:  存储用户账号,密码,额度,余额,锁定状态的文件
    :param username: 用户名
    :return: 返回字典内容为用户账号,密码,额度,余额,锁定状态
    """
    with shelve.open(account) as fd:
        ret = fd.get(username)
    return ret


def get_all_username_passwd_info(account):
    """
    从存储用户账号,密码,额度,余额,锁定状态文件切出所有用户名和密码组成的键值对的字典
    :param account:
    :return: 字典(用户名和对应的密码组成的键值对)
    """
    all_users_dic = {}
    with shelve.open(account) as fd:
        all_users_list = list(fd.keys())
        for username in all_users_list:
            all_users_dic[username] = fd[username]["password"]
    return all_users_dic


def save_user_info(account, username, user_info):
    """
    :param account: 存储用户账号文件
    :param username: 用户账号
    :param user_info: 账号相关(用户名,密码,余额,信用度,锁定状态)
    :return:
    """
    with shelve.open(account) as fd:
        fd[username] = user_info
core/shel_file.py
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import logging

from conf import settings

# # 日志记录
# def logger(logfilename, logfile):
#     logger_fh = logging.FileHandler(settings.data_path + "/" + logfilename)
#     logger_fh.setLevel(logging.INFO)
#     # formatter
#     formatter = logging.Formatter('%(asctime)s - %(name)s - %(filename)s - %(message)s')
#     # bind formatter to ch
#     logger_fh.setFormatter(formatter)
#     logger = logging.getLogger(logfile)
#     logger.setLevel(logging.DEBUG)
#     logger.addHandler(logger_fh)
#     return logger

# 日志记录
def logger(logfilename, logfile):
    logger_fh = logging.FileHandler(settings.data_path + "/" + logfilename)
    logger_fh.setLevel(logging.INFO)
    logger_ch = logging.StreamHandler()
    logger_ch.setLevel(logging.INFO)
    # formatter
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(filename)s - %(message)s')
    ch_formatter = logging.Formatter('%(message)s')
    # bind formatter to ch
    logger_fh.setFormatter(formatter)
    logger_ch.setFormatter(ch_formatter)

    logger = logging.getLogger(logfile)
    logger.setLevel(logging.DEBUG)
    logger.addHandler(logger_fh)
    # logger.addHandler(logger_ch)
    return logger
core/slog.py
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)  #/home/leco/PycharmProjects/luxffy/homework/atm

from conf import settings

def display_file(file):
    if not os.path.exists(file):
        print("%s log is not exist" % file)
    else:
        if os.path.getsize(file) > 0:  # 判断流水账单文件大小,若是0 就表示暂时还么有产生
            with open(file,"r") as fd:
                for line in fd:
                    print(line,end="")
        else:
            print("抱歉,此账单还没有流水")

def shopping_car_bill():
    display_file(os.path.join(settings.data_path, settings.log_type["shopping_car"]))


def atm_bill():
    display_file(os.path.join(settings.data_path, settings.log_type["atm"]))


def system_bill():
    display_file(os.path.join(settings.data_path,settings.log_type["system"]))


bill_select = {
    "1": shopping_car_bill,     # 购物流水清单
    "2": atm_bill,              # atm流水清单
    "3": system_bill,           # 系统流水清单
}


if __name__ == "__main__":
    shopping_car_bill()
    atm_bill()
    system_bill()
core/sys_bill.py

终端测试

[BEGIN] 2018/1/31 14:12:13
leco@leco:~/PycharmProjects/luxffy/homework/atm$ tree .
.
├── ATM+购物车.bmp
├── bin
│?? ├── __init__.py
│?? └── start.py
├── conf
│?? ├── __init__.py
│?? ├── __pycache__
│?? │?? ├── __init__.cpython-35.pyc
│?? │?? └── settings.cpython-35.pyc
│?? └── settings.py
├── core
│?? ├── atm.py
│?? ├── common.py
│?? ├── __init__.py
│?? ├── __pycache__
│?? │?? ├── atm.cpython-35.pyc
│?? │?? ├── common.cpython-35.pyc
│?? │?? ├── __init__.cpython-35.pyc
│?? │?? ├── shel_file.cpython-35.pyc
│?? │?? ├── slog.cpython-35.pyc
│?? │?? └── sys_bill.cpython-35.pyc
│?? ├── shel_file.py
│?? ├── slog.py
│?? └── sys_bill.py
└── readme.md

5 directories, 20 files
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
--------------- 系统超级管理员账户初始化成功 ---------------
1. 账户: root
2. 密码: root
3. 余额: 15000
4. 额度: 15000
请妥善保管好信息
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 1
请输入用户名: root
请输入密码: root

------------------------- 购物 -------------------------
亲爱的用户 root你好,你当前的余额 = 15000   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: 1
--> 商品 <电脑> 已经被添加到购物车
亲爱的用户 root你好,你当前的余额 = 10000   信用卡额度 = 15000

------------------------- 购物 -------------------------
亲爱的用户 root你好,你当前的余额 = 10000   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: 2
--> 商品 <鼠标> 已经被添加到购物车
亲爱的用户 root你好,你当前的余额 = 9700   信用卡额度 = 15000

------------------------- 购物 -------------------------
亲爱的用户 root你好,你当前的余额 = 9700   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: 3
--> 商品 <电视> 已经被添加到购物车
亲爱的用户 root你好,你当前的余额 = 7700   信用卡额度 = 15000

------------------------- 购物 -------------------------
亲爱的用户 root你好,你当前的余额 = 7700   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: 4
--> 商品 <水果> 已经被添加到购物车
亲爱的用户 root你好,你当前的余额 = 6900   信用卡额度 = 15000

------------------------- 购物 -------------------------
亲爱的用户 root你好,你当前的余额 = 6900   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: 5
抱歉,你输入的商品ID不存在

------------------------- 购物 -------------------------
亲爱的用户 root你好,你当前的余额 = 6900   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: as
抱歉,你输入的商品ID必须为整数

------------------------- 购物 -------------------------
亲爱的用户 root你好,你当前的余额 = 6900   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: b
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 3
-------------------------- 购物车清单 ---------------------------
购买的商品: 电脑     购买数量: 1
购买的商品: 电视     购买数量: 1
购买的商品: 水果     购买数量: 1
购买的商品: 鼠标     购买数量: 1
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 2
------------------------- 充值 -------------------------
亲爱的用户 root你好,充值前余额 = 6900 
请输入充值金额: 3100
恭喜,root 你账户已经成功充值 3100 
亲爱的用户 root 你好,充值后余额 = 10000 
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 1
请输入用户名: cc
请输入密码: cc
新增用户 cc 创建成功

    ------------ cc 用户信息 ------------ 
    用户  名:   cc                             
    密    码:   cc
    余    额:   15000
    额    度:   15000
    锁定状态:  False 
    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 1  
请输入用户名: cc
请输入密码: cc
抱歉,该用户已经存在
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 1
请输入用户名: cmz
请输入密码: cmz
新增用户 cmz 创建成功

    ------------ cmz 用户信息 ------------ 
    用户  名:   cmz                             
    密    码:   cmz
    余    额:   15000
    额    度:   15000
    锁定状态:  False 
    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 2
------------------------- 删除用户操作  -------------------------
当前系统登录用户是:  root
请输入将要被删除的用户名: root
抱歉,你不能删除自己,你是超级管理员啊
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 2
------------------------- 删除用户操作  -------------------------
当前系统登录用户是:  root
请输入将要被删除的用户名: cc
用户 cc 已经被删除
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 3

    ------------ root 用户信息 ------------ 
    用户  名:   root                             
    密    码:   root
    余    额:   10000
    额    度:   15000
    锁定状态:  False 
    

    ------------ cmz 用户信息 ------------ 
    用户  名:   cmz                             
    密    码:   cmz
    余    额:   15000
    额    度:   15000
    锁定状态:  False 
    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 4
------------------------- 用户额度被修改  -------------------------
当前系统登录用户是: root
请输入要修改的用户: root
请输入额度金额: 20000
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 3

    ------------ root 用户信息 ------------ 
    用户  名:   root                             
    密    码:   root
    余    额:   10000
    额    度:   20000
    锁定状态:  False 
    

    ------------ cmz 用户信息 ------------ 
    用户  名:   cmz                             
    密    码:   cmz
    余    额:   15000
    额    度:   15000
    锁定状态:  False 
    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 5
------------------------- 冻结账户 -------------------------
请输入需要被冻结的账号名<b|B 返回上一层>: leco
抱歉,你要冻结的账号 leco 不存在
请输入需要被冻结的账号名<b|B 返回上一层>: cmz
用户 cmz 已经被锁定
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 7
------------------------- 解冻账户 -------------------------
请输入需要被解冻的账号名<b|B 返回上一层>: leco
抱歉,你要冻结的账号 leco 不存在
------------------------- 解冻账户 -------------------------
请输入需要被解冻的账号名<b|B 返回上一层>: cmz
亲爱的用户 cmz 你的账号已经被解冻
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 6
------------------------- 账户余额 -------------------------

    ------------ root 用户信息 ------------ 
        用户  名:   root                             
        余    额:   10000
        
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: b
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 5
------------------------- 转账 -------------------------
当前系统登录用户是:  root
亲爱的用户 root你好,汇款前您的余额 = 10000
请输入收款人用户名<b|B 返回上一级>: cc
抱歉,收款人 cc 不存在
------------------------- 转账 -------------------------
当前系统登录用户是:  root
亲爱的用户 root你好,汇款前您的余额 = 10000
请输入收款人用户名<b|B 返回上一级>: leco
抱歉,收款人 leco 不存在
------------------------- 转账 -------------------------
当前系统登录用户是:  root
亲爱的用户 root你好,汇款前您的余额 = 10000
请输入收款人用户名<b|B 返回上一级>: cmz
请输入汇款金额<b|B 返回上一级>: 5000
亲爱的用户 root你好,汇款后您的余额 = 5000
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 3

    ------------ root 用户信息 ------------ 
    用户  名:   root                             
    密    码:   root
    余    额:   5000
    额    度:   20000
    锁定状态:  False 
    

    ------------ cmz 用户信息 ------------ 
    用户  名:   cmz                             
    密    码:   cmz
    余    额:   20000
    额    度:   15000
    锁定状态:  False 
    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 7
------------------------- 解冻账户 -------------------------
请输入需要被解冻的账号名<b|B 返回上一层>: cmz 
亲爱的用户 cmz 你的账号已经被解冻
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: q
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: cmz
请输入正确的序号
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 1
请输入用户名: cmz
请输入密码: cmz

------------------------- 购物 -------------------------
亲爱的用户 cmz你好,你当前的余额 = 20000   信用卡额度 = 15000
1. 电脑    价格:  5000
2. 鼠标    价格:  300
3. 电视    价格:  2000
4. 水果    价格:  800
请输入商品ID<b|B 返回>: b
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: q
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7
请输入用户名: root
请输入密码: root
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 3

    ------------ root 用户信息 ------------ 
    用户  名:   root                             
    密    码:   root
    余    额:   5000
    额    度:   20000
    锁定状态:  False 
    

    ------------ cmz 用户信息 ------------ 
    用户  名:   cmz                             
    密    码:   cmz
    余    额:   20000
    额    度:   15000
    锁定状态:  False 
    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 6^Quit (core dumped)
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7
请输入用户名: root
请输入密码: root
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 5
------------------------- 冻结账户 -------------------------
请输入需要被冻结的账号名<b|B 返回上一层>: cmz
用户 cmz 已经被锁定
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: q
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 1
请输入用户名: cmz
请输入密码: cmz
抱歉该账户 cmz 被锁定,请联系管理员
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 8
请输入用户名: root
请输入密码: root
------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        
请选择模式<q|Q 退出> <b|B 返回上一层>: 1
2018-01-31 14:12:49,041 - shopping_car - atm.py - --> 商品 <电脑> 已经被添加到购物车
2018-01-31 14:12:49,579 - shopping_car - atm.py - --> 商品 <鼠标> 已经被添加到购物车
2018-01-31 14:12:50,088 - shopping_car - atm.py - --> 商品 <电视> 已经被添加到购物车
2018-01-31 14:12:50,789 - shopping_car - atm.py - --> 商品 <水果> 已经被添加到购物车
2018-01-31 14:12:51,418 - shopping_car - atm.py - 抱歉,你输入的商品ID不存在
2018-01-31 14:12:52,436 - shopping_car - atm.py - 抱歉,你输入的商品ID必须为整数
2018-01-31 14:13:33,720 - shopping_car - atm.py - 抱歉,你不能删除自己,你是超级管理员啊
2018-01-31 14:13:37,323 - shopping_car - atm.py - 用户 cc 已经被删除
2018-01-31 14:14:02,868 - shopping_car - atm.py - 抱歉,你要冻结的账号 leco 不存在
2018-01-31 14:14:10,775 - shopping_car - atm.py - 用户 cmz 已经被锁定
2018-01-31 14:14:17,144 - shopping_car - atm.py - 抱歉,你要冻结的账号 leco 不存在
2018-01-31 14:14:18,208 - shopping_car - atm.py - 亲爱的用户 cmz 你的账号已经被解冻
2018-01-31 14:15:27,865 - shopping_car - atm.py - 亲爱的用户 cmz 你的账号已经被解冻
2018-01-31 14:15:33,096 - shopping_car - atm.py - 请输入正确的序号
2018-01-31 14:16:21,409 - shopping_car - atm.py - 用户 cmz 已经被锁定
------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        
请选择模式<q|Q 退出> <b|B 返回上一层>: 2
2018-01-31 14:12:49,041 - atm - atm.py - 亲爱的用户 root你好,你当前的余额 = 10000   信用卡额度 = 15000
2018-01-31 14:12:49,579 - atm - atm.py - 亲爱的用户 root你好,你当前的余额 = 9700   信用卡额度 = 15000
2018-01-31 14:12:50,089 - atm - atm.py - 亲爱的用户 root你好,你当前的余额 = 7700   信用卡额度 = 15000
2018-01-31 14:12:50,790 - atm - atm.py - 亲爱的用户 root你好,你当前的余额 = 6900   信用卡额度 = 15000
2018-01-31 14:13:03,436 - atm - atm.py - 恭喜,用户 root你好,你的账户已经成功充值 3100 
2018-01-31 14:13:03,436 - atm - atm.py - 亲爱的用户 root你好,充值后余额 = 10000 
2018-01-31 14:15:00,781 - atm - atm.py - 抱歉,收款人 cc 不存在
2018-01-31 14:15:02,235 - atm - atm.py - 抱歉,收款人 leco 不存在
2018-01-31 14:15:06,831 - atm - atm.py - 汇款方 root,收款方 cmz,汇款金额 5000
------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        
请选择模式<q|Q 退出> <b|B 返回上一层>: 3
2018-01-31 14:12:40,802 - system - atm.py - 系统重新启动
2018-01-31 14:13:17,703 - system - atm.py - 新增用户 cc 创建成功
2018-01-31 14:13:22,467 - system - atm.py - 抱歉,该用户已经存在
2018-01-31 14:13:28,041 - system - atm.py - 新增用户 cmz 创建成功
2018-01-31 14:15:31,104 - system - atm.py - 系统重新启动
2018-01-31 14:15:51,322 - system - atm.py - 系统重新启动
2018-01-31 14:16:10,239 - system - atm.py - 系统重新启动
2018-01-31 14:16:23,875 - system - atm.py - 系统重新启动
2018-01-31 14:16:26,887 - system - atm.py - 抱歉该账户 cmz 被锁定,请联系管理员
------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        
请选择模式<q|Q 退出> <b|B 返回上一层>: b
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 7
------------------------- 解冻账户 -------------------------
请输入需要被解冻的账号名<b|B 返回上一层>: cmz
亲爱的用户 cmz 你的账号已经被解冻
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: b
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: q
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7        
请输入用户名: cmz 
请输入密码: cmz
------------------------- 管理用户操作说明 -------------------------
    5.  冻结账户
    6.  账户余额
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 6
------------------------- 账户余额 -------------------------

    ------------ cmz 用户信息 ------------ 
        用户  名:   cmz                             
        余    额:   20000
        
------------------------- 管理用户操作说明 -------------------------
    5.  冻结账户
    6.  账户余额
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 5
------------------------- 冻结账户 -------------------------
用户 cmz 已经被锁定,请联系管理员解冻账号
------------------------- 管理用户操作说明 -------------------------
    5.  冻结账户
    6.  账户余额
    
请选择模式<q|Q 退出> <b|B 返回上一层>: q
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 1       
请输入用户名: cmz
请输入密码: cmz
抱歉该账户 cmz 被锁定,请联系管理员
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7
请输入用户名: root
请输入密码: root
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 7
------------------------- 解冻账户 -------------------------
请输入需要被解冻的账号名<b|B 返回上一层>: cmz
亲爱的用户 cmz 你的账号已经被解冻
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: q
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 8
请输入用户名: cmz
请输入密码: cmz
------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        
抱歉,亲爱的用户 cmz,你不是系统管理员你没有此权限,请使用管理员root用户登录查看
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 8  
------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        
抱歉,亲爱的用户 cmz,你不是系统管理员你没有此权限,请使用管理员root用户登录查看
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 8
------------------------- 查看流水账 -------------------------
        1.  购物流水清单          
        2.  atm流水清单          
        3.  系统流水清单
        
抱歉,亲爱的用户 cmz,你不是系统管理员你没有此权限,请使用管理员root用户登录查看
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: q
leco@leco:~/PycharmProjects/luxffy/homework/atm$ 
leco@leco:~/PycharmProjects/luxffy/homework/atm$ python3 bin/start.py 
------------------------------------------------------------
|                                                          |
|                     欢迎来到购物广场                     |
|                                                          |
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 5
请输入用户名: root
请输入密码: root
------------------------- 转账 -------------------------
当前系统登录用户是:  root
亲爱的用户 root你好,汇款前您的余额 = 5000
请输入收款人用户名<b|B 返回上一级>: b
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: 7
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: 3

    ------------ root 用户信息 ------------ 
    用户  名:   root                             
    密    码:   root
    余    额:   5000
    额    度:   20000
    锁定状态:  False 
    

    ------------ cmz 用户信息 ------------ 
    用户  名:   cmz                             
    密    码:   cmz
    余    额:   20000
    额    度:   15000
    锁定状态:  False 
    
------------------------- 管理用户操作说明 -------------------------
    1.  新增用户          
    2.  删除用户          
    3.  查看所有用户
    4.  修改用户额度
    5.  冻结账户
    6.  账户余额
    7.  解锁账户
    
请选择模式<q|Q 退出> <b|B 返回上一层>: b
------------------------- 操作说明 -------------------------
    1.  购物              2.  充值
    3.  查看购物车         4.  保留
    5.  转账              6.  取现 
    7.  管理用户           8.  流水账
    
请选择模式<q|Q 退出>: q
代码在终端测试情况
原文地址:https://www.cnblogs.com/caimengzhi/p/8378448.html