前言:眼看基础知识要学完了。还是把之前丢掉的作业,拿回来重新做吧。再不做,担心后面跟不上进度了。光懂基础知识,开发不了软件,这就有点尴尬了。先找个案例抄一遍。搞清楚逻辑结构再说:.....................
一、程序需求
模拟实现一个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 main 11 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 main 13 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__)))#/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 }
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
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("\033[32;1m账户%s已经过期,请联系管理人处理。:\033[0m"%account) 40 else: 41 return account_data 42 else: 43 print("\033[32;1m账户或密码,存在错误。\033[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("\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"]=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()#退出登录程序
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)
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"%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 logger 25 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/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("\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_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("\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_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("\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_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("\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 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("\033[31;1m[%s]账户的信用余额不足以支付此次交易[-%s],你当前的余额是[%s]\033[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("\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"]=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("该账户处于正常状态。")
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()
代码:完成信用卡操作
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))
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)
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
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)
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"%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 logger 26 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 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='\t') 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='\t') 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")
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)
怎么互相给接口???