python第四天作业

# Author:zylong
模拟atm + 购物商城程序
1.额度 15000
2.实现 购物商城,买东西加入购物车,调用信用卡接口结账
3.提现(手续费5%),查询余额,还款,按月查询账单
4.多账户登陆
5.多账户之间转账
6.记录每月日常消费流水
7.Atm记录操作日志
8.提供管理接口,包括添加账户,用户额度,冻结账户
9.用户认证使用装饰器

建的目录结构如下:

  

 

启动类:

# Author:zylong
#项目启动
#就是调用main 这个来启动项目
#这里需要知道,如何冲这里引用到main
import os,sys
#__file_
"""
__file__
creditCardShopping.py
os.path.abspath(__file__)
D:\pythonworkspace\oldboy\day4\CreditCardAndShopping\atm\bin\creditCardShopping.
py
"""
#往系统中添加临时环境
print(__file__)
print(os.path.abspath(__file__))
#D:\pythonworkspace\oldboy\day4\CreditCardAndShopping\atm\bin
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
from core import main
from conf import property
#这样就将main,和property引进来了

程序入口:

# Author:zylong
#程序的入口

print("main")

用户信息操作公共:

# Author:zylong
# 公共的用户信息模块,这个就是取用户信息,和添加用户信息
import json

# 讲用户信息获取出来
# info = dict()
# 用户姓名和密码,是否冻结,已经信用卡的信息保存在文件中
# 例如
# info = {
#     "zhangsan": {
#         "password": "123",
#         # true就是冻结,false 就是没有冻结
#         "isFreeze": True,
#         # 信用卡有多张,默认有一张
#         "creditCards": {
#             "creditCardA": {
#                 # 额度
#                 "amount": 15000,
#                 # 已使用
#                 "hasUserd": 5000
#             }
#         }
#     }
# }
# info = "aaddccddeeff"
# with open("../conf/test", "a") as f:
#     json.dump(info, f)
# 这样的数据结构直接使用json序列化就可以了
with open("../conf/user", "r") as f:
    info = json.load(f)


# print(info)
def saveInfo(sinfo):
    with open("../conf/user", "w") as f:
        json.dump(sinfo, f)

def saveMoneyRecord(info):
    with open("../logs/moneyrecord","a") as f:
        # json.dump(info,f)#序列化后换行不好使
        f.write(info)

def saveShoppinglog(log):
    with open("../logs/shopping","a") as f:
        # json.dump(log,f)
        f.write(log)

 

 

登陆:

 

# Author:zylong
#用户认证模块,因为对于信用卡的所有操作都需要先登录
import commoninfo
info = commoninfo.info
def loginCheck(fun):
    def wrapper(*args,**kwargs):
        # username = input("input your username:")
        #用户姓名是进行某些操作传递过来的,这里规定,登陆的第一个元素必须传用户姓名
        username = args[0]

        if username in info:
            passwd = input("input your passwd:")
            if info[username]["password"] == passwd :
                return fun(*args,**kwargs)
            else:
                print("your password is wrong")
        else:
            print("your username is wrong!")
    return wrapper

 

 

 购物:

  

# Author:zylong
#支付购买的商品
import json,time
from creditCard import shoppingSettlement
from commoninfo import saveShoppinglog
# goods = {'iphoneX': 7000, 'iphone7p': 4000, 'iphone mac pro': 18000, 'cup': 80, 'book': 50, 'abc': 88}
#
# with open("../conf/goods","w") as f:
#     json.dump(goods,f)

with open("../conf/goods","r") as f:
    goods = json.load(f)

# print(goods)
def goShopping():
    for i,k in enumerate(goods):
        print(i,k,goods[k])
    goodsList = list(goods.keys())
    priceList = list(goods.values())
    index = int(input("please input you want to buy"))
    price = priceList[index]
    username = input("please input your username")
    res = shoppingSettlement(username,price)
    if res:
        #记录购物成功日志
        print("you have buy %s success"%goodsList[index])
        shoppingtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
        log = "%s %s shopping %s spend %s \n"%(shoppingtime,username,goodsList[index],price)
        saveShoppinglog(log)

 

 


信用卡:
# Author:zylong
#信用卡里面的 所偶有操作都需要登陆条件下进行
import commoninfo,user,time
from login import loginCheck

info = commoninfo.info;

# info = {
#     "zhangsan":{
#         "password":"123",
#         #true就是冻结,false 就是没有冻结
#         "isFreeze":True,
#         #信用卡有多张,默认有一张
#         "creditCards":{
#             "creditCardA":{
    #             #额度
    #             "amount":15000,
    #             #已使用
    #             "hasUserd":5000
#                }
#         }
#     }
# }

#1.购物结账
@loginCheck
def shoppingSettlement(username,price):
    #查询用户的所有的信用卡里可消费的金额
    user = info[username]
    #是否冻结
    isFreeze = user["isFreeze"]
    if isFreeze:
        print("your count is freeze")
    else:
        #判断信用卡中的金额是否足够
        #这个按卡进行区分,如果每一个卡里的钱都不足时,提示转账,如果只有一个卡时,直接提示金额不足。
        count = len(user["creditCards"])
        if count < 1:
            print("you don't have card ,please contact admin")
        flag = False
        cardName = ""
        for card in user["creditCards"].items():
            if card[1]["amount"] - card[1]["hasUserd"] > price:
                flag = True
                cardName = card[0]
                break
        if flag:#说明有足够的金额
            user["creditCards"][cardName]["hasUserd"]  += price
            commoninfo.saveInfo(info)
            trantime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
            record = "{time}  {user} {trade} {card} shoppingSettlement {money} \n".format(time=trantime, user=username,
                                                                                trade="shoppingSettlement", card=cardName,
                                                                                money=price)[:]
            commoninfo.saveMoneyRecord(record)
            return True
        elif count == 1:
            print("you don't have enough money ,please repay money")
        else :
            print("you have many cards,Please transfer")

#将username中的cardAname的price转到cardBname中
@loginCheck
def transfer(username,cardAname,cardBname,price):
    if user.isHaveUser(username):
        if cardAname in info[username]["creditCards"] and cardBname in info[username]["creditCards"] :
            #判断是否有足够的金额
            cardAMap = info[username]["creditCards"][cardAname]
            cardBMap = info[username]["creditCards"][cardBname]
            if cardAMap["amount"] - cardAMap["hasUserd"] > price :
                cardAMap["amount"] -= price
                cardBMap["amount"] += price
                commoninfo.saveInfo(info)
                trantime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
                record = "{time}  {user} {trade} {cardA} transfer {cardB} {money} \n".format(time=trantime, user=username,
                                                                         trade="transfer", cardA=cardAname,
                                                                        cardB=cardBname,money=price)
                commoninfo.saveMoneyRecord(record)
            else:
                print("%s don't have enough money"%cardAname)
        else:
            print("you don't have that cards")

    else:
        print("don't have this user %s"%username)

# shoppingSettlement("zhangsan",1000)

@loginCheck
def RepayMoney(username,cardname,price):
    #判断用户是否存在,判断卡是否存在
    if user.isHaveUser(username):
        if cardname in info[username]["creditCards"]:
            info[username]["creditCards"][cardname]["hasUserd"] -= price
            commoninfo.saveInfo(info)
            #记录还款流水,时间
            trantime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
            record = "{time}  {user} {trade} {card} repay {money} \n".format(time=trantime, user=username,
                                                                     trade="repay", card=cardname, money=price)
            commoninfo.saveMoneyRecord(record)

        else:
            print("you don't have this card")

#提现跟还款的操作类似

 

 

操作用户:
# Author:zylong
#添加账户,冻结账户,解冻
import commoninfo
# info = dict()
info = commoninfo.info
# info = {
#     "zhangsan":{
#         "password":"123",
#         #true就是冻结,false 就是没有冻结
#         "isFreeze":True,
#         #信用卡有多张,默认有一张
#         "creditCards":{
#               creditCardA:{
#                    #额度
#                    "amount":15000,
#                   #已使用
#                   "hasUserd":5000
#               }
#         }
#     }
# }
#这个是管理员用户,管理员用户需要先登录,然后添加正常的信用卡用户,假设管理员不需要登陆直接给用户开卡,冻结
#1.给zhangsan用户再开一张信用卡

#这里面都会做一件事,判断用户是否存在,写一个装饰器
def isHaveUser(name):
    if name not in info:
        print("%s 这个用户不存在,不能添加信用卡"%name)
        return False
    return True

def addCreditCard(name,cardname,money):
    if not isHaveUser(name):
        pass
    elif cardname in info[name]["creditCards"]:
        print("%s 这个卡已存在了,不能重复添加"%cardname)
    else:
        card = {"mount":money,"hasUserd":0}
        info[name]["creditCards"][cardname] = card
        commoninfo.saveInfo(info)

#2.创建一个lisi用户,并设置他的登陆密码,及信用卡信息
def createUser(name,passwd,cardname,money):
    #信息不能为空
    if isHaveUser(name):
        print("%s 用户已存在"%name)
    else:
        sinfo = {
            "password":passwd,
            "isFreeze":False,
            "creditCards":{
                cardname:{
                    "mount": money, "hasUserd": 0
                }
            }
        }
        info[name] = sinfo
        commoninfo.saveInfo(info)
def freezeUser(name):
    if isHaveUser(name):
        #解冻
        info[name]["isFreeze"] = True
        commoninfo.saveInfo(info)
def unFreezeUser(name):
    if isHaveUser(name):
        #解冻
        info[name]["isFreeze"] = False
        commoninfo.saveInfo(info)
# unFreezeUser("zhangsan")

 





 

posted @ 2017-12-13 00:47  上官_延  阅读(235)  评论(0)    收藏  举报