python入门作业---ATM+购物商场程序(2)

前言:眼看基础知识要学完了。还是把之前丢掉的作业,拿回来重新做吧。再不做,担心后面跟不上进度了。光懂基础知识,开发不了软件,这就有点尴尬了。先找个案例抄一遍。搞清楚逻辑结构再说:.....................

一、程序需求

模拟实现一个ATM + 购物商城程序:
1.额度 15000或自定义
2.实现购物商城,买东西加入 购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息(没写)
5.支持多账户登录
6.支持账户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
11.用户认证用装饰器

二、程序结构:

├── ATM #ATM主程目录
│   ├── __init__.py
│   ├── bin                    #ATM 执行文件 目录
│   │   ├── __init__.py
│   │   ├── atm.py                 #ATM 执行程序
│   │   ├── manage.py              #信用卡管理 
│   ├── conf                   #配置文件
│   │   ├── __init__.py
│   │   └── Settings.py            #配置参数
│   ├── core                   #主要程序逻辑都 在这个目录 里
│   │   ├── __init__.py
│   │   ├── accounts.py            #用于从文件里加载和存储账户数据
│   │   ├── auth.py                #用户认证模块及主要功能函数
│   │   ├── db_handler.py          #数据库连接引擎
│   │   ├── logger.py              #日志记录模块
│   │   ├── main.py                #主逻辑交互程序
│   │   ├── transaction.py         #记账还钱取钱与账户金额相关的操作,冻结或者锁定用户
│   ├── db                     #用户数据存储的地方
│   │   ├── __init__.py
│   │   ├── account_sample.py   #生成一个初始的账户数据 ,把这个数据 存成一个 以这个账户id为文件名的文件,放在accounts目录 就行了,程序自己去会这里找
│   │   └── accounts            #存各个用户的账户数据 ,一个用户一个文件
│   │       └── 123.json           #新创建的用户账户示例文件
│   │       └── 1234.json          #一个用户账户示例文件
│   │       └── 123456.json        #一个用户账户示例文件
│   │       └── 6230001.json       #管理用户账户示例文件
│   └── log                    #日志目录
│        ├── access.log              #用户访问和操作的相关日志
│        └── login_in.log            #登陆日志
└── shopping_mall               #电子商城程序,需单独实现,主要实现购物的功能。
│        └── __init__.py
│        └── product.txt             #存放商品的txt文件
│        └── shopping_list.txt       #存放购物清单的txt.文件
│        └── shopping_mall.py        #购物商城程序
├── README

目录
View Code

三、简要说明

1.程序从/bin/atm.py开始执行if __name__ == '__main__':
                                                main.run()
2.程序转到/core/main.py下的run()函数,登陆时调用/core/auth的acc_login()进行登陆验证:用到了/core/auth下的acc_auth2()方法进行验证(此时传入的参数时用户输入的账户和密码)
acc_auth2中有调用了/core/db_handler下的db_handler()方法(参数是输入的账户名)在db_handler中只是进行判断是什么引擎,return file_db_handle(数据库引擎)解析文件,返回文件执行加载输入的用户的账户的所有数据
接下来判断是否为管理者账户,或者是否被冻结,若都不是,则判断输入的密码是否与数据库中的密码一样,在判断到期时间是否过期
所有都通过的话就返回这个账户的数据,之前已经创建了一个空字典,里面有是否验证:用户数据:用户账户:,判断是否被验证过,然后把用户数据临时的传递到里面,执行主循环函数
可以选择进入到购物商城,或者信用卡操作或者退出
1)购物商城
  调用/shopping_mall/shopping_mall.py文件执行,主循环函数,选择你是商家还是用户,
  ①如果选择商家,商家有增加商品修改商品的功能
  ②如果选择用户,用户则有购物,刷信用卡消费的功能,当退出时打印消费清单
2)信用卡操作
   调用/core/main.py下interactive(用户的所有数据)调用主循环函数,可以打印账户信息、还款、取款、转账、账单、退出等操作
  ①账户信息
  ②还款
  ③取款
  ④转账
  ⑤账单
  ⑥退出
3)若在账户登陆的时候进行输入的时管理员账户调用/bin/manage.py则可以对用户进行管理,解冻    用户、冻结用户、申领新卡
  ①添加账户
  ②冻结账户
  ③解冻账户
  ④退出

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/7/14
 5 import os,sys
 6 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 7 
 8 sys.path.append(BASE_DIR)
 9 
10 from core import main
11 
12 
13 
14 if __name__ == '__main__':
15     main.run()
/atm/bin/atm
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/13 
 6 '''
 7 import os,sys
 8 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 9 #print(base_dir)
10 sys.path.append(BASE_DIR)
11 
12 from core import main
13 
14 
15 if __name__ == '__main__':
16     main.goto_manage()
/atm/bin/manage

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/7/14
 5 
 6 #参数配置文件
 7 import os,sys,logging
 8 
 9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#/Atm
10 
11 DATABASE = {
12     'engine': 'file_storage',
13     'name': 'account',
14     'path': "%s/db" % BASE_DIR#../Atm
15 }
16 
17 LOG_LEVEL = logging.INFO  #记录等级
18 LOG_TYPES = {
19     'transaction': 'transaction.log',
20     'access': 'access.log'
21 }
22 
23 #发生交易的配置类型
24 TRANSACTION_TYPE = {
25     'repay':{'action':'plus','interest':0},#还款
26     'withdraw':{'action':'minus','interest':0.05},#取现是降低可用余额
27     'transfer':{'action':'minus','interest':0.05},#转账是降低可用余额
28     'consume':{'action':'minus','interest':0},   #消费
29 }
/atm/conf/setting

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/8/12
 5 import os,sys
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
 7 sys.path.append(BASE_DIR)
 8 from core import db_handler
 9 from conf import setting
10 from core import logger
11 import json,time
12 
13 
14 def load_current_balance(account_id):
15     db_path = db_handler.db_handler(setting.DATABASE)  # 返回的是数据文件路径
16     account_file = "%s/%s.json" % (db_path, account_id)  # 取到数据文件的绝对地址
17     with open(account_file, "r") as f:
18         account_data = json.load(f)
19         return account_data
20 
21 def dump_account(account_data):
22     db_path = db_handler.db_handler(setting.DATABASE)  # 返回的是数据文件路径
23     account_file = "%s/%s.json" % (db_path, account_data["id"])  # 取到数据文件的绝对地址
24     with open(account_file,"w") as f:
25         json.dump(account_data,f)
26     return True
/atm/core/accounts
 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/7/14
 5 import os,sys
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
 7 sys.path.append(BASE_DIR)
 8 from core import db_handler
 9 from conf import setting
10 from core import logger
11 import json,time,functools
12 
13 
14 #做一个登陆装饰器
15 def login_required(func):
16     @functools.wraps(func)
17     def wrapper(*args,**kwargs):
18         if args[0].get('is_authenticated'):
19             return func(*args,**kwargs)
20         else:
21             exit("用户认证失败")
22     return wrapper
23 
24 
25 #第二步,做一个用户认证功能
26 #初始化信息,一旦认证成功,就把数据传给这个字典
27 
28 #输入账户id 和密码
29 def acc_auth(account,password):
30     db_path=db_handler.db_handler(setting.DATABASE)#返回的是数据文件路径
31     account_file="%s/%s.json"%(db_path,account)#取到数据文件的绝对地址
32     #print(account_file)                                   #打印一下地址
33     if os.path.isfile(account_file):
34         with open(account_file,"r") as f:
35             account_data=json.load(f)
36             if account_data["password"]==password:
37                 exp_time_stamp=time.mktime(time.strptime(account_data["expir_date"],'%Y-%m-%d'))
38                 if time.time()>exp_time_stamp:
39                     print("33[32;1m账户%s已经过期,请联系管理人处理。:33[0m"%account)
40                 else:
41                     return account_data
42             else:
43                 print("33[32;1m账户或密码,存在错误。33[0m")
44 
45 def acc_login(user_data,log_obj):#用户验证函数
46     retry_count=0
47     while user_data["is_authenticated"] is not True and retry_count<3:
48         account=input("33[32;1m账户:33[0m").strip()
49         password = input("33[32;1m密码:33[0m").strip()
50         auth=acc_auth(account,password) #调用登陆函数
51         if auth:
52             user_data["is_authenticated"]=True
53             user_data["account_id"]=account
54             log_obj.info("账户 %s 登陆登陆成功"%account)
55             return auth
56         retry_count+=1
57     else:
58         log_obj.error("账户 %s 多次尝试登陆"%account)#打印一个登陆信息
59         exit()#退出登录程序
/atm/core/auth
 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/8/12
 5 
 6 
 7 def file_db_handle(conn_params):
 8     #print("file db:",conn_params)
 9     db_path="%s/%s"%(conn_params["path"],conn_params["name"])
10     return db_path
11 
12 def mysql_db_handle(conn_parms):
13     pass
14 
15 def db_handler(conn_parms):
16     "链接数据文件"
17     if conn_parms["engine"]=="file_storage":
18         return file_db_handle(conn_parms)
19     elif conn_parms["engine"]=="mysql":
20         return mysql_db_handle(conn_parms)
/atm/core/db_handler
 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/7/15
 5 import os,sys
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
 7 sys.path.append(BASE_DIR)
 8 import logging
 9 from conf import setting
10 # level=logging.WARNING#可以把这个放在配置文件中
11 def logger(log_type):
12     logger=logging.getLogger(log_type)
13     logger.setLevel(setting.LOG_LEVEL)
14 
15     log_file=r"%slog\%s"%(setting.BASE_DIR,setting.LOG_TYPES[log_type])
16     fh=logging.FileHandler(log_file+'.log')
17     #ch=logging.StreamHandler()
18     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
19     fh.setFormatter(formatter)
20     #ch.setFormatter(formatter)
21     logger.addHandler(fh)
22     #logger.addHandler(ch)
23 
24     return logger
25 
26 
27 if __name__=='__main__':
28     logger('test_logger').warning('logger debug message')
29     # print(log_file)
/atm/core/logger
#!/usr/bin/python3
# -*- coding:utf-8 -*-
#__author:Administrator
#date:2018/7/14
import os,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
sys.path.append(BASE_DIR)



from core import auth
from core import logger
from core import accounts
from core import transaction
from core.auth import login_required
from core import manage_admin
import time


user_data={
    'account_id':None,#账号id
    'is_authenticated':False, #是否认证
    'account_data':None #账户其他数据
}

trans_logger=logger.logger('transaction') #交易logger
access_logger=logger.logger('access')      #登录logger



@login_required
def account_info(acc_data):
    account_data = accounts.load_current_balance(acc_data['account_id'])
    current_balance = """
        ------卡   基本信息 ---------
        卡号:        %s
        信用额度:    %s
        可用额度:    %s
        开卡时间:   %s
        过期时间:   %s
        """ % (account_data['id'],account_data["credit"], account_data['balance'],account_data["enroll_date"],account_data["expir_date"])
    print(current_balance)
@login_required
def repay(acc_data):
    #取出最新的数据,为了保证数据的安全
    account_data=accounts.load_current_balance(acc_data['account_id'])
    current_balance="""
    ------balance 余额 INFO ---------
    Credit:     %s
    Balance:    %s
    """%(account_data['id'],account_data['balance'])
    print(current_balance)
    back_flag=False
    while not back_flag:
        repay_amount=input("33[33;1m输入你要还款的金额:[放弃:q]33[0m").strip()
        if len(repay_amount)>0 and repay_amount.isdigit():
            new_blance=transaction.make_transaction(trans_logger,account_data,'repay',repay_amount)#交易完成后得到最新数据
            if new_blance:
                print("33[33;1m最新余额:%s33[0m"%new_blance["balance"])
        elif repay_amount=="q":
            back_flag=True
        else:
            print("33[33;1m[%s] is not a valid amount,only accept integer!!33[0m"%repay_amount)
@login_required
def withdraw(acc_data):#取款
    account_data = accounts.load_current_balance(acc_data['account_id'])
    current_balance = """
       ------balance 余额 INFO ---------
       Credit:     %s
       Balance:    %s
       """ % (account_data['id'], account_data['balance'])
    print(current_balance)
    back_flag = False
    while not back_flag:
        withdraw_amount = input("33[33;1m输入你要取款的金额:[放弃:q]33[0m").strip()
        if len(withdraw_amount) > 0 and withdraw_amount.isdigit():
            new_blance = transaction.make_transaction(trans_logger, account_data, 'withdraw', withdraw_amount)  # 交易完成后得到最新数据
            if new_blance:
                print("33[33;1m最新余额:%s33[0m" % new_blance["balance"])
        elif withdraw_amount == "q":
            back_flag = True
        else:
            print("33[33;1m 账户或输入金额 is not a valid amount!33[0m")
@login_required
def transfer(acc_data): #4、转账
    account_data = accounts.load_current_balance(acc_data['account_id'])
    current_balance = """
          ------balance 余额 INFO ---------
          Credit:     %s
          Balance:    %s
          """ % (account_data['id'], account_data['balance'])
    print(current_balance)
    back_flag=False
    while not back_flag:
        duifang_account=input("33[31;1m请输入对方帐户名:33[0m").strip()
        transfer_amount=input("33[31;1m转账金额:33[0m").strip()
        if duifang_account and transfer_amount=="b":
            return
        elif len(transfer_amount)>0 and transfer_amount.isdigit():
            new_blance=transaction.make_transaction(trans_logger,account_data,"transfer",transfer_amount,re_account=duifang_account)
            if new_blance:
                print("33[41;1m转账成功!33[0m")
                print("33[33;1m最新余额:%s33[0m" % new_blance["balance"])
        else:
            print("33[33;1m 账户或输入金额 is not a valid amount!33[0m")

@login_required
def pay_check(acc_data):
    pass
@login_required
def logout(acc_data):
    exit("程序已退出")
 #############################################
def shopping_mall_this(acc_data):
#     account_data = accounts.load_current_balance(acc_data['account_id'])#取得最新数据
#     saving=account_data["balance"]#得到可用额度
#     #surplus_amount=main.shopping_action(saving)#需要返回 消费的金额
#     new_blance = transaction.make_transaction(trans_logger, account_data, 'consume', surplus_amount)  # 交易完成后得到最新数据
#     if new_blance:
#         print("33[33;1m最新余额:%s33[0m" % new_blance["balance"])
    pass
###############################################

def goto_manage():
    manage_admin.manage_main()
def interactive(acc_data):
    menu=u'''
    --------中国银行---------
    33[32;1m1、账户信息
    2、还款
    3、取款
    4、转账
    5、账单
    6、退出33[0m'''
    menu_dic={
        "1":account_info, #1、账户信息
        "2":repay,        #2、还款
        "3":withdraw,     #3、取款
        "4":transfer,      #4、转账
        "5":pay_check,    #5、账单
        "6":logout        #6、退出
    }
    exit_flag=False
    while not exit_flag:
        print(menu)
        user_option=input("请选择>>>").strip()
        if user_option in menu_dic:
            menu_dic[user_option](acc_data)

        else:
           print("33[32;1m您的选择不存在。33[0m")
def atm_shoping_menu(acc_data):
    main_menu=u"""
    ----------主菜单---------
     33[32;1m
     1.购物商城
     2.银行卡操作
     3.退出33[0m"""
    main_menu_dic={
        "1":shopping_mall_this,
        "2":interactive,
        "3":logout
    }
    exit_flag1=False
    while not exit_flag1:
        print(main_menu)
        user_option=input("请选择:").strip()
        if user_option=="b":
            return
        elif user_option in main_menu_dic:
            main_menu_dic[user_option](acc_data)
        else:
            print("33[31;1m选择不存在!33[0m")


def run():
    #首先需要进行用户验证
    acc_data=auth.acc_login(user_data,access_logger)

    if user_data['is_authenticated']: #确认是否验证
        user_data["account_data"]=acc_data
        #interactive(user_data)##把user_data里的所有数据传入菜单函数,进行下一步操作
        #atm_shoping_menu(user_data)#接入商场菜单
        if acc_data["role"]==0 or acc_data["role"]=="0":#role  0 管理员    1是普通用户
            goto_manage()
        if acc_data["role"]==1 or acc_data["role"]=="1":
            atm_shoping_menu(user_data)






if __name__=='__main__':
    run()
/atm/core/main
  1 #!/usr/bin/python3
  2 # -*- coding:utf-8 -*-
  3 #__author:Administrator
  4 #date:2018/8/12
  5 
  6 #管理端(提供管理接口,包括添加账户、用户额度,冻结账户)
  7 #解冻账户
  8 #from core.auth import login_required
  9 from core import accounts
 10 from core import transaction
 11 
 12 #解冻账户
 13 def unblock_account():
 14     user_input = input("请输入你要解冻的用户:")
 15     flag = 0
 16     #锁定用户
 17     val = transaction.unlock_or_yes(user_input,flag)
 18     if val == 0:
 19         print("解冻成功!")
 20         return
 21 #冻结账户
 22 def block_account():
 23     '''
 24     冻结账户初步构想是,在linux里把他的权限改掉;
 25     或者将其文件改名
 26     :param acc_data:
 27     :return:
 28     '''
 29     user_input = input("请输入你要冻结的用户:")
 30     flag = 1
 31     #锁定用户
 32     val = transaction.lock_or_not(user_input,flag)
 33     if val == 1:
 34         print("冻结成功!")
 35         return
 36 #添加账户、用户额度
 37 def add_account():
 38     account = {
 39         "id": None,
 40         "balance": None,
 41         "expir_date": None,
 42         "enroll_date": None,
 43         "credit": None,
 44         "pay_day": None,
 45         "password": None,
 46         "status": 0,
 47         "role":1
 48     }
 49     menu = {
 50         0: "账户(数字):",
 51         1: "密码:",
 52         2: "信用额度:",
 53         3: "余额度:",
 54         4: "注册时间:",
 55         5: "到期时间:",
 56         6: "还款周期:",
 57         7: "默认(0 正常  1 锁卡 2  遗失):",
 58         8:"权限(0 管理员,1用户。默认用户1):"
 59          }
 60     menu_user = {
 61         0: "id",
 62         1: "password",
 63         2: "credit",
 64         3: "balance",
 65         4: "enroll_date",
 66         5: "expir_date",
 67         6: "pay_day",
 68         7: "status",
 69         8:"role"
 70     }
 71     for i in range(7):
 72         data = input("%s" % menu[i]).strip()
 73         account['%s' % menu_user[i]] = data
 74 
 75     account["balance"]=float(account["balance"] )
 76     accounts.dump_account(account)#写入文件
 77     print("创建成功!")
 78     return
 79 def logout():
 80     exit("程序退出!")
 81 #管理界面主程序
 82 def manage_main():
 83 
 84     menu = u'''
 85     ---------管理界面---------
 86     1.添加账户
 87     2.冻结账户
 88     3.解冻账户
 89     4.退出'''
 90     menu_dic = {
 91         '1': add_account,
 92         '2': block_account,
 93         '3': unblock_account,
 94         '4': logout
 95     }
 96     exit_flag = False
 97     while not exit_flag:
 98         print(menu)
 99         user_option = input("请输入你的选择:")
100         if user_option in menu_dic:
101             menu_dic[user_option]()
102         else:
103             print("33[31;1m选择不存在!33[0m")
104 
105 if __name__=="__main__":
106     #manage_main()
107     pass
/atm/core/manage_admin
 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/8/12
 5 import os,sys
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))
 7 sys.path.append(BASE_DIR)
 8 from conf import setting
 9 from core import accounts
10 
11 def make_transaction(log_obj,account_data,tran_type,amount,**kwargs):
12     amount=float(amount)
13 
14     if tran_type in setting.TRANSACTION_TYPE:
15 
16         interest=amount*setting.TRANSACTION_TYPE[tran_type]["interest"]#计算利息
17         old_balance=account_data["balance"]
18         if setting.TRANSACTION_TYPE[tran_type]["action"]=="plus":
19             new_balance=old_balance+amount+interest
20         elif setting.TRANSACTION_TYPE[tran_type]["action"]=="minus":
21             new_balance=old_balance-amount-interest
22 
23             if kwargs.get("re_account"):#转账用的语句。获取转账对方的账号
24                 re_account_data=accounts.load_current_balance(kwargs.get("re_account"))
25                 re_account_balance=re_account_data["balance"]+amount
26                 re_account_data["balance"]=re_account_balance
27                 print("对方账户信息:%s"%re_account_data)
28                 accounts.dump_account(re_account_data)
29 
30             elif new_balance<0:
31                 print("33[31;1m[%s]账户的信用余额不足以支付此次交易[-%s],你当前的余额是[%s]33[0m"%(
32                     account_data['id'],amount+interest,old_balance))
33                 return None
34 
35         account_data["balance"]=new_balance
36         accounts.dump_account(account_data)#保存数据
37         log_obj.info("account:%s action:%s   amount:%s    interest:%s "%(account_data['id'],tran_type,amount,interest))
38         return account_data  #返回最新数据
39     else:
40         print("33[31;1m交易类型【%s】 is not exist!!!33[0m"%tran_type)
41 
42 #冻结或者锁定用户
43 def lock_or_not(account,flag):
44     data=accounts.load_current_balance(account)
45     if data["status"]==1:
46         print("该账户已经锁定!")
47     else:
48         data["status"]=flag
49         accounts.dump_account(data)
50         return flag
51 def unlock_or_yes(account,flag):
52     data = accounts.load_current_balance(account)
53     if data["status"] == 1:
54         data["status"] = flag
55         accounts.dump_account(data)
56         return flag
57     else:
58         print("该账户处于正常状态。")
/atm/core/transaction

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 3 #__author:Administrator
 4 #date:2018/7/14
 5 
 6 import os ,sys
 7 import json
 8 
 9 # acc_dic={
10 #     'id':1234,     #卡号
11 #     'password':'abc',  #密码
12 #     'credit':15000,       #信用额度
13 #     'balance':15000,     #余额度
14 #     'enroll_date':'2014-12-23',  #注册时间
15 #     'expir_date':'2019-12-22',  # 到期时间
16 #     'pay_day':22,
17 #     'status':0 ,  #0 正常  1 锁卡 2  遗失
18 #    "role":1
19 # }
20 acc_dic={
21     'id':"admin",     #卡号
22     'password':'abc123',  #密码
23     'expir_date':'3000-12-22',#设置一个远大于今天的数值。管理员有效期
24     'role':0      #0 管理员 1客户
25 }
26 
27 # print(sys.platform) #返回操作系统平台名称
28 # print(sys.version) #获取Python解释程序的版本信息
29 def zhanghao(string):#生成一个测试用的银行G个人用户信息
30 
31     with open(r'account\%s.json'%acc_dic['id'],'w') as f:
32         json.dump(string,f)
33 
34 
35 def main():
36     if sys.platform=='win32':
37         # print('这是Windows操作系统')
38         if os.path.isdir('account'):#判断当前目录,是否存在文件名为‘account’的文件夹
39             zhanghao(acc_dic)
40         else:
41             os.mkdir('account') # 如果文件夹不存在,则创建以一个新的文件夹
42             zhanghao(acc_dic)
43     else:
44         print('本软件暂不兼容Windows以外的操作系统,如需帮助,请联系开发人员')
45 
46 def del_file():#如果需要初始化数据,删除已有的数据文件,可以运行该程序
47     print(os.listdir('account'))
48     for i in os.listdir('account'):
49         file=os.path.join('account',i)
50         os.remove(file)
51 
52 if __name__=='__main__':
53     main()
54     #del_file()
/atm/db/account_sample

代码:完成信用卡操作

https://github.com/Mengchangxin/ATM_SHOPPINGmail



 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/14 
 6 '''
 7 
 8 import os,sys
 9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
10 #print(base_dir)
11 sys.path.append(BASE_DIR)
12 
13 from core import main
14 
15 
16 if __name__ == '__main__':
17     a=main.shopping_action("5000")
18     print(a,type(a))
/shopping_mall/bin/bin.py

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/14 
 6 '''
 7 import os,sys,logging
 8 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 9 
10 db_file=os.path.join(BASE_DIR,"db","access","produc.json")
11 
12 LOG_TYPES = {
13     'shopping': 'shopping.log',
14 }
15 LOG_LEVEL = logging.INFO  #记录等级
16 DATABASE = {
17         'engine': 'file_storage',
18         'name': 'access',
19         "file":"produc.json",
20         'path': "%s/db" % BASE_DIR
21 }
22 
23 
24 
25 
26 if __name__=="__main__":
27         print(BASE_DIR)
28         print(db_file)
/shopping_mall/conf/settings.py

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/14 
 6 '''
 7 import os,sys,logging
 8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 9 
10 from conf import settings
11 from core import db_handler
12 import json
13 
14 #取数据
15 def load_current_balance():
16     db_file_path = db_handler.db_handler(settings.DATABASE)  # 返回的是数据文件路径# 取到数据文件的绝对地址
17     with open(db_file_path, "r") as f:
18         account_data = json.load(f)
19         return account_data
20 
21 
22 #存数据
23 def dump_account(account_data):
24     db_file_path = db_handler.db_handler(settings.DATABASE)  # 返回的是数据文件路径 # 取到数据文件的绝对地址
25     with open(db_file_path,"w") as f:
26         json.dump(account_data,f)
27     return True
/shopping_mall/core/accounts.py
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/14 
 6 '''
 7 import os,sys,logging
 8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 9 def file_db_handle(conn_params):
10     db_path=os.path.join(conn_params["path"],conn_params["name"],conn_params["file"])
11     return db_path
12 
13 def mysql_db_handle(conn_parms):
14     pass
15 
16 def db_handler(conn_parms):
17     "链接数据文件"
18     if conn_parms["engine"]=="file_storage":
19         return file_db_handle(conn_parms)
20     elif conn_parms["engine"]=="mysql":
21         return mysql_db_handle(conn_parms)
/shopping_mall/core/db_handler.py
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/14 
 6 '''
 7 import os,sys
 8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__name__))))
 9 import logging
10 from conf import settings
11 # level=logging.WARNING#可以把这个放在配置文件中
12 def logger(log_type):
13     logger=logging.getLogger(log_type)
14     logger.setLevel(settings.LOG_LEVEL)
15 
16     log_file=r"%slog\%s"%(settings.BASE_DIR,settings.LOG_TYPES[log_type])
17     fh=logging.FileHandler(log_file+'.log')
18     #ch=logging.StreamHandler()
19     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
20     fh.setFormatter(formatter)
21     #ch.setFormatter(formatter)
22     logger.addHandler(fh)
23     #logger.addHandler(ch)
24 
25     return logger
26 
27 
28 if __name__=='__main__':
29     logger('test_logger').warning('logger debug message')
30     # print(log_file)
/shopping_mall/core/logger.py
 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 Administrator 
 5 2018/8/14 
 6 '''
 7 import os,sys,logging,time
 8 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 9 from core import accounts
10 from core import logger
11 shopping_log=logger.logger("shopping")
12 
13 product_list=accounts.load_current_balance()
14 #print(product_list)
15 
16 
17 def shopping_action(sum_amount):
18         # saving=input("please input your saving:")
19         saving=sum_amount
20         shopping_car=[]
21         if saving.isdigit():
22                 saving=float(saving)
23                 while True:
24                         for j in product_list.items():
25                                 print(j)
26                         choice=input('choice your product number[quit:q]')
27                         if choice.isdigit():
28                                 if choice in product_list:
29                                         p_item=product_list[choice]
30                                         for name,price in p_item.items():
31                                                 continue
32                                         if price<saving:
33                                                 saving-=price
34                                                 shopping_car.append(p_item)
35                                                 shopping_log.info("选购商品 {name}  价格是:{price}".format(name=name,price=price))#记录购物信息
36                                         else:
37                                                 print('余额不足,还剩%s'%saving)
38                                         print(p_item)
39                                 else:
40                                         print('number is out inside')
41                         elif choice.lower()=='q':
42                                 print('----------已经购买如下商品-------------')
43                                 print('编码','商品名称','商品价格','数量',sep='	')
44                                 y_sum=[]
45                                 x = 1
46                                 for y in shopping_car:
47 
48                                         if y not in y_sum:
49                                                 for y_1,y_2 in y.items():
50                                                         continue
51                                                 print(x,y_1,y_2,shopping_car.count(y),sep='	')
52                                                 y_sum.append(y)
53                                                 time.sleep(1)
54                                                 x=x+1
55 
56                                 #print('剩余金额%s'%saving)
57                                 cost_cash=float(sum_amount)-saving  # 返回消费的金额
58                                 return cost_cash
59                                 break
60                         else:
61                                 print("invalid input")
62 
63 if __name__=="__main__":
64         shopping_action("50000")
/shopping_mall/core/main.py

 1 #!/usr/bin/env python3
 2 #-*- coding:utf-8 -*-
 3 '''
 4 用来生成商品测试数据
 5 Administrator 
 6 2018/8/14 
 7 '''
 8 import os,sys,logging
 9 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
10 sys.path.append(BASE_DIR)
11 import json
12 from conf import settings
13 
14 product_list={
15     "1":{'iphone6s':5800},
16     "2":{'mac book':9000,},
17     "3":{'coffee':32},
18     "4":{'python book':80},
19     "5":{'bicyle':1500},
20     "6":{'football':100}
21 
22 }
23 files=settings.db_file
24 def save_db(data):
25     with open(files,"w") as f:
26         json.dump(data,f)
27 
28 if __name__=="__main__":
29     save_db(product_list)
/shopping_mall/db/add_produce.py

怎么互相给接口???

原文地址:https://www.cnblogs.com/Mengchangxin/p/9458083.html