settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
Shopping_info = '%s/shopping_mall/shop_list' % BASE_DIR
Database_user_info = r'%s/atm\database\user_info' % BASE_DIR
Log = r'%s/atm\log\behave'%BASE_DIR
cash_in.py
from atm.conf import settings
import os
import json
def incash(user_info):
in_cash = float(input('请输入还款金额:').strip())
user_info['balance'] = user_info['balance'] + in_cash
account_path = os.path.join(settings.Database_user_info, '%s.json' % user_info['id'])
with open(account_path,'w',encoding='utf-8') as f:
json.dump(user_info, f)
print('【系统提示】%s元已到账!'%in_cash)
cash_out.py
from atm.core import pay_center
def out(user_info):
out = float(input('【系统提示】总金额%.2f\n【系统提示】当前可以提取最大金额%.2f\n请输入提现金额>>>'%(user_info['balance'],float(user_info['balance'])/1.05)))
sum = out*1.05
if sum <= user_info['balance'] :
pay_center.cost(user_info,sum)
print('账户金额已发放,本次提取金额%.2f,手续费%.2f'%(out,sum-out))
else:
print('你的余额不足!')
cash_transfer.py
import os
import json
from atm.conf import settings
def transfer(user_info):
transfer_obj = input('请输入转账用户名').strip()
transfer_cash = float(input('请输入转账金额'))
#先扣款
path = os.path.join(settings.Database_user_info, '%s.json' % user_info['id'])
with open(path, 'r') as f:
data1 = json.load(f)
data1['balance'] -= transfer_cash
with open(path, 'w') as g:
json.dump(data1, g)
# 再到账
path = os.path.join(settings.Database_user_info, '%s.json' % transfer_obj)
with open(path, 'r') as f:
data = json.load(f)
data['balance'] += transfer_cash
with open(path, 'w') as g:
json.dump(data, g)
print('转账给%s,%.2f元成功!'%(transfer_obj,transfer_cash))
check_account.py
import os
from atm.conf import settings
import json
def check(username,pwd):
'''
支付信息验证
:param username:
:param pwd:
:return:
'''
addr = os.path.join(settings.Database_user_info,'%s.json' % username)
if os.path.isfile(addr):
with open(addr, 'r', encoding='utf-8') as f:
u = json.load(f)
if username == u['id'] and pwd == u['password']:
return u
else:
return False
else:
print('该账户不存在')
return False
distribution_center.py
from atm.core import cash_out,cash_in,cash_transfer
def distribute(user_info):
while True:
choice = input('+---------支付功能--------+\n1.提现\n2.还款\n3.转账\n4.退出').strip()
if user_info['status'] == 0:
if choice == '1':
cash_out.out(user_info)
elif choice == '2':
cash_in.incash(user_info)
elif choice == '3':
cash_transfer.transfer(user_info)
elif choice == '4':
break
else:
print(user_info['id']+'已经被锁定!')
break
main_func.py
from atm.core import check_account,distribution_center
from atm.log import logging
def main_func():
while True:
status = True
username = input('请输入支付账户').strip()
pwd = input('请输入密码').strip()
res = check_account.check(username,pwd)
if res['status'] == 0:
print('欢迎使用支付平台!')
logging.login(username,status)
distribution_center.distribute(res)
break
else:
print('登录失败!')
status = False
logging.login(username,status)
break
pay_center.py
from atm.conf import settings
import os
import json
def cost(username,pay_money):
username['balance'] = username['balance'] - pay_money
user_path = os.path.join(settings.Database_user_info, '%s.json' % username['id'])
with open(user_path, 'w', encoding='utf-8') as f:
json.dump(username, f)
boy.json
{"id": "boy", "password": "789", "credit": 10000.0, "balance": 9855.0, "enroll_date": "2018-07-14", "expire_date": "2018-09-20", "status": 0, "payday": "5"}
panda.json
{"id": "panda", "password": "123", "credit": 15000.0, "balance": 159.0, "enroll_date": "2018-07-13", "expire_date": "2099-12-12", "status": 0, "payday": "1"}
pandaboy.json
{"id": "pandaboy", "password": "456", "credit": 150000.0, "balance": 150000.0, "enroll_date": "2018-07-14", "expire_date": "2018-08-16", "status": 0, "payday": "1"}
zombie.json
{"id": "zombie", "password": "777", "credit": 5.0, "balance": 100000.0, "enroll_date": "2018-07-14", "expire_date": "2018-09-10", "status": 0, "payday": "5"}
login.log
2018-07-14 10:02:29+-----+panda+-----+登录失败
2018-07-14 10:04:03+-----+panda+-----+登录失败
2018-07-14 10:04:35+-----+panda+-----+登录成功
2018-07-14 10:16:00+-----+panda+-----+登录成功
2018-07-14 10:30:26+-----+panda+-----+登录成功
2018-07-14 10:31:08+-----+panda+-----+登录成功
2018-07-14 10:32:43+-----+panda+-----+登录成功
2018-07-14 10:36:58+-----+panda+-----+登录成功
2018-07-14 10:38:13+-----+panda+-----+登录成功
2018-07-14 10:38:50+-----+panda+-----+登录成功
2018-07-14 10:40:53+-----+panda+-----+登录成功
2018-07-14 10:48:12+-----+panda+-----+登录成功
2018-07-14 10:50:03+-----+panda+-----+登录成功
2018-07-14 10:53:11+-----+boy+-----+登录成功
2018-07-14 11:03:08+-----+panda+-----+登录成功
2018-07-14 11:04:20+-----+panda+-----+登录成功
2018-07-14 11:05:39+-----+panda+-----+登录成功
2018-07-14 11:06:34+-----+panda+-----+登录成功
2018-07-14 11:07:05+-----+panda+-----+登录成功
2018-07-14 11:11:57+-----+panda+-----+登录成功
2018-07-14 11:13:41+-----+panda+-----+登录成功
2018-07-14 11:14:05+-----+panda+-----+登录成功
2018-07-14 11:16:41+-----+panda+-----+登录失败
2018-07-14 11:22:55+-----+panda+-----+登录成功
2018-07-14 11:35:00+-----+panda+-----+登录成功
2018-07-14 11:35:08+-----+boy+-----+登录成功
logging.py
import logging
import os
from atm.conf import settings
def login(username,status):
log_file = os.path.join(settings.Log, 'login.log')
login_logger = logging.getLogger()
login_logger.setLevel(logging.DEBUG)
fh = logging.FileHandler(log_file, mode='a')
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s+-----+%(message)s', datefmt='%Y-%m-%d %H:%M:%S')
fh.setFormatter(formatter)
login_logger.addHandler(fh)
if status == True:
logging.info('%s+-----+登录成功' % username)
else:
logging.info('%s+-----+登录失败' % username)
add_user.py
import time
from atm.conf import settings
import json
import os
def save(user_info):
file_directory = os.path.join(settings.Database_user_info, '%s.json' % user_info['id'])
f = open(file_directory, 'w')
json.dump(user_info, f)
def load(user_info):
file_directory = os.path.join(settings.Database_user_info, '%s.json' % user_info)
f = open(file_directory, 'r')
user_data = json.load(f)
return user_data
def add_users():
account = {}
account['id'] = input('账户:').strip()
account['password'] = input('密码:').strip()
account['credit'] = round(float(input('信用额度:').strip()), 2)
account['balance'] = account['credit']
account['enroll_date'] = time.strftime('%Y-%m-%d', time.localtime())
account['expire_date'] = input('有效期:(格式如%s):' % account['enroll_date']).strip()
account['status'] = 0
account['payday'] = input('还款日(号):').strip()
save(account)
change_credit.py
from atm.root import add_user
def change(username):
username = add_user.load(username)
username['credit'] = round(float(input('请输入调整后的信用额度:').strip()), 2)
print('\033[0;32m修改成功! \033[0m')
add_user.save(username)
freeze_user.py
from atm.root import add_user
def freeze(username):
username = add_user.load(username)
username['status'] = 1
print('\033[0;32m账户已冻结!\033[0m')
add_user.save(username)
root_func.py
from atm.root import add_user,change_credit,freeze_user,unfreeze_user
def login():
root_name = 'root'
root_pwd = '123'
rootname = input('请输入超级用户账号').strip()
rootpwd = input('请输入超级用户密码').strip()
while True:
if root_name ==rootname and root_pwd ==rootpwd:
print('------超级用户权限------\n1.添加账户\n2.修改账户额度\n3.冻结账户\n4.解冻账户\n5.退出')
choice = input('请输入功能序号').strip()
if choice == '1':
add_user.add_users()
elif choice == '2':
username = input('请输入需要修改的用户名').strip()
change_credit.change(username)
elif choice== '3':
username = input('请输入需要冻结的用户名').strip()
freeze_user.freeze(username)
elif choice== '4':
username = input('请输入需要解冻的用户名').strip()
unfreeze_user.unfreeze(username)
elif choice== '5':
break
else:
print('错误的命令!')
else:
print('错误的用户信息及密码')
break
unfreeze_user.py
from atm.root import add_user
def unfreeze(username):
username = add_user.load(username)
username['status'] = 0
print('\033[0;32m账户已解冻!\033[0m')
add_user.save(username)
pay_calling.py
from atm.core import check_account,pay_center
def pay(pay_money):
account = input('请输入支付账户').strip()
pwd = input('请输入支付密码').strip()
res = check_account.check(account, pwd)
if res:
if res['balance'] >= pay_money:
pay_center.cost(res, pay_money)
return True
else:
return False
record_history
2018-07-14 [{'name': '少了一半的苹果', 'price': 25}] 总价:25
shopping_list
{"panda": [], "pandaboy": [], "boy": [], "root": []}
user_info
{"panda": "123", "pandaboy": "456", "boy": "789", "root": "110"}
README
+----------------------------------------+
功能实现说明
1、额度 15000或自定义(已完成,自定义)
2、实现购物商城,买东西加入 购物车,调用信用卡接口结账(已完成)
3、可以提现,手续费5%(已完成)
4、支持多账户登录(支持)
5、支持账户间转账(已完成)
6、记录每月日常消费流水(已完成)
7、提供还款接口(已完成)
8、ATM记录操作日志(未完成)
9、提供管理接口,包括添加账户、用户额度,冻结账户等。。。
添加账户(已完成)
用户额度(可修改)
冻结账户(已完成)
解冻账户(已完成)
10、用户认证用装饰器(已完成)
+----------------------------------------+
更新日期:2018-07-14
系统功能
1.支付中心
测试支付账户 :panda
测试支付密码:123
支付功能
1.提现
测试提现金额:20
2.还款
还款金额:50
3.转账
转账账户:boy
转账金额:20
4.退出
+----------------------------------------+
2.购物商城
测试购物商城账号:panda
测试购物商城密码:123
商城功能
1.购物
选择商品 1
退出购物 0
输入支付账户:panda
输入支付密码:123
调用支付功能成功
2.查询
3.退出
+----------------------------------------+
3.超级用户
超级用户账号:root
超级用户密码:123
超级用户功能
1.添加账户
账户:zombie
密码:777
信用额度:100000
有效期:(格式如2018-07-14):2018-09-10
还款日(号):5
2.修改账户额度
修改的用户名zombie
调整后的信用额度:5
3.冻结账户
冻结的用户名panda
4.解冻账户
解冻的用户名panda
5.退出
+----------------------------------------+
startup.py
from shopping_mall.shop_list import mall
from atm.root import root_func
from atm.core import main_func
if __name__ == '__main__':
while True:
choice = input('欢迎登录XXX,请选择以下功能\n1.支付中心\n2.购物商城\n3.超级用户\n4.退出').strip()
if choice == '1':
main_func.main_func()
elif choice == '2':
mall.main()
elif choice == '3':
root_func.login()
elif choice == '4':
exit()
else:
print('【系统提示】错误的信息!')
- 路飞学城—Python爬虫实战密训班 第三章
路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...
- 路飞学城—Python爬虫实战密训班 第二章
路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...
- 路飞学城Python爬虫课第一章笔记
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...
- 路飞学城-Python开发集训-第3章
学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...
- 路飞学城-Python开发集训-第1章
学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...
- 路飞学城-Python开发集训-第4章
学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...
- 路飞学城-Python开发集训-第2章
学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...
- 路飞学城-Python开发-第二章
''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...
- 路飞学城-Python开发-第三章
# 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...
- 路飞学城-Python开发-第一章
# 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...
随机推荐
- Oracle自制事务
数据库事务是一种单元操作,要么全部操作成功,要么全部失败.在Oracle中,一个事务是从执行第一个数据操作语言(DML)语句开始的,直到执行一个COMMIT语句,提交保存事务,或执行一个ROLLBAC ...
- 「JavaSE 重新出发」05.01 继承
继承 一个对象变量可以指示多种实际类型的现象被称为多态(polymorphism). 在运行时能够自动地选择调用哪个方法的现象称为动态绑定(dynamic binding). 如果是private方法 ...
- face++算法工程实习生面试
2018-01-11 算法工程实习生 自动化工具链方面 面试的知识点非常仔细,十分检验基本功底 1.自我介绍 2.算法题,leetcode 第一题 两数之和 问python中数组和字典的查找时间复杂 ...
- node——读取文件中的路径问题
前提 当前的js文件叫_dirnameandfilename.js和hello.txt同在G:\node练习文件夹下 还有一个_dirnameandfilename.js文件在i:/文件夹,但是i:/ ...
- [Vue warn]: Invalid prop: custom validator check failed for prop "type".
遇到错误如下, [Vue warn]: Invalid prop: custom validator check failed for prop "type". found in ...
- BZOJ 3413 匹配 (后缀自动机+线段树合并)
题目大意: 懒得概括了 神题,搞了2个半晚上,还认为自己的是对的...一直调不过,最后终于在jdr神犇的帮助下过了这道题 线段树合并该是这道题最好理解且最好写的做法了,貌似主席树也行?但线段树合并这个 ...
- [luogu1772 ZJOI2006] 物流运输 (最短路 线性dp)
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- zabbbix4.0升级到4.2
一.添加Zabbix存储库 1.安装存储库配置包. rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4 ...
- Android开发新手HelloWorld解析
首先看这个 HelloWorld 类. Java代码public class HelloWorld extends Activity { /** Called when the activ ...
- php安装redis扩展 windows
官方php_redis.dll 找了很久,感谢热心的网友,这是php官方的 php_redis.dll http://windows.php.net/downloads/pecl/releases/r ...