作业需求:
模拟实现一个ATM + 购物商城程序:
1.额度 15000或自定义
2.实现购物商城,买东西加入 购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.支持多账户登录
5.支持账户间转账
6.记录每月日常消费流水
7.提供还款接口
8.ATM记录操作日志
9.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
10.用户认证用装饰器
一、软件定位,软件的基本功能。
实现一个简单的atm与购物车程序,
二、运行代码的方法: 安装环境、启动命令等。
用Python3.5写的,语法就是至此之前所学的,直接打开运行即可
三、目录总体结构设计。
├── 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 __author__ = 'ZFH' 2 # 2018.09.26 3 #-*- Coding:utf-8 -*- 4 5 import os,sys 6 7 8 BASE_DIR_Atm = os.path.dirname(os.path.dirname(__file__)) 9 BASE_DIR_PRO = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 10 11 sys.path.append(BASE_DIR_Atm) 12 sys.path.append(BASE_DIR_PRO) 13 14 print(sys.path) 15 16 from core import main 17 18 if __name__ == '__main__': 19 main.run()
1 __author__ = 'ZFH' 2 # 2018.09.26 3 # -*- coding:utf-8 -*- 4 import os,logging 5 BASE_DIR_Atm = os.path.dirname(os.path.dirname(__file__)) 6 7 DATABASE = { 8 'engine':'file_storage', 9 'name':'account', 10 'path':"%s/dbs" % BASE_DIR_Atm 11 } 12 13 LOG_LEVEL = logging.INFO 14 LOG_TYPES = { 15 'transaction':'transaction.log', 16 'access':'access.log' 17 } 18 19 #发生交易的配置类型 20 TRANSACTION_TYPE = { 21 'repay':{'action':'plus','interest':0}, #还款 22 'withdrawal':{'action':'minus','interest':0.05}, #取现扣费,即降低可用余额 23 'transfer':{'action':'minus','interest':0.05}, #转账扣费,即降低可用余额 24 'consumption':{'action':'minus','interest':0} #消费 25 }
1 __author__ = 'ZFH' 2 # 2018.09.26 3 # -*- coding:utf-8 -*- 4 #用于从文件里加载和存储账户数据 5 import json 6 from core import db_handler 7 from conf import settings 8 9 def load_current_balance(account_id): 10 ''' 11 返回账号余额其他信息 12 :param account_id:用户账户的名字 13 :return:返回最新读到的数据文件中的最新数据 14 ''' 15 db_path = db_handler.db_handler() 16 account_file = "%s/%s.json" %(db_path,account_id) 17 with open(account_file,'r') as f: 18 acc_data = json.load(f) 19 return acc_data 20 21 #写入文件 22 def dump_account(account_data): 23 db_path = db_handler.db_handler() 24 account_file = "%s/%s.json" %(db_path,account_data['id']) 25 with open(account_file,'w') as f: 26 acc_data = json.dump(account_data,f) 27 return True
1 __author__ = 'ZFH' 2 # 2018.09.26 3 # -*- coding:utf-8 -*- 4 # 用户认证模块 5 import os,json,time 6 from core import db_handler 7 8 #装饰器(用于验证账户是否登陆过) 9 def login_required(func): 10 def wrapper(*args,**kwargs): 11 if args[0].get('is_authenticated'): 12 return func(*args,**kwargs) 13 else: 14 exit("用户认证失败") 15 return wrapper 16 17 def acc_auth(account,password): 18 ''' 19 账号验证函数 20 :param account: 21 :param password: 22 :return: 23 ''' 24 db_path = db_handler.db_handler() 25 account_file = '%s/%s.json' % (db_path,account) 26 # print('account_file:',account_file) 27 # print('account_file:',type(account_file)) 28 if os.path.isfile(account_file): 29 with open(account_file,'r') as f: 30 account_data = json.load(f) 31 if account_data['password'] == password: 32 exp_time_stamp = time.mktime(time.strptime(account_data['expire_date'],"%Y-%m-%d")) 33 if time.time() > exp_time_stamp: 34 print("