简单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设计模式第二十三天【状态模式】
1.应用场景 (1)通过改变对象的内部状态从而改变对象的行为,一般表现为状态的顺序执行 2.代码实现 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from ...
- LODOP打印控件如何提示用户升级下载安装新版本
Lodop.C-Lodop在不断完善功能和更新中,新版本修复了很多问题,以及增加很多有利的功能,网站如何更新版本,提示用户下载新版本呢?更新版本很简单,只需要三步:1.替换提示安装部分的自己放置的路径 ...
- WebAPI MVC Change Identity Default Table
看过之前的文章小伙伴们应该已经明白了,当我们新建一个带有身份验证的模板时,会自带Identity Server,并且它的表名和字段名也都是默认的. 那么该如何修改它,并让EF知道呢?不废话,直接上代码 ...
- 一、Java多人博客系统-开篇
作为一个程序员,工作之外的不断学习是必须的.这个项目是我个人课外学习和练手的项目.最开始是一个个人网站.当时发现京东云可以免费部署网站的,就立即写了一个网站,当时就使用jsp技术,可以实现发布博客.评 ...
- Android ProgressDialog 简单实用
ProgressDialog progressDialog; @SuppressLint("HandlerLeak") Handler handler1 = new Handler ...
- MySql的CURRENT_TIMESTAMP
在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候,该字段默认值为当前时间 ON UPDATE CURRENT_TIMESTAMP表示每次更新这条数据的时候, ...
- web 压力测试工具
最近有收到任务,测试新服务器的性能. 花了很长时间做搜索,也整理了一些资料.以下是收集到一些简单易用的分析工具.推荐给大家使用. WebBenchhttp://www.ha97.com/4623.ht ...
- Docker使用阿里云docker镜像加速
首先进入阿里云docker库首页 https://dev.aliyun.com/ 点击 管理中心 点击 加速器 复制下面的加速地址 进入docker的 Settings 把basic 切换成 adva ...
- luogu3811 乘法逆元
逆元定义:若a*x=1(mod p),(a,p互质),则x为a mod p意义下的逆元 做法见https://www.luogu.org/blog/zjp-shadow/cheng-fa-ni-yua ...
- [HAOI2015]按位或(容斥+前缀和)
题目描述 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作.选择数字i的概率是p[i].保证0<=p[i] ...