Python实现ATM+购物商城
一、程序介绍
需求:
模拟实现一个ATM + 购物商城程序
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
实现功能:
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
程序结构:
atm/
├── README
└── atm #ATM主程目录
├── __init__.py
├── bin #ATM 执行文件 目录
│ ├── __init__.py
│ ├── atm.py #ATM 执行程序
│ └── manage.py #ATM 管理端,未实现
├── 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 #存各个用户的账户数据 ,一个用户一个文件
│ └── 1234.json #一个用户账户示例文件
└── log #日志目录
├── __init__.py
├── access.log #用户访问和操作的相关日志
└── transactions.log #所有的交易日志
二、流程图
三、代码
bin/atm.py
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import os 5 import sys 6 base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 7 print(base_dir) 8 sys.path.append(base_dir) 9 10 from core import main 11 12 if __name__ == '__main__': 13 main.run()
conf/settings.py
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 import os 4 import sys 5 import logging 6 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 7 8 9 DATABASE = { 10 'engine': 'file_storage', #support mysql,postgresql in the future 11 'name':'accounts', 12 'path': "%s/db" % BASE_DIR 13 } 14 15 16 LOG_LEVEL = logging.INFO 17 LOG_TYPES = { 18 'transaction': 'transactions.log', 19 'access': 'access.log', 20 } 21 22 TRANSACTION_TYPE = { 23 'repay':{'action':'plus', 'interest':0.03}, 24 'withdraw':{'action':'minus', 'interest':0.05}, 25 'transfer':{'action':'minus', 'interest':0.05}, 26 'consume':{'action':'minus', 'interest':0}, 27 28 }
core/main.py
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 ''' 5 main program handle module , handle all the user interaction stuff 6 7 ''' 8 9 from core import auth 10 from core import accounts 11 from core import logger 12 from core import accounts 13 from core import transaction 14 from core.auth import login_required 15 import time 16 17 #transaction logger 18 trans_logger = logger.logger('transaction') 19 #access logger 20 access_logger = logger.logger('access') 21 22 23 #temp account data ,only saves the data in memory 24 user_data = { 25 'account_id':None, 26 'is_authenticated':False, 27 'account_data':None 28 29 } 30 31 def account_info(acc_data): 32 account_data = accounts.load_current_balance(acc_data['account_id']) 33 data_info = u''' 34 33[34;1m 账号ID:%s 35 余额: %s 36 信用度:%s 37 账号注册时间:%s 38 账号过期时间:%s 39 工资天数:%s 40 33[0m'''%(acc_data['account_id'], 41 account_data['balance'], 42 account_data['credit'], 43 account_data['enroll_date'], 44 account_data['expire_date'], 45 account_data['pay_day'],) 46 print(data_info) 47 48 49 @login_required 50 def repay(acc_data): 51 ''' 52 print current balance and let user repay the bill 53 :return: 54 ''' 55 account_data = accounts.load_current_balance(acc_data['account_id']) 56 #再从硬盘加载一次数据, 为了确保数据是最新的 57 #for k,v in account_data.items(): 58 # print(k,v ) 59 current_balance= ''' --------- BALANCE INFO -------- 60 Credit : %s 61 Balance: %s''' %(account_data['credit'],account_data['balance']) 62 print(current_balance) 63 back_flag = False 64 while not back_flag: 65 repay_amount = input("