ATM系统
1、简介
ATM系统包含两个菜单栏,一个是登录、注册菜单栏,一个时是功能菜单栏。
ATM系统共有四个功能:
充值功能:用户登录成功后可以为本账户充值(存款)。
转账功能:用户登录后可以实现两个用户转账功能。
提现功能:用户登录成功后可以为本用户提现(取钱)。
查询余额功能:用户登录成功后可以查看自己账户的余额。
ATM系统包含日志系统:记录,用户的注册、充值、转账、提现、查询、退出(正常退出)信息。
ATM系统的数据和日志采用文件系统书写,可以直接替换成数据库等。
2、准备
文件系统存储在数据文件夹中:db.log存储日志信息、db.txt存储的是用户的账户信息(用户的余额)、user.txt存储注册信息(用户信息、密码)
# 使用到的标准库
import datetime
3、菜单栏
3.1 主菜单栏
def tips1():print("""
====================主菜单===================1 --> 注册2 --> 登录3 --> 退出
==============================================""")
3.2 功能菜单栏
def tips2():print("""
====================功能菜单===================1 --> 充值功能2 --> 转账功能3 --> 提现功能4 --> 查询余额功能5 --> 退出
==============================================""")
4、主页面
4.1 注册功能
def register():"""实现用户注册"""import datetimeprint("欢迎来到注册页面"+"-"*20)ip_name = input("请输入用户名>>>:")passwd = input("请输入密码>>>:")passwd_1 = input("确定密码>>>:")while passwd != passwd_1:print("两次密码不一致,请从新输入密码"+"*"*20)passwd = input("请输入密码>>>:")passwd_1 = input("确定密码>>>:")with open("./数据/user.txt","a+",encoding="utf-8") as f:f.seek(0,0)for line in f:try:name,_ = line.strip().split(":")while ip_name == name:print("用户名已经被占用,重新输入用户名" + "*" * 10)ip_name = input("请重新输入用户名>>>:")except ValueError:passf.write("{}:{}\n".format(ip_name,passwd))with open("./数据/db.log", "a", encoding="utf-8") as f:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')f.write("{}-->在{}注册成功\n".format(ip_name, new_time))with open("./数据/db.txt","a",encoding="utf-8") as f:f.write("{}:0\n".format(ip_name))print("{}注册成功!".format(ip_name))
4.2 登录功能
def login():"""实现用户登录"""import datetimeprint("欢迎来到登录页面"+"-"*20)ip_name = input("请输入用户名>>>:")ip_passwd = input("请输入密码>>>:")with open("./数据/user.txt","r",encoding="utf-8") as f:for line in f:try:name,passwd = line.strip().split(":")if ip_name == name and ip_passwd == passwd:print("{},欢迎来到AMT取款机".format(name))with open("./数据/db.log", "a", encoding="utf-8") as fo:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')fo.write("{}-->在{}登录成功\n".format(ip_name, new_time))return 1,ip_nameelif ip_name == name or ip_passwd != passwd:ip_passwd = input("密码错误,请重新输入密码>>>:")while ip_passwd != passwd:ip_passwd = input("密码错误,请重新输入密码>>>:")print("{},欢迎来到AMT取款机".format(name))with open("./数据/db.log", "a", encoding="utf-8") as fo:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')fo.write("{}-->在{}登录成功\n".format(ip_name, new_time))return 1,ip_nameelse:print("请先注册再登录!!!")except ValueError:passreturn 0,0
5、功能页面
5.1 充值功能
def recharge(ip_uesr):"""用户充值"""import osimport datetimeprint("欢迎来到充值界面"+'-'*30)try:num = float(input("请输入充值的钱(元)>>>:"))if num <= 0:print("充值金额小于0,充值失败!")else:with open("./数据/db.txt","r",encoding="utf-8") as fi,\open("./数据/.db.txt.swap","w",encoding="utf-8") as fo:for line in fi:try:uesr,money = line.strip().split(":")if ip_uesr == uesr:new_money = float(money) + numfo.write("{}:{}\n".format(ip_uesr,new_money))else:fo.write(line)except:passos.remove("./数据/db.txt")os.rename("./数据/.db.txt.swap","./数据/db.txt")print("{}充值{}元成功!".format(ip_uesr,num))with open("./数据/db.log","a",encoding="utf-8") as f:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')f.write("{}-->在{}-->充值{}元\n".format(ip_uesr,new_time,num))except ValueError: # float转换错误print("请输入正确的金额!!!")
5.2 转账功能
def transfer_accounts():"""用户转账"""import osimport datetimeprint("欢迎来到转账界面"+'-'*30)try :payment_user = input("转账付款用户>>>:")payment_money = float(input("转账金额(元)>>>:"))collection_user = input("转账收款用户>>>:")user_list = []with open("./数据/db.txt","r",encoding="utf-8") as f:for line in f:try:user,_ = line.strip().split(":")user_list.append(user)except ValueError: # line 可能没有值passif (payment_user in user_list) and (collection_user in user_list):if payment_money < 0:print("转账的金额小于0,转账失败!")else:with open("./数据/db.txt", "r", encoding="utf-8") as fi, \open("./数据/.db.txt.swap", "w", encoding="utf-8") as fo:for line in fi:try:uesr, money = line.strip().split(":")if uesr == payment_user:if payment_money > float(money):fo.write(line)print("转账失败,余额不足!!")returnelse:new_money = float(money) - payment_moneyfo.write("{}:{}\n".format(payment_user, new_money))print("{}向{}转账{}元成功".format(payment_user, collection_user, payment_money))elif uesr == collection_user:new_money = float(money) + payment_moneyfo.write("{}:{}\n".format(collection_user, new_money))else:fo.write(line)except ValueError:passos.remove("./数据/db.txt")os.rename("./数据/.db.txt.swap", "./数据/db.txt")with open("./数据/db.log", "a", encoding="utf-8") as f:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')f.write("{}-->在{}-->向{}转账{}元\n".format(payment_user, new_time, collection_user, payment_money))elif (payment_user not in user_list) and (collection_user in user_list):print("转账付款用户错误,转账失败!!")elif (collection_user not in user_list) and (payment_user in user_list):print("转账收款用户错误,转账失败!!")else:print("转账收款和付款用户均错误,转账失败!!")except ValueError: # float转换错误print("请输入正确的金额!!!")
5.3 提现功能
def withdrawal(ip_user):"""用户提现"""import osimport datetimeprint("欢迎来到提现界面" + '-' * 30)try:num = float(input("请输入提现的金额(元)>>>:"))if num <= 0:print("提现金额小于0,提现失败!")else:with open("./数据/db.txt", "r", encoding="utf-8") as fi, \open("./数据/.db.txt.swap", "w", encoding="utf-8") as fo:for line in fi:try:uesr, money = line.strip().split(":")if float(money) >= num :if ip_user == uesr:new_money = float(money) - numfo.write("{}:{}\n".format(ip_user, new_money))else:fo.write(line)else:print("余额不足,提现失败!!")returnexcept: # line 空值 split(":")报错passos.remove("./数据/db.txt")os.rename("./数据/.db.txt.swap", "./数据/db.txt")print("{}提现{}元成功!".format(ip_user, num))with open("./数据/db.log", "a", encoding="utf-8") as f:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')f.write("{}-->在{}-->提现{}元\n".format(ip_user, new_time, num))except ValueError: # float转换错误print("请输入正确的金额!!!")
5.4 查看余额功能
def query(ip_user):"""余额查询"""import datetimewith open("./数据/db.txt", "r", encoding="utf-8") as fi:for line in fi:try:uesr, money = line.strip().split(":")if uesr == ip_user:print("用户:{}\n余额:{}".format(ip_user,money))except: # line 空值 split(":")报错passwith open("./数据/db.log", "a", encoding="utf-8") as f:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')f.write("{}-->在{}-->查看余额\n".format(ip_user, new_time))
6、运行主代码
if __name__ == "__main__":while True:tips1()main_function = input("请选择功能>>>:")if main_function == "1": # 注册register()elif main_function == "2": # 登录n,user = login()while n == 1:tips2()function = input("请选择功能>>>:")if function == "1": # 充值功能recharge(user)elif function == "2": # 转账功能transfer_accounts()elif function == "3" : # 提现功能withdrawal(user)elif function == "4": # 查询余额功能query(user)elif function == "5": # 退出with open("./数据/db.log", "a", encoding="utf-8") as f:new_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')f.write("{}-->在{}-->退出登录\n".format(user,new_time))breakelse:print("该功能正在完善,敬请期待!!")elif main_function == "3": # 退出breakelse:print("该功能正在完善,敬请期待!!")