atm_v4.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ----------------------------------------------------------# # Date : 2020-09-17 # # Author : Created by zhouwanchun. # # Wechat : WGzhouwanchu # # Function: This scripts function is ... # # Version : 4.0 # # ----------------------------------------------------------# # MySQL建库建表。 # create database atm charset=utf8mb4; # CREATE TABLE `user` ( # `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', # `username` varchar(64) NOT NULL COMMENT '账户', # `password` varchar(64) NOT NULL COMMENT '密码', # `money` varchar(10) NOT NULL COMMENT '余额', # `tel` char(11) NOT NULL COMMENT '手机号', # `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '账户创建时间', # `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据最后修改时间', # PRIMARY KEY (`id`) # ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账户表'; import mysql.connector # import myloginpath import os import time # 只要用户已经登录进来,就给他一个临时身份字典,这样就避免了每次都去读用户表信息;同时用于用户在线校验(建议写装饰器)。 atm_user = {'username': 'None', 'password': '', 'status': 'offline'} # conn_user = "zhouwanchun" # mylogin = myloginpath.parse(conn_user) # print(mylogin, type(mylogin)) # conn = mysql.connector.connect(**mylogin) conn = mysql.connector.connect( host='10.0.0.11', port=3306, user='zhouwanchun', password='123', charset='utf8' ) sql_cmd = conn.cursor() # 校验账户是否存在。 def check_username(username): sql1 = "select username from atm.user;" sql_cmd.execute(sql1) result = sql_cmd.fetchall() # print(result, type(result)) for i in result: if username == i[0]: return True else: return False # 校验密码是否正确。 def check_password(username, password): sql1 = "select username,password from atm.user where username=%s;" values = (username,) sql_cmd.execute(sql1, values) result = sql_cmd.fetchall() # print(result, type(result)) for i in result: if password == i[1]: atm_user['username'] = username atm_user['password'] = password atm_user['status'] = 'online' return True else: return False # insert_atm_user def insert_atm_user(username, password, money, tel): sql1 = "insert into atm.user(username,password,money,tel) values(%s,%s,%s,%s);" values = [(username, password, money, tel), ] sql_cmd.executemany(sql1, values) conn.commit() print("[", sql_cmd.rowcount, "]", "\033[1;32m数据插入成功!\033[0m") # 1.登录 def login(): print("\033[1;32m-------------------------欢迎进入用户登录页面-------------------------\033[0m") while True: username = input("请输入你的账户名: ").strip() if check_username(username): password = input("请输入你的密码: ").strip() if check_password(username, password): print("\033[1;32m登录成功!\033[0m") return True else: print("\033[1;31m你输入的密码不对!\033[0m") break else: print("\033[1;31m该账户名不存在!\033[0m") break # 2.注册 def register(): print("\033[1;32m-------------------------欢迎进入账户注册页面-------------------------\033[0m") username = input("请注册你的账户: ").strip() if username.isalpha(): if not check_username(username): password = input("请设置你的密码: ").strip() if not len(password) < 3: tel = input("请输入你的手机号: ").strip() if tel.isdecimal() and len(tel) == 11: money = 0 insert_atm_user(username, password, money, tel) print("\033[1;32m恭喜你,你已经注册成功,请开始登录使用吧!\033[0m") else: print("\033[1;31m请输入标准的11为数字手机号码!\033[0m") else: print("\033[1;31m密码字符长度不可以小于3个!\033[0m") else: print("\033[1;35m" + username + "\033[0m" + " \033[1;31m账户名已经被注册过!\033[0m") else: print("\033[1;31m用户名填写格式不对,用户名必须是字母组成!\033[0m") # 3.余额 def balance(): if_online = online() if if_online == 'online': print("\033[1;32m-------------------------正在查询当前账户余额信息-------------------------\033[0m") sql1 = "select username,money from atm.user where username=%s;" values = (atm_user['username'],) sql_cmd.execute(sql1, values) result = sql_cmd.fetchall() for i in result: print("你的余额: [ " + "\033[1;33m" + i[1] + "\033[0m" + " ¥ ]") return int(result[0][1]) else: print("\033[1;31m请先登录你的账户!\033[0m") # 4.存款 def deposit(): if_online = online() if if_online == 'online': save_money = input("请输入你要存款的金额: ").strip() if save_money.isdecimal(): sql1 = "select username,money from atm.user where username=%s;" val1 = (atm_user['username'],) sql_cmd.execute(sql1, val1) result = sql_cmd.fetchall() before_money = int(result[0][1]) # 之前的钱 save_money = int(save_money) # 存款金额 last_money = before_money + save_money # 最后更新的余额 sql2 = "update atm.user set money=%s where username=%s;" val2 = (last_money, atm_user['username'],) sql_cmd.execute(sql2, val2) conn.commit() print("[", sql_cmd.rowcount, "]", "\033[1;32m数据更新成功!\033[0m") else: print("\033[1;31m请不要使用假币!存款金额应该为数字!\033[0m") else: print("\033[1;31m请先登录你的账户!\033[0m") # 5.取款 def outmoney(): if_online = online() if if_online == 'online': out_money = input("请输入你要取款的金额: ").strip() if out_money.isdecimal(): sql1 = "select username,money from atm.user where username=%s;" val1 = (atm_user['username'],) sql_cmd.execute(sql1, val1) result = sql_cmd.fetchall() before_money = int(result[0][1]) # 之前的钱 out_money = int(out_money) # 取款金额 last_money = before_money - out_money # 最后更新的余额 if out_money <= before_money: sql2 = "update atm.user set money=%s where username=%s;" val2 = (last_money, atm_user['username'],) sql_cmd.execute(sql2, val2) conn.commit() print("[", sql_cmd.rowcount, "]", "\033[1;32m数据更新成功!\033[0m") else: print("\033[1;31m账户余额不足!\033[0m") else: print("\033[1;31m取款金额应该为数字!\033[0m") else: print("\033[1;31m请先登录你的账户!\033[0m") # 6.修改密码 def change_password(): if_online = online() if if_online == 'online': org_passowrd = input("请输入原密码: ").strip() sql1 = "select username,password from atm.user where username=%s;" val1 = (atm_user['username'],) sql_cmd.execute(sql1, val1) result = sql_cmd.fetchall() if org_passowrd == result[0][1]: new1_password = input("请设置新密码: ").strip() new2_password = input("请再次确认新密码: ").strip() if new1_password == new2_password: if new1_password.isdecimal() and new2_password.isdecimal() and len(new1_password and new2_password) == 6: sql2 = "update atm.user set password=%s where username=%s;" val2 = (new2_password, atm_user['username'],) sql_cmd.execute(sql2, val2) conn.commit() atm_user['status'] = 'offline' atm_user['username'] = 'None' print("\033[1;32m密码修改成功!请重新登录!\033[0m") else: print("\033[1;31m密码填写格式不对,必须由6位数字组成!\033[0m") else: print("\033[1;31m两次设置输入新密码不一致,修改密码失败!\033[0m") else: print("\033[1;31m原密码错误!\033[0m") else: print("\033[1;31m请先登录你的账户!\033[0m") # 7.注销账号 def delete_user(): if_online = online() if if_online == 'online': balance_num = balance() if not balance_num == 0: print("请先取走你所有的余额!避免事后纠纷!") else: print("请你再次确认是否注销当前的账号,账号注销成功后将无法找回!") delete_ok = input("请你确认,注销Yes \ 不注销No! ---> ").strip() if delete_ok == "yes": sql1 = "delete from atm.user where username=%s;" val1 = (atm_user['username'],) sql_cmd.execute(sql1, val1) conn.commit() print("\033[1;32m你的账号 \033[0m" + atm_user['username'] + "\033[1;32m 已经注销,欢迎你下次注册使用!\033[0m") atm_user['username'] = 'None' atm_user['password'] = '' atm_user['status'] = 'offline' elif delete_ok == "no": pass else: print("\033[1;31m请输入的指令不对!\033[0m") else: print("\033[1;31m请先登录你的账户!\033[0m") # 8.退出 def logout(): choice_exit = input("退出ATM请输入q, 返回上一级请输入b: ").strip() if choice_exit == 'q': atm_user['status'] = 'offline' print("\033[1;36m欢迎下次光临,你已经退出ATM。\033[0m") exit() elif choice_exit == 'b': pass # 9.查询个人资料 def oneself_message(): if_online = online() if not if_online == 'online': print("\033[1;31m请先登录你的账户!\033[0m") else: print("\033[1;32m-------------------------正在查询当前账户个人信息-------------------------\033[0m") sql1 = "select username,password,money,tel,create_time from atm.user where username=%s;" values = (atm_user['username'],) sql_cmd.execute(sql1, values) result = sql_cmd.fetchall() username = result[0][0] password = len(result[0][1]) * "*" money = result[0][2] tel = result[0][3] create_time = str(result[0][4]) print("账号: " + username) print("密码: " + password) print("余额: " + money + "¥") print("手机号: " + tel) print("账号注册时间: " + create_time) # atm业务菜单(字典) menu_dict = { 1: login, # 登录 2: register, # 注册 3: balance, # 余额 4: deposit, # 存款 5: outmoney, # 取款 6: change_password, # 修改密码 7: delete_user, # 注销账号 8: logout, # 退出 9: oneself_message, # 查询个人资料 } def menu(): """ 打印ATM菜单选项 """ print("""\033[1;32m \033[1;36m1 登录\033[0m \033[1;36m2 注册\033[0m \033[1;36m3 余额\033[0m \033[1;36m4 存款\033[0m \033[1;36m5 取款\033[0m \033[1;36m6 修改密码\033[0m \033[1;31m7 注销账号\033[0m \033[1;36m8 退出\033[0m \033[1;36m9 查询个人资料\033[0m """) def online(): """ 当前账号是否在线 """ if atm_user['status'] == 'online': return "online" else: return "offline" def run(): while True: menu() # online() print('当前账户: ' + "\033[1;32m" + atm_user['username'] + "\033[0m" + '\t\t状态: ' + "\033[1;32m" + atm_user['status'] + "\033[0m") num = input("请输入你要办理的业务编号: ").strip() if num.isdecimal(): num = int(num) if 0 < num <= 9: if num == 1 or num == 2: if atm_user['status'] == 'online': print("\033[1;31m当前账户正在登录,请先退出,否则不可以直接跳转到其他账户登录界面!更不能进行新账户注册业务!\033[0m") else: menu_dict[num]() else: menu_dict[num]() else: print("\033[1;31m你输入的不在办理业务的数字范围内,请重新输入!\033[0m") else: print("\033[1;31m你输入的不是业务办理的数字,请重新输入!\033[0m") # 入口函数 if __name__ == "__main__": os.system('clear') run()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!