模拟实现一个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之路--内置函数, 匿名函数

    一 . 内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. 字符串类型代码的执⾏ eval() 执⾏字符串类型的代码. 并返回最终结果( ...

  2. python数据结构与算法第十天【插入排序】

    1.插入排序的原理 2.代码实现 def insert_sort(alist): # 从第二个位置,即下标为1的元素开始向前插入 for i in range(1, len(alist)): # 从第 ...

  3. Python——FTP上传和下载

    一.FTP对象方法说明 login(user='anonymous',passwd='', acct='') 登录 FTP 服务器,所有参数都是可选的 pwd() 获得当前工作目录 cwd(path) ...

  4. ReadWriteLock读写锁(八)

    前言:在JUC ReentrantReadWriteLock是基于AQS实现的读写锁实现. ReadWriteLock中定义了读写锁需要实现的接口,具体定义如下: public interface R ...

  5. python爬虫requests模块

    requests库的七个主要方法 1. requests.requests(method, url, **kwargs) 构造一个请求,支撑以下各方法的基础方法 method:请求方式,对应get/p ...

  6. Matplotlib学习---用matplotlib画箱线图(boxplot)

    箱线图通过数据的四分位数来展示数据的分布情况.例如:数据的中心位置,数据间的离散程度,是否有异常值等. 把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分 ...

  7. 直接使用security.basic.path无效|——springboot2.0以上的security的配置

    问题 springcloud 版本 为 Finchley.RELEASEspringboot 版本为 2.0.3.RELEASE 现在有需求,/swagger-ui.html 页面需要添加登录认证,但 ...

  8. project 2013 删除资源

    1.分析 在资源名称这边一旦输入过资源名称,下次点击下拉框就会出现历史记录,如何删除 2.步骤 资源-->分配资源-->点击资源名称,按F2,按DEL键

  9. MT【305】丹德林双球

    如图.在正方体$ABCD-A_1B_1C_1D_1$中,点$M,N$分别是直线$CD,AB$上的动点,点$P$是$\Delta A_1C_1D_1$内的动点(不包括边界),记直线$DP$与$MN$所成 ...

  10. JSON数组形式字符串转换为List<Map<String,String>>的几种方法

    package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArr ...