前言:眼看基础知识要学完了。还是把之前丢掉的作业,拿回来重新做吧。再不做,担心后面跟不上进度了。光懂基础知识,开发不了软件,这就有点尴尬了。先找个案例抄一遍。搞清楚逻辑结构再说:.....................
一、程序需求
模拟实现一个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目录
三、简要说明
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()
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()
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 }
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
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()#退出登录程序
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)
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)
#!/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()
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
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("该账户处于正常状态。")
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()
代码:完成信用卡操作
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))
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)
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
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)
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)
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
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)
怎么互相给接口???