平平爱恰糖糖
平平爱恰糖糖
发布于 2025-07-07 / 24 阅读
0
0

个人记账系统:从代码到实践的财务管家

在数字化时代,个人财务管理越来越受到重视。一个简单易用的记账系统不仅能帮助我们理清收支状况,还能为理财决策提供数据支持。

系统概述与功能亮点

平平科技工作室开发的这款个人记账系统(版本号 1.0.0)旨在为用户提供一个便捷、全面的财务记录与分析平台。系统采用 Python 语言开发,结合 SQLite 数据库,实现了从收支记录到数据分析的全流程功能。

核心功能列表

  • 记录管理:支持收入/支出记录的添加、修改和删除

  • 分类管理:预设常用收支分类,支持自定义分类创建

  • 数据查询:多条件筛选查看收支记录

  • 数据分析:

    • 支出分析(按分类统计与占比计算)

    • 收入分析(按分类统计与占比计算)

    • 财务概览(收支结余计算)

  • 日志系统:记录所有数据操作历史

  • 时间维度分析:支持按时间段筛选和分析

系统架构与技术实现

整体架构设计

该记账系统采用了面向对象的设计思想,核心类 AccountingSystem 封装了所有数据库操作和业务逻辑,提供了清晰的接口供交互使用。系统架构分为三层:

  1. 数据层:SQLite 数据库存储收支记录、分类信息和操作日志

  2. 业务逻辑层:AccountingSystem 类实现核心业务逻辑

  3. 交互层:命令行界面提供用户交互功能

数据库设计

系统使用 SQLite 数据库,包含三张主要表:

表名

字段

说明

records 表

  • id: 记录 ID(主键)

  • date: 记录日期

  • description: 记录描述

  • category: 分类

  • amount: 金额

  • is_income: 标识收入(1)或支出(0)

存储收支记录

categories 表

  • name: 分类名称(主键)

  • is_income_category: 标识收入分类(1)或支出分类(0)

存储收支分类

change_logs 表

  • id: 日志 ID(主键)

  • timestamp: 操作时间

  • action_type: 操作类型

  • record_id: 关联记录 ID

  • description: 操作描述

存储操作日志

核心代码解析

初始化与数据库操作

系统启动时会自动初始化数据库并创建必要的表结构,如果是新数据库,还会添加预设的收支分类:

def _initialize_database(self):
    """初始化数据库和表结构"""
    db_exists = os.path.exists(self.db_file)
    self.conn = sqlite3.connect(self.db_file)
    cursor = self.conn.cursor()
    
    # 创建操作日志表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS change_logs (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        timestamp TEXT NOT NULL,
        action_type TEXT NOT NULL,
        record_id INTEGER,
        description TEXT
    )
    ''')
    
    # 创建记录表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS records (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        date TEXT NOT NULL,
        description TEXT NOT NULL,
        category TEXT NOT NULL,
        amount REAL NOT NULL,
        is_income INTEGER NOT NULL CHECK (is_income IN (0, 1))
    )
    ''')
    
    # 创建分类表
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS categories (
        name TEXT PRIMARY KEY,
        is_income_category INTEGER NOT NULL CHECK (is_income_category IN (0, 1))
    )
    ''')
    
    # 添加默认分类
    if not db_exists:
        default_expense_categories = ["餐饮", "交通", "购物", "娱乐", "医疗", "住房", "其他支出"]
        default_income_categories = ["工资", "奖金", "投资收益", "其他收入"]
        
        for cat in default_expense_categories:
            cursor.execute("INSERT INTO categories VALUES (?, 0)", (cat,))
            
        for cat in default_income_categories:
            cursor.execute("INSERT INTO categories VALUES (?, 1)", (cat,))
            
        self.conn.commit()

记录管理功能

系统提供了完整的记录管理功能,包括添加、查询、修改和删除记录。添加记录时会进行分类验证和日期格式检查:

def add_record(self, date_str, description, category, amount, is_income):
    """添加新的收支记录"""
    try:
        # 验证日期格式
        datetime.strptime(date_str, "%Y-%m-%d")
        
        # 验证分类是否存在
        cursor = self.conn.cursor()
        cursor.execute("SELECT * FROM categories WHERE name = ?", (category,))
        cat_data = cursor.fetchone()
        
        if not cat_data:
            # 分类不存在,询问用户是否创建新分类
            print(f"分类 '{category}' 不存在。")
            create_new = input("是否创建新分类?(y/n): ").strip().lower()
            if create_new == 'y':
                is_income_cat = 1 if is_income else 0
                cursor.execute("INSERT INTO categories VALUES (?, ?)", (category, is_income_cat))
                self.conn.commit()
            else:
                print("操作取消。")
                return False
        
        # 插入新记录
        cursor.execute(
            "INSERT INTO records (date, description, category, amount, is_income) VALUES (?, ?, ?, ?, ?)",
            (date_str, description, category, amount, 1 if is_income else 0)
        )
        record_id = cursor.lastrowid
        
        # 添加操作日志
        cursor.execute(
            "INSERT INTO change_logs (timestamp, action_type, record_id, description) VALUES (datetime('now'), ?, ?, ?)",
            ('CREATE', record_id, f"新增{'收入' if is_income else '支出'}记录")
        )
        self.conn.commit()
        print("记录添加成功!")
        return True
    except ValueError:
        print("日期格式不正确,请使用 YYYY-MM-DD 格式。")
        return False
    except Exception as e:
        print(f"添加记录失败: {e}")
        return False

数据分析功能

系统提供了强大的数据分析功能,包括支出分析、收入分析和财务概览。分析结果不仅显示具体金额,还计算各类别的占比:

def analyze_expenses(self, start_date=None, end_date=None, return_data=False):
    """支出分析功能,支持按时间段筛选"""
    cursor = self.conn.cursor()
    query = """
    SELECT category, SUM(amount) as total
    FROM records
    WHERE is_income = 0
    """
    
    params = []
    if start_date:
        query += " AND date >= ?"
        params.append(start_date)
        
    if end_date:
        query += " AND date <= ?"
        params.append(end_date)
        
    query += " GROUP BY category ORDER BY total DESC"
    cursor.execute(query, params)
    results = cursor.fetchall()
    
    if return_data:  # 添加返回数据功能
        return [(row[0], row[1]) for row in results]
        
    if not results:
        print("没有找到支出记录。")
        return
        
    total_expenses = sum(row[1] for row in results)
    
    print("\n支出分析:")
    print("{:<15} {:<10} {:<8}".format("分类", "金额", "占比"))
    print("-" * 35)
    
    for category, amount in results:
        percentage = (amount / total_expenses) * 100
        print(f"{category:<15} {amount:<10.2f} {percentage:>6.2f}%")
        
    print("-" * 35)
    print(f"总支出: {total_expenses:.2f}")

系统使用指南

命令行交互界面

系统提供了简洁明了的命令行交互界面,用户可以通过输入数字选择不同的功能:

欢迎使用个人记账系统!

========================================
请选择操作:
1. 添加收入记录
2. 添加支出记录
3. 查看所有记录
4. 查看收入记录
5. 查看支出记录
6. 删除记录
7. 支出分析
8. 收入分析
9. 财务概览
0. 退出系统
========================================
请输入选项 (0-9):

使用示例:添加收入记录

  1. 选择选项"1"进入添加收入记录界面

  2. 输入日期(格式:YYYY-MM-DD)

  3. 输入记录描述(如"5月工资")

  4. 输入分类(如"工资",若分类不存在系统会提示创建)

  5. 输入金额

  6. 系统确认添加并记录操作日志

使用示例:支出分析

  1. 选择选项"7"进入支出分析界面

  2. 可选择输入开始日期和结束日期(或直接回车跳过)

  3. 系统显示各支出分类的金额和占比

  4. 显示总支出金额

扩展与优化方向

功能扩展建议

  • 图形用户界面:将命令行界面升级为 GUI 界面,提升用户体验

  • 数据可视化:增强图表展示功能,使用 matplotlib 或 plotly 生成更丰富的统计图表

  • 数据导入导出:支持 Excel、CSV 等格式的账单导入导出

  • 预算管理:添加预算设置与预警功能

  • 多账户管理:支持银行卡、支付宝、微信等多账户管理

技术优化方向

  • 数据库优化:针对大量数据场景进行查询优化

  • 代码结构优化:分离业务逻辑与数据访问,引入 MVC 架构

  • 异常处理增强:完善各功能模块的异常处理机制

  • 安全性增强:添加数据加密和用户认证功能

总结

这款个人记账系统通过简洁的设计和完善的功能,为用户提供了一个实用的财务管理工具。系统采用 Python 和 SQLite 实现,具有轻量级、易部署的特点,同时提供了从记录到分析的完整功能链。

无论是个人日常记账还是家庭财务管理,该系统都能满足基本需求。对于开发者而言,这也是一个很好的面向对象编程和数据库应用的实践案例,展示了如何将业务需求转化为具体的代码实现。

通过进一步的功能扩展和优化,这款记账系统可以成为更加专业和强大的财务管理平台,帮助用户更好地理解和管理自己的财务状况。


评论