简单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> ...
随机推荐
- python爬虫之scrapy模拟登录
背景: 初来乍到的pythoner,刚开始的时候觉得所有的网站无非就是分析HTML.json数据,但是忽略了很多的一个问题,有很多的网站为了反爬虫,除了需要高可用代理IP地址池外,还需要登录.例如知乎 ...
- Kettle转换工具Windows版安装
一.简介 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文名称叫水壶,该项目的主程序员MAT ...
- python设计模式第二十天【模版方法模式】
1.应用场景 (1)具有相同的操作,但是步骤中具有不同的操作细节 2.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from abc impor ...
- python数据结构与算法第五天【顺序表】
1.列表存储的两种方式 (1)元素内置方式 采用元素内置的方式只能存放同类型元素的数据类型,例如列表中的元素都为整形,元素类型相同,每个元素存放的地址空间大小也相同,则列表中每个元素都是顺序存放的 ( ...
- 微信小程序flex佈局
聲明:display:flex 換行flex-wrap:flex-wrap:nowrap(不換行).wrap(換行).wrap-reserve(第一行在下面): 主軸對齊(橫向對齊)justify-c ...
- oracle 触发器详情
Oracle PL/SQL编程之八: 把触发器说透 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触 ...
- CountDownLatch(三)
CountDownLatch简介 (1)用于解决什么问题? 在并发编程的场景中,最常见的一个case是某个任务的执行,需要等到多个线程都执行完毕之后才可以进行,CountDownLatch可以很好解决 ...
- ASP.NET MVC和Web API中的Angular2 - 第2部分
下载源码 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索,全局错误处理,调试客 ...
- 为AI提供数据:构建2017数据创新的总结
本周在微软年度大会上,我们正在讨论组织如何依靠开发人员创造突破性的经验.随着大数据,云和人工智能的融合,创新与破坏正在加速,从未见过.数据是这一融合核心的关键战略资产.当结合云的无限计算能力和机器学习 ...
- c++ 怎么输出保留2位小数的浮点数
//添加头文件 #include<iomanip> //定义变量 folat a=9.1; cout<<setiosflags(ios::fixed)<<setpr ...