模拟实现一个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. linux中$1的意思

    $1 在shell中成为“位置参数”,表示传入的第一个参数.在shell脚本主体中,表示shell脚本的第一个参数.用在shell脚本函数里时,表示的是函数的第一个入参.

  2. vue.js2.0:如何搭建开发环境及构建项目

    1,安装node.js Node.js官网:https://nodejs.org/en/ 进入Node.js官网,选择下载并安装Node.js.安装过程只需要点击“下一步”即可, 如下图,非常简单. ...

  3. vue計算屬性

    計算屬性:computed 和method的差別:computed是基於它的依賴緩存,只有它的相關依賴發生改變時才會重新獲取值. method是在重新渲染時,函數總會重新調用. comuputed:默 ...

  4. git 提交的步骤

    1. git init //初始化仓库   2. git add .(文件name) //添加文件到本地仓库   3. git commit -m "first commit" / ...

  5. 【python练习题】程序16

    #题目:输出指定格式的日期. import time print (time.strftime('%Y:%m:%d %X',time.localtime(time.time())))

  6. spring 在容器中一个bean依赖另一个bean 需要通过ref方式注入进去 通过构造器 或property

    spring  在容器中一个bean依赖另一个bean 需要通过ref方式注入进去 通过构造器 或property

  7. Tcp协议的keepalive功能

    L:128

  8. ab与nc命令,tcpdump命令

    ab与nc命令,tcpdump命令 ab  -p post.txt  -T  application/json   "http://127.0.0.1:8083/main/index&quo ...

  9. Typecho——简介及安装

    Typecho Typecho是由type和echo两个词合成的,来自于开发团队的头脑风暴.Typecho基于PHP5开发,支持多种数据库,是一款内核强健﹑扩展方便﹑体验友好﹑运行流畅的轻量级开源博客 ...

  10. HDU4341-Gold miner-分组DP

    模拟黄金矿工这个游戏,给出每一个金子的位置和所需时间,计算在给定时间内最大收益. 刚看这道题以为金子的位置没什么用,直接DP就行,WA了一发终于明白如果金子和人共线的话只能按顺序抓. 这就是需要考虑先 ...