博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python入门作业---ATM+购物商场程序(2)
阅读量:5057 次
发布时间:2019-06-12

本文共 26039 字,大约阅读时间需要 86 分钟。

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

一、程序需求

模拟实现一个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 main11 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 main13 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__)))#/Atm10 11 DATABASE = {12     'engine': 'file_storage',13     'name': 'account',14     'path': "%s/db" % BASE_DIR#../Atm15 }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 setting10 from core import logger11 import json,time12 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_data20 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 setting10 from core import logger11 import json,time,functools12 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 wrapper23 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("\033[32;1m账户%s已经过期,请联系管理人处理。:\033[0m"%account)40                 else:41                     return account_data42             else:43                 print("\033[32;1m账户或密码,存在错误。\033[0m")44 45 def acc_login(user_data,log_obj):#用户验证函数46     retry_count=047     while user_data["is_authenticated"] is not True and retry_count<3:48         account=input("\033[32;1m账户:\033[0m").strip()49         password = input("\033[32;1m密码:\033[0m").strip()50         auth=acc_auth(account,password) #调用登陆函数51         if auth:52             user_data["is_authenticated"]=True53             user_data["account_id"]=account54             log_obj.info("账户 %s 登陆登陆成功"%account)55             return auth56         retry_count+=157     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_path11 12 def mysql_db_handle(conn_parms):13     pass14 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 setting10 # 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"%s\log\%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 logger25 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/14import os,sysBASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__name__)))sys.path.append(BASE_DIR)from core import authfrom core import loggerfrom core import accountsfrom core import transactionfrom core.auth import login_requiredfrom core import manage_adminimport timeuser_data={    'account_id':None,#账号id    'is_authenticated':False, #是否认证    'account_data':None #账户其他数据}trans_logger=logger.logger('transaction') #交易loggeraccess_logger=logger.logger('access')      #登录logger@login_requireddef 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_requireddef 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("\033[33;1m输入你要还款的金额:[放弃:q]\033[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("\033[33;1m最新余额:%s\033[0m"%new_blance["balance"])        elif repay_amount=="q":            back_flag=True        else:            print("\033[33;1m[%s] is not a valid amount,only accept integer!!\033[0m"%repay_amount)@login_requireddef 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("\033[33;1m输入你要取款的金额:[放弃:q]\033[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("\033[33;1m最新余额:%s\033[0m" % new_blance["balance"])        elif withdraw_amount == "q":            back_flag = True        else:            print("\033[33;1m 账户或输入金额 is not a valid amount!\033[0m")@login_requireddef 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("\033[31;1m请输入对方帐户名:\033[0m").strip()        transfer_amount=input("\033[31;1m转账金额:\033[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("\033[41;1m转账成功!\033[0m")                print("\033[33;1m最新余额:%s\033[0m" % new_blance["balance"])        else:            print("\033[33;1m 账户或输入金额 is not a valid amount!\033[0m")@login_requireddef pay_check(acc_data):    pass@login_requireddef 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("\033[33;1m最新余额:%s\033[0m" % new_blance["balance"])    pass###############################################def goto_manage():    manage_admin.manage_main()def interactive(acc_data):    menu=u'''    --------中国银行---------    \033[32;1m1、账户信息    2、还款    3、取款    4、转账    5、账单    6、退出\033[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("\033[32;1m您的选择不存在。\033[0m")def atm_shoping_menu(acc_data):    main_menu=u"""    ----------主菜单---------     \033[32;1m     1.购物商城     2.银行卡操作     3.退出\033[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("\033[31;1m选择不存在!\033[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("\033[31;1m选择不存在!\033[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 accounts10 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+interest20         elif setting.TRANSACTION_TYPE[tran_type]["action"]=="minus":21             new_balance=old_balance-amount-interest22 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"]+amount26                 re_account_data["balance"]=re_account_balance27                 print("对方账户信息:%s"%re_account_data)28                 accounts.dump_account(re_account_data)29 30             elif new_balance<0:31                 print("\033[31;1m[%s]账户的信用余额不足以支付此次交易[-%s],你当前的余额是[%s]\033[0m"%(32                     account_data['id'],amount+interest,old_balance))33                 return None34 35         account_data["balance"]=new_balance36         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("\033[31;1m交易类型【%s】 is not exist!!!\033[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"]=flag49         accounts.dump_account(data)50         return flag51 def unlock_or_yes(account,flag):52     data = accounts.load_current_balance(account)53     if data["status"] == 1:54         data["status"] = flag55         accounts.dump_account(data)56         return flag57     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":119 # }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 main14 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_DIR21 }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 settings11 from core import db_handler12 import json13 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_data20 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_path12 13 def mysql_db_handle(conn_parms):14     pass15 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 logging10 from conf import settings11 # 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"%s\log\%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 logger26 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 accounts10 from core import logger11 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_amount20         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                                                 continue32                                         if price
/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 json12 from conf import settings13 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_file24 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

你可能感兴趣的文章
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
bzoj1230 开关灯 线段树
查看>>
LinearLayout
查看>>
学习python:day1
查看>>
css3动画属性
查看>>