当前位置: 首页 > article >正文

资金管理系统——python

资金管理系统——python

  • 下面是用python实现的一个资金管理系统
  • 使用PyMySql连接操作数据库,根据数据库内的信息进行登录判断。成功登录后进入系统欢迎页面,同时为成功登录的用户创建一个用户对象,根据用户做出的操作执行相应的方法,并同步到数据库中,在操作结束后将此次操作打印出来(写入本地文件),类似于下面这样:
    在这里插入图片描述
  • 本文章只是把在pyhon中写的所有代码存了一下方便以后使用,大家也可以看看,其实应该还需要先创建数据库类的东西,等我有时间了会在我人工智能专栏中进行详细讲解的,但是我写的时候时间比较长,怕大家等不及,所以就先把这个代码给大家。
import time
import sys
import pymysql


action_dict = {1: "存款", 2: "取款", 3: "转账", 4: "修改密码", 5: "退出"}
# 模拟存储用户账户余额的字典,键为用户名,值为余额,实际中可替换为数据库查询和更新操作
user_balances = {}
# 模拟存储用户密码的字典,键为用户名,值为密码,实际中可替换为数据库查询获取等操作
user_passwords = {}


# 步骤3 数据库连接
# (考虑到系统中多次连接数据库,而连接数据库的语句相似性较高,所以将其封装成为一个方法。)
# 定义连接数据库方法,sql为每次需要执行的数据库操作语句
def con_mysql(sql, params=None):
    try:
        db = pymysql.connect(
            host='localhost',
            user='root',
            password='123456',
            database='money'
        )
        cursor = db.cursor()
        if params:
            cursor.execute(sql, params)
        else:
            cursor.execute(sql)
        results = cursor.fetchone()
        db.commit()
        return results
    except pymysql.Error as e:
        if e.args[0] == 1062:  # 假设1062是重复键等相关错误码,这里只是示例,需根据实际情况调整
            print("数据库操作出现重复键等错误:", e)
        elif e.args[0] == 1406:  # 假设1406是数据太长等相关错误码
            print("数据库操作出现数据长度等错误:", e)
        else:
            print("数据库操作出现其他错误:", e)
        db.rollback()
        sys.exit()
    finally:
        db.close()


def check_password(username, password):
    """
    验证旧密码是否正确
    参数:
    username (str): 用户名
    password (str): 用户输入的旧密码
    返回:
    bool: 如果密码正确返回True,否则返回False
    """
    sql = "SELECT pwd FROM user WHERE username = %s"
    result = con_mysql(sql, (username,))
    if result:
        stored_password = result[0]
        if stored_password and stored_password == password:
            return True
    return False


def update_password(username, new_password):
    """
    更新用户密码
    参数:
    username (str): 用户名
    new_password (str): 用户输入的新密码
    """
    sql = "UPDATE user SET pwd = %s WHERE username = %s"
    con_mysql(sql, (new_password, username))
    print(f"已成功更新用户 {username} 的密码。")


def update_balance(target_username, transfer_amount):
    """
    通过数据库操作更新目标用户的账户余额
    参数:
    target_username (str): 转账目标用户的用户名
    transfer_amount (float): 转账的金额
    """
    try:
        # 连接数据库
        connection = pymysql.connect(
            host='localhost',
            user='root',
            password='123456',
            database='money'
        )
        try:
            with connection.cursor() as cursor:
                # 查询目标用户当前余额
                query = "SELECT balance FROM user WHERE username = %s"
                cursor.execute(query, (target_username,))
                result = cursor.fetchone()
                if result:
                    current_balance = result[0]
                    new_balance = current_balance + transfer_amount
                    # 更新余额,使用参数化查询方式
                    update_query = "UPDATE user SET balance = %s WHERE username = %s"
                    cursor.execute(update_query, (new_balance, target_username))
                    connection.commit()
                    return True, new_balance  # 返回转账成功标志以及更新后的余额
                else:
                    return False, None  # 如果目标用户不存在,返回转账失败标志和None表示余额
        finally:
            connection.close()
    except pymysql.Error as e:
        print(f"数据库操作出现错误: {e}")
        return False, None  # 如果出现数据库操作错误,也返回转账失败标志和None表示余额


# 步骤4 定义用户类
class Account(object):
    def __init__(self, username, money, number=0):
        # 账户金额
        self.money = money
        # 用户名
        self.username = username
        # 上次登陆时间
        self.start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        self.number = number

    # 存款功能
    def save(self):
        self.money += self.number
        print(f"已存入%.2f元,当前余额为%.2f元" % (self.number, self.money))
        return True

    # 取钱功能
    def take(self):
        if self.number > self.money:
            print("余额不足")
            return False
        else:
            self.money -= self.number
            print(f"取出%f元,当前余额为%.2f元" % (self.number, self.money))
            return True

    # 实现修改密码函数 update
    def update(self):
        old_password = input("请输入旧密码:")
        new_password = input("请输入新密码:")
        # 这里需要添加验证旧密码和更新密码的逻辑
        # 假设这里有一个验证旧密码的函数check_password和更新密码的函数update_password
        if check_password(self.username, old_password):
            update_password(self.username, new_password)
            print("密码修改成功!")
        else:
            print("旧密码错误,密码修改失败!")

    # 执行用户所选的操作
    def implement(self):
        # 先获取最新余额
        latest_balance_result = con_mysql("SELECT balance FROM user WHERE username = %s", (self.username,))
        if latest_balance_result:
            self.money = latest_balance_result[0]

        print("请选择操作:")
        for num, action in action_dict.items():
            print(f"{num}. {action}")

        while True:
            try:
                action = int(input("请输入对应操作编号(1 - 5):"))
                if action in range(1, 6):
                    break
                else:
                    print("请输入1到5之间的整数作为操作指令哦,请重新输入。")
            except ValueError:
                print("您输入的不是合法的整数,请重新输入正确的操作指令。")

        if action == 5:
            sys.exit()
        elif action == 1:
            while True:
                try:
                    self.number = float(input("请输入存入的金额:"))
                    break
                except Exception as e:
                    print("请输入正确的金额")
            if self.save():
                sql = "UPDATE user SET balance = %s WHERE username = %s"
                con_mysql(sql, (self.money, self.username))
                self.voucher(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), action)
        elif action == 2:
            while True:
                try:
                    self.number = float(input("请输入取出的金额"))
                    break
                except Exception as e:
                    print("请输入正确的金额")
            if self.take():
                sql = "UPDATE user SET balance = %s WHERE username = %s"
                con_mysql(sql, (self.money, self.username))
                self.voucher(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), action)
            else:
                print("取款操作失败,不生成凭证。")
        elif action == 3:
            transfer_username = input("请输入转账目标用户名:")
            transfer_amount = None
            while True:
                try:
                    transfer_amount = float(input("请输入转账金额:"))
                    break
                except Exception as e:
                    print("请输入正确的金额")
            if transfer_amount > self.money:
                print("余额不足,无法进行转账操作。")
                return action
            transfer_success, new_balance = update_balance(transfer_username, transfer_amount)
            if transfer_success:
                self.money -= transfer_amount
                print(f"已成功向用户 {transfer_username} 转账 {transfer_amount} 元,其当前余额为 {new_balance} 元,当前账户余额为%.2f元" % self.money)
                sql = "UPDATE user SET balance = %s WHERE username = %s"
                con_mysql(sql, (self.money, self.username))
                self.voucher(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), action, transfer_amount)
            else:
                print(f"用户 {transfer_username} 不存在,转账失败,不生成凭证。")
        elif action == 4:
            self.update()
            self.voucher(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), action)
        return action

    # 打印操作后的凭证
    def voucher(self, end_time, action, transfer_amount=None):
        if transfer_amount is None:
            transfer_amount = self.number
        str_action = """用户:%s
        操作:%s
        操作金额:%s
        登陆时间:%s
        结束时间:%s
        """ % (self.username, action_dict[action], transfer_amount, self.start_time, end_time)
        with open("%s.txt" % (self.username), 'w') as f:
            try:
                f.write(str_action)
            except Exception as e:
                print("凭证打印失败,请联系管理员")
            print("打印成功,请收好您的凭证")


# 步骤5 登录功能
def login():
    """
    用户登录检测
    :param username:用户账号
    :param pwd:用户密码
    :return:
    """
    username = input("请输入您的账号:")
    print("输入的账号是:", username)
    # 隐藏输入的密码
    pwd = input("请输入您的密码:")

    # 编写SQL语句从数据库获取账号信息,使用参数化查询方式
    sql = "SELECT username, pwd, balance FROM user WHERE username = %s"
    result = con_mysql(sql, (username,))

    if result:
        if result[1] == pwd:
            user_account = Account(result[0], result[2])
            return user_account
        else:
            print("账号或密码错误")
    else:
        print("账号不存在")


# 步骤6 欢迎页面
def welcome():
    print('*' * 30)
    print("%s%29s" % ("*", "*"))
    print("%s      欢迎进入资金管理系统 %6s" % ("*", "*"))
    print("%s%29s" % ("*", "*"))
    print('*' * 30)


# 步骤8 使用装饰器为系统添加计时功能
def consume_time(func):
    def inner(*args, **kwargs):
        start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print("本次登录时间%s" % (start_time))
        result = func(*args, **kwargs)
        end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print("登出时间%s" % (end_time))
        return result, start_time, end_time
    return inner


# 步骤7 定义系统启动函数
# 定义系统启动函数:
@consume_time
def run(user_account):
    welcome()
    action = user_account.implement()
    end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    sql = """
    UPDATE user SET balance = %s, start_time = %s, end_time = %s WHERE username = %s
    """
    con_mysql(sql, (user_account.money, user_account.start_time, end_time, user_account.username))
    return user_account


# 步骤9 启动系统
if __name__ == "__main__":
    user_account = login()
    while True:
        if isinstance(user_account, Account):
            break
    while True:
        result, start_time, end_time = run(user_account)
        if result:
            continue
        else:
            print("操作出现问题,退出系统。")
            break

http://www.kler.cn/a/468917.html

相关文章:

  • mongodb==安装prisma连接
  • JavaScript语言的字符串处理
  • 小于n的最大数 - 贪心算法 - C++
  • 如何利用人工智能算法优化知识分类和标签?
  • springboot远程链接spark
  • 小程序租赁系统开发的优势与应用前景分析
  • iOS 逆向学习 - iOS Architecture Core OS Layer
  • pytorch索引操作函数介绍
  • DOM HTML
  • 【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)
  • 银行账户类别详解
  • 【Springboot知识】Springboot监控工具SpringbootAdmin
  • 游泳溺水识别数据集,对25729张图片进行YOLO,COCO JSON, VOC XML 格式的标注,溺水平均识别率在89.9%
  • 数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
  • 鸿蒙UI开发——Toast即时提示框的使用
  • 【Qt】QLabel显示图片
  • 【STM32项目】智能物联网驱动的生物样本培育与管理辅助系统(完整工程资料源码)
  • 低空管控技术-无人机云监视技术详解
  • 功能篇:页面实现实时的时钟功能
  • 【NLP高频面题 - Transformer篇】Transformer的输入中为什么要添加位置编码?
  • java基础之代理
  • Qt 绘图
  • 9.课程分类查询
  • Linux(Centos 7.6)命令行快捷键
  • I.MX6ull-PWM
  • 封装/前线修饰符/Idea项目结构/package/impore