import os
import json
import sys
import hashlib
import time as  t
sys.path.append('..\core') # 添加到sys.path中
print(sys.path)
import withdraw # 导入withdraw 虽然报错但是没关系这只是pycharm的问题
"""
尝试把上一章的验证用户登陆的装饰器添加到提现和转账的功能上。
"""
def login_youhua_hash(func):
    """
    登录装饰器,文件名:account_hash.json
    :return:
    """

    def login_decorator(*arg):
        count = 1
        m = hashlib.md5()
        while count < 4:  # 循环3次
            uesrname = input('请输入你的用户名:')
            password_ming = (input('请输入您的密码:'))
            m.update(password_ming.encode('utf-8'))  # 将输入的密码传入到md5的对象m中
            password = m.hexdigest()  # 将16进制形式的密码赋值给password
            mulu_path = os.path.dirname(os.path.dirname(__file__))  # 当前目录路径
            file_path = os.path.join(mulu_path, uesrname)  # 拼接成文件的路径
            try:  # 放在try中执行
                fr = open(file_path, 'r')
                dict_file = json.load(fr)
                fr.close()

                guoqishijian_tuple = t.strptime(dict_file['expire_date'], '%Y-%m-%d')  # 时间 元祖
                guoqishijian = t.mktime(guoqishijian_tuple)  # 过期时间的时间戳
                now_time = t.time()  # 当前时间的 时间戳
                if dict_file['status'] == 0:  # 判断是否状态为0
                    if password == dict_file['password']:  # 判断是否登陆成功
                        if now_time < guoqishijian:  # 判断是否过期
                            print('登陆成功')
                            func(*arg)
                            break
                        else:
                            print('已过期')
                            break
                    else:
                        if count == 3:  # 如果输入了三次将dict_file['status'] = 1写入文件
                            print('账号已锁定')
                            with open(file_path, 'w', encoding='utf-8')as f:
                                dict_file['status'] = 1
                                json.dump(dict_file, f)
                            break
                        else:  # 否则提示密码错误
                            print('密码错误')
                else:
                    print('已锁定')  # 否则提示已过期退出程序
                    break

            except Exception as e:
                print('出错了{}'.format(e.args))
            count += 1  # count放在这里,如果文件名输入错误三次也退出

    return login_decorator





"""
最近alex买了个Tesla Model S,通过转账的形式,并且支付了5%的手续费,tesla价格为95万。账户文件为json,请用程序实现该转账行为。
需求如下:
目录结构为
.
├── account
│   ├── alex.json
│   └── tesla_company.json
└── bin
      └── start.py
当执行start.py时,出现交互窗口
   ———- ICBC Bank ————-.
  1.  账户信息
  2.  转账


选择1 账户信息 显示alex的当前账户余额。
选择2 转账 直接扣掉95万和利息费用并且tesla_company账户增加95万

"""

@login_youhua_hash
def bug_car(alex_yu_e, tesla_monkey):
    """
    不同目录购买特斯拉
    :param alex_yu_e: 你的余额
    :param tesla_monkey: 购买特斯拉所需要的钱
    :return:
    """
    select_num = input(
        (
"""
 ———- ICBC Bank ————-.
1.  账户信息
2.  转账
""")
    )

    now_mulu_path = os.path.dirname(os.path.dirname(__file__))  # 当前所在目录
    alex_path = os.path.join(now_mulu_path, r'account\alex.json')  # 你的余额所在json文件路径
    tesla_path = os.path.join(now_mulu_path, r'account\tesla_company.json')  # 特斯拉账户所在json文件路径

    with open(alex_path, 'w', encoding='utf-8')as f:
        json.dump({"alex_balace": alex_yu_e}, f)  # 写入余额

    with open(alex_path, 'r')as f:
        yue_dict = json.load(f)  # 将余额读取出来dict

    if select_num == str(1):
        print('alex当前余额:{}'.format(yue_dict['alex_balace']))  # 选择1时返回你的余额

    elif select_num == str(2):  # 选择2时将从你的余额扣除,特斯拉账户相应增加
        buy_yue = (int(yue_dict['alex_balace']) - tesla_monkey) - (tesla_monkey * 0.05)  # 你购买 特斯拉+税后 还剩下余额
        if buy_yue >= 0 :
            with open(alex_path, 'w', encoding='utf-8')as f:  # 写入还剩下的余额
                json.dump({"alex_balace": buy_yue}, f)

            with open(tesla_path, 'w', encoding='utf-8')as f:  # 往特斯拉账户写入余额
                json.dump({"tesla_balace": tesla_monkey}, f)
            print('购买tesla成功')
        else:
            print('你的余额不够买一辆特斯拉,穷鬼!!!')

bug_car(1000000, 950000)
# withdraw.withdraw_start(yue=1000000, line_of_credit=500000, withdraw_monkey=450000)
# print(os.path.dirname(os.path.dirname(__file__)))

import os
import json
import sys
sys.path.append(r'..\bin')# 将bin目录添加到path中



"""
对上题增加一个需求:提现。
目录结构如下
.
├── account
│   └── alex.json
│   └── tesla_company.json
├── bin
│   └── start.py
└── core
   └── withdraw.py

当执行start.py时,出现交互窗口

   ———- ICBC Bank ————-
1.  账户信息
2.  提现

选择1 账户信息 显示alex的当前账户余额和信用额度。
选择2 提现 提现金额应小于等于信用额度,利息为5%,提现金额为用户自定义。
体现代码的实现要写在withdraw.py里
"""


def withdraw_start(yue, line_of_credit, withdraw_monkey):
    """
    实现一个提现的需求
    :param yue: 当前余额
    :param line_of_credit: 信用额度
    :param withdraw_monkey: 提现金额
    :return:
    """
    select_num = input(
        """
———- ICBC Bank ————-
1.  账户信息
2.  提现
        """
    )
    yue, line_of_credit, withdraw_monkey = int(yue), int(line_of_credit), int(withdraw_monkey)  # 类型转换
    now_on_mulu = os.path.dirname(os.path.dirname(__file__))
    alex_path = os.path.join(now_on_mulu, r'account\alex.json')
    with open(alex_path, 'w', encoding='utf-8')as f:
        json.dump({'alex_balace': yue, 'line_of_credit': line_of_credit}, f)  # 写入余额,信用额度

    with open(alex_path, 'r')as f:
        alex_dict = json.load(f)

    alex_yue = alex_dict['alex_balace']  # 你的当前余额
    alex_line_of_credit = alex_dict['line_of_credit']  # 你的信用额度

    if select_num == str(1):
        print('alex当前余额:{}'.format(alex_yue))
    elif select_num == str(2):
        if str(withdraw_monkey) > str(alex_line_of_credit):  # 判断提现金额是否小于信用额度
            print('你的胃口也太大了吧 ,不知道你的信用额度就这么点么!!!')
        else:
            alex_withdraw_monkey = alex_yue + withdraw_monkey  # 提现后的金额=当前余额+提现金额
            alex_line_of_credit = line_of_credit - withdraw_monkey - (withdraw_monkey * 0.05)  # 提现后信用额度=信用额度-提现金额-利息
            with open(alex_path, 'w', encoding='utf-8')as f:
                json.dump({'alex_balace': alex_withdraw_monkey, 'line_of_credit': alex_line_of_credit}, f)
            print("""
                提现成功:{}
                当前账户余额:{}
                当前信用额度:{}
                """.format(withdraw_monkey, alex_withdraw_monkey, alex_line_of_credit))
    else:
        print('输入错误了哈!,认真读题~~~')


withdraw_start(yue=1000000, line_of_credit=500000, withdraw_monkey=450000)


posted on 2020-04-06 00:04  python我学的很菜  阅读(1127)  评论(0编辑  收藏  举报