简单ATM系统
模拟实现一个ATM + 购物商城程序1.额度 15000或自定义2.实现购物商城,买东西加入 购物车,调用信用卡接口结账3.可以提现,手续费5%4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息5.支持多账户登录6.支持账户间转账7.记录每月日常消费流水8.提供还款接口9.ATM记录操作日志10.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
sys_msg = '''
欢迎使用ATM简单系统,请选择:
1.注册 | 2.登录 | 3.查看余额 | 4.充值 | 5.转账 | 6.还款 |7.取款 | 8.查看流水 | 9.购物 |
10.查看购买商品 | 11.支付 | 12.注销 | 0.退出 | 001.管理员
'''
users_dic = {}
user = {}
user_transfername = {}
user_black = []
import os
import time
def get_users():
'''获取文件内的用户名信息'''
if users_dic:
return users_dic
with open(r'users.txt', 'r', encoding='utf-8')as f:
data = f.read()
if not data:
return users_dic
data_list = data.split(',')
for user_info in data_list:
res = user_info.split('|')
user = res[0]
pwd = res[1]
money = res[2]
money = int(money)
users_dic[user] = {'pwd': pwd, 'money': money}
return users_dic
def add():
'''管理员用户添加功能'''
users_dic = get_users()
temp = '请'
while True:
name = input(temp + '输入添加用户名>>>:').strip()
pwd = input(temp + '输入添加用户初始密码>>>:').strip()
if not name:
print('添加的用户名不能为空')
temp = '请重新'
continue
if not pwd:
print('添加的用户密码不能为空')
temp = '请重新'
continue
break
if not os.path.exists('users.txt'):
with open(r'users.txt', 'w'): pass
with open(r'users.txt', 'a', encoding='utf-8')as f:
if not users_dic:
user_info = '%s|%s|%s' % (name, pwd, 0)
else:
user_info = ',%s|%s|%s' % (name, pwd, 0)
f.write(user_info)
print('用户添加成功')
def check():
'''管理员查看余额功能'''
users_dic = get_users()
temp = '请'
count = 0
while count < 3:
name = input(temp + '输入查看用户名>>>:').strip()
if not name:
print('查看的用户名不能为空')
temp = '请重新'
count += 1
continue
for d, v in users_dic.items():
if name == d:
print('账户:%s | 余额:%s ' % (name, v['money']))
return
else:
print('你要查看的用户名不存在')
count += 1
break
def get_black():
'''获取冻结用户名'''
global user_black
if user_black:
return user_black
with open(r'black.txt', 'r', encoding='utf-8')as f:
for b in f:
if not b:
print('没有冻结用户名')
return
res = b.strip('\n')
user_black.append(res)
return user_black
def freeze():
'''管理员冻结账户功能'''
users_dic = get_users()
print(users_dic)
temp = '请'
user_black = get_users()
count = 0
while count < 3:
name = input(temp + '输入要冻结的用户名>>>:').strip()
if name in user_black:
print('此用户名已经冻结')
temp = '请重新'
count += 1
continue
if not name:
print('用户名不能为空')
temp = '请重新'
count += 1
continue
if name in users_dic:
if not os.path.exists('black.txt'):
with open(r'black.txt', 'w'): pass
with open(r'black.txt', 'a', encoding='utf-8')as f:
f.write('%s\n' % name)
print('已把用户名:%s 冻结' % name)
return
else:
print('你输入用户名错误')
count += 1
ad = {': freeze}
def administrator():
temp = '请'
count = 0
while count < 3:
name = input(temp + '输入管理员账号>>>:').strip()
pwd = input(temp + '输入管理员密码>>>:').strip()
':
print('登入成功,已进入管理员控制')
else:
print('用户名或密码错误')
temp = '请重新'
count += 1
continue
while True:
print('''
0.退出
1.添加账户
2.用户额度
3.冻结账户
''')
serial_number = input('登入权限选择>>>:').strip()
':
print('退出管理员系统')
return
if not serial_number in ad:
print('功能选择错误')
count += 1
continue
ad[serial_number]()
def register():
'''注册功能'''
users_dic = get_users()
temp = '请'
count = 0
while count < 3:
username = input(temp + '输入用户名>>>:').strip()
password = input(temp + '输入用户密码>>>:').strip()
if username in users_dic:
print('此用户名已注册过')
temp = '请重新'
count += 1
continue
elif not username:
print('用户名不能为空')
temp = '请重新'
count += 1
continue
if len(password) < 3:
print('用户密码过短或不能为空')
temp = '请重新'
count += 1
continue
break
if not os.path.exists('users.txt'):
with open(r'users.txt', 'w'): pass
with open(r'users.txt', 'a', encoding='utf-8')as f:
if not users_dic:
user_info = '%s|%s|%s' % (username, password, 0)
else:
user_info = ',%s|%s|%s' % (username, password, 0)
f.write(user_info)
print('注册成功')
def login():
'''登入功能'''
global user
user_black = get_black()
users_dic = get_users()
temp = '请'
count = 0
while count < 3:
username = input(temp + '输入用户名>>>:').strip()
password = input(temp + '输入用户密码>>>:').strip()
if username in user_black:
print('对不起,你的用户名已冻结')
temp = '请重新'
count += 1
continue
for k, v in users_dic.items():
if username == k and password == v['pwd']:
print('登入成功')
user = {'user': username, 'pwd': password, 'money': v['money']}
return user
else:
print('用户名或密码错误!')
temp = '请重新'
count += 1
continue
def auth(logfile='user.log'):
def log_info(func):
'''日志功能,写入文件,包括:充值、转账、还款、取款'''
def wrapper(*args, **kwargs):
if not os.path.exists(logfile):
with open(logfile, 'w'): pass
res = func(*args, **kwargs)
if not res:
return
with open(r'%s' % logfile, 'a', encoding='utf-8')as f:
f.write('%s:%s\n' % (time.strftime('%Y-%m-%d %X'), res))
return wrapper
return log_info
@auth(logfile='user.log')
def top_up():
'''充值功能'''
if not user:
print('未登入状态')
return
temp = '请'
count = 0
while count < 3:
money = input(temp + '输入充值金额>>>:').strip()
if not money:
print('金额不能为空')
temp = '请重新'
count += 1
continue
if not money.isdigit():
print('请正确输入数字')
temp = '请重新'
count += 1
continue
money = int(money)
update_info('money', money)
print('充值成功')
return '账户:|%s| 充值金额:%s' % (user['user'], money)
def update_info(k, v):
'''登入用户信息更新'''
if k == 'money':
user[k] += v
else:
user[k] = v
users_dic = get_users()
users_dic[user['user']][k] = user[k]
user_info = ''
for k, value in users_dic.items():
use = k
pwd = value['pwd']
money = str(value['money'])
if not user_info:
user_info += '|'.join((use, pwd, money))
else:
user_info += ',' + '|'.join((use, pwd, money))
with open(r'users.txt', 'w', encoding='utf-8')as f:
f.write(user_info)
def remaining_sum():
'''查看余额'''
if not user:
print('未登入状态')
return
print('用户名:%s | 密码:%s | 余额:%s |' % (user['user'], user['pwd'], user['money']))
def update_transfer(k, v):
'''转账目标用户信息更新'''
if k == 'money':
user_transfername[k] += v
else:
user_transfername[k] = v
users_dic = get_users()
users_dic[user_transfername['user']]['money'] = user_transfername['money']
user_info = ''
for k, value in users_dic.items():
use = k
pwd = value['pwd']
money = str(value['money'])
if not user_info:
user_info += '|'.join((use, pwd, money))
else:
user_info += ',' + '|'.join((use, pwd, money))
with open(r'users.txt', 'w', encoding='utf-8')as f:
f.write(user_info)
@auth(logfile='user.log')
def transfer_accounts():
'''转账功能'''
global user_transfername
if not user:
print('未登入状态')
return
temp = '请'
count = 0
while count < 3:
money = 1000 + user['money']
print('你可转账的金额为%s' % money)
if money <= 0:
print('你的账户不能再透支')
return
user_transfer = input(temp + '输入转账用户名>>>:').strip()
money_transfer = input(temp + '输入转账金额>>>:').strip()
if not money_transfer:
print('金额不能为空')
temp = '请重新'
count += 1
continue
if not money_transfer.isdigit():
print('金额必须为数字')
temp = '请重新'
count += 1
continue
money_transfer = int(money_transfer)
if money_transfer > money:
print('转账金额超过透支范围')
temp = '请重新'
count += 1
continue
if not user_transfer:
print('用户名不能为空')
temp = '请重新'
count += 1
continue
if user_transfer not in users_dic:
print('转账用户名不存在')
temp = '请重新'
count += 1
continue
for k, v in users_dic.items():
pass
user_transfername = {'user': user_transfer, 'money': v['money']}
money_user = 0 - money_transfer
update_info('money', money_user)
update_transfer('money', money_transfer)
print('转账成功,转账账户:%s | 金额:%s' % (user_transfer, money_transfer))
return '账户:|%s|>>> %s转账金额:%s' % (user['user'], user_transfer, money_transfer)
@auth(logfile='user.log')
def reapayment():
'''还款功能'''
if not user:
print('未登入状态')
return
temp = '请'
count = 0
while count < 3:
if user['money'] > 0:
print('你还没有透支,无需还款')
return
money = -user['money']
print('你需要还款的金额是:%s' % money)
reapay = input(temp + '输入还款金额>>>:').strip()
if not reapay:
print('输入金额不能为空')
temp = '请重新'
count += 1
continue
if not reapay.isdigit():
print('金额必须输入数字')
temp = '请重新'
count += 1
continue
reapay = int(reapay)
update_info('money', reapay)
print('还款成功')
return '账户:|%s| 还款金额:%s' % (user['user'], reapay)
@auth(logfile='user.log')
def withdrawl():
'''取款功能'''
if not user:
print('未登入状态')
return
temp = '请'
count = 0
while count < 3:
money = user['money']
money1 = 1000 + money
print('你的透支额度为:1000,你可以取款%s' % money1)
money2 = input(temp + '输入取款金额>>>:').strip()
if not money2:
print('输入金额不能为空')
temp = '请重新'
count += 1
continue
if not money2.isdigit():
print('金额必须输入数字')
temp = '请重新'
count += 1
continue
money2 = int(money2)
if money2 > money1:
print('你的取款数额超过限制了')
temp = '请重新'
count += 1
continue
draw_money = 0 - money2
update_info('money', draw_money)
print('取款成功')
return '账户:|%s| 取款金额:%s' % (user['user'], money2)
def check_statement():
'''查看流水'''
if not user:
print('未登入状态')
return
with open(r'user.log', 'r', encoding='utf-8')as f:
for data in f:
if not data:
print('没有流水数据')
return
if len(data) < 30:
continue
res = data.split('|')
if user['user'] == res[1]:
print(data)
return
goods_dic = {': 'iPad'}
price_dic = {'iPhone': 100, 'Mac': 200, 'iPad': 50}
# 购物车
shop_car = {}
# {'iPhone': 3, 'iPad': 1}
goods_msg = '''
请添加商品到购物车:
1.iPhone | 2.Mac | 3.iPad | 0.退出购买'''
def shopping():
'''购物商城选购'''
global shop_car
if not user:
print('未登入状态')
return
temp = '请'
count = 0
while count < 3:
print(goods_msg)
good_num = input(temp + '输入商品编码>>>:').strip()
':
print('退出购买')
break
if good_num not in goods_dic:
print('你选择的商品编码不存在')
temp = '请重新'
count += 1
continue
while True:
print(goods_msg)
good_count = input(temp + '输入商品数量>>>:').strip()
if not good_count.isdigit():
print('输入错误!')
temp = '请重新'
continue
if goods_dic[good_num] not in shop_car:
good_count = int(good_count)
shop_car[goods_dic[good_num]] = good_count
else:
good_count = int(good_count)
shop_car[goods_dic[good_num]] += good_count
print(shop_car)
break
return shop_car
def check_goods():
'''购物车功能'''
if not shop_car:
print('你还没添加商品,请前往购物')
return
print('购物车:%s' % shop_car)
@auth(logfile='user.log')
def pay_money():
'''商品支付功能'''
if not user:
print('未登入状态')
return
if not shop_car:
print('没有可支付商品')
return
total = 0
for good in shop_car:
total += price_dic[good] * shop_car[good]
if user['money'] >= total:
print('余额充足,购买成功!')
reduce = 0 - total
update_info('money', reduce)
shop_car.clear()
else:
print('余额不足,请充值!')
top_up()
return '账户:|%s| 购物金额:%s' % (user['user'], total)
def logout():
'''注销功能'''
if not user:
print('未登入状态')
return
else:
user.clear()
print('注销成功')
# 功能字典
method_dic = {
': register,
': login,
': remaining_sum,
': top_up,
': transfer_accounts,
': reapayment,
': withdrawl,
': check_statement,
': shopping,
': check_goods,
': pay_money,
': logout,
': administrator,
}
def system():
while True:
print(sys_msg)
choise = input('>>>>:').strip()
':
print('退出系统')
return
if choise not in method_dic:
print('功能选择错误,请重新选择功能')
continue
method_dic[choise]()
system()
简单ATM系统的更多相关文章
- 高仿中国银行ATM系统
温馨提示由于代码太多只是上传了ATM客户端部分,管理员和超级管理员还有数据库部分上传了工程包,可以直接点击https://i.cnblogs.com/Files.aspx去里面找.package At ...
- .Net简单图片系统-简介
系统简介 最近做了一个简单图片系统,这个系统就是 将上传的的图片保存到系统本地文件系统或者基于fastdfs的分布式文件系统中,在查看图片时会直接请求此系统或者fastdfs的tracker服务器(需 ...
- 用Qt写软件系列三:一个简单的系统工具(上)
导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...
- 使用Struts2和jQuery EasyUI实现简单CRUD系统(转载汇总)
使用Struts2和jQuery EasyUI实现简单CRUD系统(一)——从零开始,ajax与Servlet的交互 使用Struts2和jQuery EasyUI实现简单CRUD系统(二)——aja ...
- Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南
win7&Ubuntu双系统简单搭建系统指南 本文是自己老本子折腾Ubuntu的一些记录,主要是搭建了一个能够足够娱乐(不玩游戏)专注练习自己编程能力的内容.只是简单的写了关于系统的安装和一些 ...
- python实现简单购物车系统(练习)
#!Anaconda/anaconda/python #coding: utf-8 #列表练习,实现简单购物车系统 product_lists = [('iphone',5000), ('comput ...
- 学习笔记:Vue+Node+Mongodb 构建简单商城系统(二)
前面几个月工作有点忙,导致构建简单商城系统的计划搁置近三个月.现在终于有时间重新回过头来继续本计划.本篇主要记录自己在阿里云服务器上搭建node运行环境的整个过程,以及对其中遇到的一些问题的思考. 一 ...
- Python使用Redis实现一个简单作业调度系统
Python使用Redis实现一个简单作业调度系统 概述 Redis作为内存数据库的一个典型代表,已经在非常多应用场景中被使用,这里仅就Redis的pub/sub功能来说说如何通过此功能来实现一个简单 ...
- SSM整合之---简单选课系统
简单选课系统 一.实体图 二.功能 三.代码实现 1.SSM环境搭建 (1)pom.xml <dependencies> <dependency> <groupId> ...
随机推荐
- 规范化Normalization
一.批规范化 Batch Normalization 转自: http://blog.csdn.net/hjimce/article/details/50866313 https://zhuan ...
- How to mount EFI on macOS
mount -t msdos /dev/disk0s1 /volumes/efi
- FMC
FMC (FPGA Mezzanine Card) 编辑 FMC:英文全称,FPGA Mezzanine Card.是一个应用范围.适应环境范围和市场领域范围都很广的通用模块.FMC连接器(FMC C ...
- fiddler软件测试——Fiddler抓取https设置详解(图文)
强烈推荐(原创亲测)!!!Fiddler抓取https设置详解(图文)转 本文主要说明了自己在设置fiddler抓取https过程中所遇到的问题及解决步骤,特别是fiddler在设置证书的环节遇到的各 ...
- HDU3966-Aragorn's Story-树链剖分-点权
很模板的树链剖分题 注意什么时候用线段树上的标号,什么时候用点的标号. #pragma comment(linker, "/STACK:102400000,102400000") ...
- HDU 4344-Mark the Rope-大数素因子分解
注意只有一个素因子的情况. #include <cstdio> #include <algorithm> #include <cstring> using name ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- ysg 一道简单的数论题
先声明一点,这个题从一套模拟题中选取出来,所以可能会冒犯到原出题人.请谅解 题干: ysg,yxy,azw 三人正在刷题. 他们每做一题的时间都是一个有理数. 如果在某一时刻,三人同时做完一道 题,那 ...
- BZOJ 3261 最大异或和(算竞进阶习题)
可持久化Trie 需要知道一个异或的特点,和前缀和差不多 a[p] xor a[p+1] xor....xor a[n] xor x = a[p-1] xor a[n] xor x 所以我们把a[1. ...
- WIN8.1下Prolific USB-to-Serial Comm Port驱动黄色感叹号问题
文章解决来源:http://blog.csdn.net/gsj0791/article/details/17664861 在做fpga口的uart回环测试时候,由于开发板上的是usb转uart,所以需 ...