模拟实现一个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系统的更多相关文章

  1. 高仿中国银行ATM系统

    温馨提示由于代码太多只是上传了ATM客户端部分,管理员和超级管理员还有数据库部分上传了工程包,可以直接点击https://i.cnblogs.com/Files.aspx去里面找.package At ...

  2. .Net简单图片系统-简介

    系统简介 最近做了一个简单图片系统,这个系统就是 将上传的的图片保存到系统本地文件系统或者基于fastdfs的分布式文件系统中,在查看图片时会直接请求此系统或者fastdfs的tracker服务器(需 ...

  3. 用Qt写软件系列三:一个简单的系统工具(上)

    导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...

  4. 使用Struts2和jQuery EasyUI实现简单CRUD系统(转载汇总)

    使用Struts2和jQuery EasyUI实现简单CRUD系统(一)——从零开始,ajax与Servlet的交互 使用Struts2和jQuery EasyUI实现简单CRUD系统(二)——aja ...

  5. Ubuntu学习笔记-win7&Ubuntu双系统简单搭建系统指南

    win7&Ubuntu双系统简单搭建系统指南 本文是自己老本子折腾Ubuntu的一些记录,主要是搭建了一个能够足够娱乐(不玩游戏)专注练习自己编程能力的内容.只是简单的写了关于系统的安装和一些 ...

  6. python实现简单购物车系统(练习)

    #!Anaconda/anaconda/python #coding: utf-8 #列表练习,实现简单购物车系统 product_lists = [('iphone',5000), ('comput ...

  7. 学习笔记:Vue+Node+Mongodb 构建简单商城系统(二)

    前面几个月工作有点忙,导致构建简单商城系统的计划搁置近三个月.现在终于有时间重新回过头来继续本计划.本篇主要记录自己在阿里云服务器上搭建node运行环境的整个过程,以及对其中遇到的一些问题的思考. 一 ...

  8. Python使用Redis实现一个简单作业调度系统

    Python使用Redis实现一个简单作业调度系统 概述 Redis作为内存数据库的一个典型代表,已经在非常多应用场景中被使用,这里仅就Redis的pub/sub功能来说说如何通过此功能来实现一个简单 ...

  9. SSM整合之---简单选课系统

    简单选课系统 一.实体图 二.功能 三.代码实现 1.SSM环境搭建 (1)pom.xml <dependencies> <dependency> <groupId> ...

随机推荐

  1. python设计模式第二十三天【状态模式】

    1.应用场景 (1)通过改变对象的内部状态从而改变对象的行为,一般表现为状态的顺序执行 2.代码实现 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from ...

  2. LODOP打印控件如何提示用户升级下载安装新版本

    Lodop.C-Lodop在不断完善功能和更新中,新版本修复了很多问题,以及增加很多有利的功能,网站如何更新版本,提示用户下载新版本呢?更新版本很简单,只需要三步:1.替换提示安装部分的自己放置的路径 ...

  3. WebAPI MVC Change Identity Default Table

    看过之前的文章小伙伴们应该已经明白了,当我们新建一个带有身份验证的模板时,会自带Identity Server,并且它的表名和字段名也都是默认的. 那么该如何修改它,并让EF知道呢?不废话,直接上代码 ...

  4. 一、Java多人博客系统-开篇

    作为一个程序员,工作之外的不断学习是必须的.这个项目是我个人课外学习和练手的项目.最开始是一个个人网站.当时发现京东云可以免费部署网站的,就立即写了一个网站,当时就使用jsp技术,可以实现发布博客.评 ...

  5. Android ProgressDialog 简单实用

    ProgressDialog progressDialog; @SuppressLint("HandlerLeak") Handler handler1 = new Handler ...

  6. MySql的CURRENT_TIMESTAMP

    在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候,该字段默认值为当前时间 ON UPDATE CURRENT_TIMESTAMP表示每次更新这条数据的时候, ...

  7. web 压力测试工具

    最近有收到任务,测试新服务器的性能. 花了很长时间做搜索,也整理了一些资料.以下是收集到一些简单易用的分析工具.推荐给大家使用. WebBenchhttp://www.ha97.com/4623.ht ...

  8. Docker使用阿里云docker镜像加速

    首先进入阿里云docker库首页 https://dev.aliyun.com/ 点击 管理中心 点击 加速器 复制下面的加速地址 进入docker的 Settings 把basic 切换成 adva ...

  9. luogu3811 乘法逆元

    逆元定义:若a*x=1(mod p),(a,p互质),则x为a mod p意义下的逆元 做法见https://www.luogu.org/blog/zjp-shadow/cheng-fa-ni-yua ...

  10. [HAOI2015]按位或(容斥+前缀和)

    题目描述 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal 的or)操作.选择数字i的概率是p[i].保证0<=p[i] ...