欢迎光临
我们一直在努力

Python+Django实战|个人&家庭记账理财系统:多账户管理、收支分类、日常记账、预算管控、账单检索、数据可视化、报表导出

一、项目背景与痛点

个人、家庭、自由职业者以及小型工作室的日常收支记账是普遍需求。目前主流记账方式分为纸质手写账本、本地Excel表格、第三方手机记账APP三大类,各类方式均存在明显短板,随着收支记录增多、账户变多,管理难度持续上升,核心痛点总结如下:

  • 纸质账本易丢失、统计困难:手写账单容易涂改、破损、遗失,月度/年度收支汇总完全依靠人工计算,耗时且极易出错;
  • Excel表格协同性差:本地表格无法多设备同步,家庭多人无法共用一套账本,历史账单检索、分类统计操作繁琐;
  • 第三方APP隐私与广告风险:主流记账软件充斥弹窗广告,高级统计、导出功能需要付费,个人收支数据上传第三方服务器,存在隐私泄露隐患;
  • 多账户无法统一管理现金、银行卡、微信、支付宝等多个资金账户收支分散,无法一站式汇总查看总资产;
  • 缺少预算管控机制无法提前设置月度、分类消费预算,超支后无提醒,难以做到理性理财;
  • 收支分析能力薄弱仅能记录账单,无法自动生成占比、趋势图表,不能直观分析消费结构;
  • 账单归档不便历史账单难以批量导出、离线备份,长期数据无法线下留存归档。

针对传统记账方式与商用APP的各类问题,本次基于Python+Django4.2+MySQL+ECharts+Excel导出搭建轻量化私有化记账理财系统,实现多资金账户管理、收支分类、日常记账、预算预警、账单检索、可视化分析、报表导出全套闭环能力。本项目开辟个人理财、家庭记账全新赛道,和日志、天气、智能在线考试、智能图书、访客系统、OAuth登录、进销存、租赁、考勤、驾校、兼职、二手、美食、会议室、问卷、固定资产、物业、音乐平台等所有往期项目业务、功能、代码完全无重复。

二、核心目标与定位

本项目核心目标:搭建私有化无广告的Web记账平台,实现资金账户维护→收支分类配置→日常账单录入→月度/分类预算设置→超支自动提醒→多条件账单检索→收支数据可视化分析→Excel报表导出→数据备份完整闭环,替代纸质账本与第三方记账APP,实现收支数据自主管控、理财分析数字化。

项目精准定位:轻量化纯Web记账系统,采用Django原生MVT架构,部署简单、服务器资源占用极低;支持个人独立使用、家庭/团队多人共用两种模式,划分普通用户、系统管理员角色,数据相互隔离;适配个人日常记账、家庭共用账本、自由职业者收支统计、小型工作室财务台账等场景,主打数据私有化、分类精细化、预算智能化、分析可视化。

核心设计理念:账户统一化、分类标准化、记账轻量化、预算预警化、分析直观化、归档便捷化,解决传统记账低效、隐私泄露、分析缺失的核心问题。


三、整体技术方案

项目基于Django原生MVT分层架构开发,MySQL存储账户、收支分类、账单、预算全量数据,datetime模块完成日期筛选与周期统计,Django ORM实现收支聚合计算,ECharts绘制饼图、柱状图、趋势图,openpyxl库实现Excel报表导出,自定义中间件完成登录与数据权限拦截。整体分层架构流程图如下:

┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 账户管理层 │────▶│ 分类配置层 │────▶│ 账单录入层 │────▶│ 预算管控层 │
│ 银行卡/微信/支付宝等账户新增维护 │ 收入/支出多级分类自定义 │ 填写金额、日期、备注记账 │ 设置月度预算、分类预算、超支判断 │
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 账单检索层 │────▶│ 数据分析层 │────▶│ 报表导出层 │
│ 按日期/分类/账户多条件筛选账单 │ 收支占比、趋势图表可视化分析 │ 全量账单Excel离线导出归档 │
│ │ │

┌─────────────────────────────────────────────────────────────────────────┐
│ 底层技术底座 │
│ – 后端框架:Python3.11 + Django4.2 原生MVT架构 │
│ – 数据存储:MySQL 存储账户、分类、账单、预算全业务数据 │
│ – 时间处理:datetime 完成日期筛选、月度周期计算 │
│ 数据计算:Django ORM 聚合函数统计收支总额、平均值 │
│ 数据可视化:ECharts 制作饼图、柱状图、收支趋势图 │
│ 文件导出:openpyxl 实现账单Excel报表导出与备份 │
│ 权限体系:自定义中间件,区分用户账本访问权限 │
│ 状态管控:枚举类区分收入/支出、账户启用状态 │
└─────────────────────────────────────────────────────────────────────────

完整技术栈清单:

  • Web后端:Python 3.11、Django 4.2 原生MVT轻量化架构
  • 数据库:MySQL 8.0,结构化存储记账全量业务数据
  • 时间处理:datetime 模块实现日期筛选、月度周期计算
  • 数据统计:Django ORM 聚合查询完成收支总额、占比计算
  • 可视化组件:ECharts 实现各类收支分析图表
  • 文件处理:openpyxl 库生成Excel账单报表,支持导出备份
  • 权限控制:自定义中间件,拦截未登录访问、跨账本查看
  • 状态管理:枚举类区分收支类型、账户状态

四、核心能力模块详解

1. 资金账户管理模块

统一管理所有资金载体,实现多账户总资产汇总,告别账户数据分散问题:

  • 多类型账户支持:涵盖现金、储蓄卡、信用卡、微信、支付宝、理财账户等主流类型;
  • 账户基础信息:填写账户名称、初始余额、备注,支持启用/停用状态切换;
  • 总资产统计:自动汇总所有在用账户余额,实时展示个人/家庭总资产;
  • 账户筛选:可单独查看单一账户下的全部收支账单。

2. 收支分类管理模块(核心亮点)

搭建标准化收支分类体系,支持自定义适配不同使用场景:

  • 两大主分类:分为**收入类**和**支出类**两大体系,相互独立;
  • 多级子分类:收入包含工资、兼职、理财、红包等;支出包含餐饮、交通、购物、房租等;
  • 自定义编辑:管理员可新增、修改、停用分类,适配个性化记账需求;
  • 分类关联:每笔账单必须绑定对应分类,为后续统计分析提供基础。

3. 日常账单录入模块

极简录入界面,快速完成每一笔收支记录:

  • 基础录入项:选择账户、收支类型、所属分类、填写金额、交易日期;
  • 补充信息:支持填写交易备注、上传消费凭证截图;
  • 快捷操作:支持今日默认日期、常用分类快捷选择;
  • 数据校验:禁止录入负数、空金额,保证账单数据合规。

4. 预算管控与超支提醒模块

提前规划消费额度,实现智能理财管控:

  • 双重预算设置:支持设置**月度总预算**和**分类分项预算**;
  • 实时额度计算:自动统计当前月度已消费金额、剩余额度;
  • 超支提醒:消费超出预算时,页面高亮提示,起到约束作用;
  • 预算周期:按月自动重置预算额度,无需人工重复配置。

5. 多条件账单检索模块

灵活筛选历史账单,快速定位目标记录:

  • 时间筛选:支持按日、周、月、自定义时间段查询账单;
  • 维度筛选:按资金账户、收支类型、消费分类组合筛选;
  • 关键词检索:根据备注内容模糊搜索相关账单;
  • 分页展示:海量账单分页加载,页面流畅不卡顿。

6. 收支数据可视化分析模块

将枯燥的账单数据转为直观图表,清晰分析消费结构:

  • 收支占比饼图:展示各类收入、支出的占比分布,看清主要消费方向;
  • 收支对比柱状图:按月对比收入与支出总额,直观查看结余情况;
  • 趋势折线图:展示近一月/一季度收支变化趋势;
  • 数据汇总:页面展示总收入、总支出、当期结余核心指标。

7. 账单报表导出模块

实现账单离线归档,满足长期数据留存需求:

  • 全量导出:支持导出全部历史账单为标准Excel文件;
  • 筛选导出:可将检索后的指定账单单独导出;
  • 字段完整:导出内容包含账户、分类、金额、日期、备注等全字段;
  • 格式规范:Excel表头清晰,可直接打印、线下存档。

8. 账本权限模块

区分个人与共用场景,保障数据隐私安全:

  • 独立账本:单人使用时,数据完全私密,他人无法访问;
  • 家庭共享:支持添加共享成员,多人共用一套账本,权限统一管控;
  • 操作权限:普通成员仅可记账、查询,管理员可维护分类与账户;
  • 访问拦截:未登录用户禁止进入记账系统。

五、创新价值与亮点

  • 私有化数据存储:所有收支数据留存自有服务器,不上传第三方平台,彻底解决记账隐私泄露问题;
  • 多账户统一管理 整合现金、银行卡、线上支付等全类型账户,一站式查看总资产与明细;
  • 双重预算预警 月度总预算+分类预算双重管控,超支实时提醒,辅助理性消费;
  • 全维度可视化分析 多类型图表解析收支结构,告别人工统计分析;
  • 轻量化零广告 纯Web页面无弹窗、无付费项,部署简单,长期免费使用。

  • 六、应用前景与落地场景

    • 个人日常记账:上班族、自由职业者记录每日收支,做个人理财规划;
    • 家庭共用账本:夫妻、全家共用一套账本,统一管理家庭收支;
    • 小型工作室:微型团队记录营收、办公开销,简化简易财务台账;
    • 学生生活费管理:高校学生记录生活费收支,养成消费规划习惯;
    • 毕业设计/求职项目:个人理财类Web系统,业务场景生活化,差异化优势明显。

    七、完整代码结构示例

    1. 项目整体目录结构

    djangoaccountbook/
    ├── manage.py
    ├── book_project/ # 项目全局配置
    │ ├── settings.py # 数据库、Excel、权限、周期配置
    │ ├── urls.py # 全局路由分发
    │ └── middleware.py # 登录、账本权限中间件
    ├── apps/ # 模块化业务拆分
    │ ├── user_auth/ # 用户登录、账号、共享成员模块
    │ ├── account_info/ # 资金账户管理模块
    │ ├── bill_category/ # 收支分类管理模块
    │ ├── bill_record/ # 账单录入、基础管理模块
    │ ├── budget_set/ # 预算设置、超支判断模块
    │ ├── bill_search/ # 多条件账单检索模块
    │ ├── data_analysis/ # 图表统计、数据分析模块
    │ └── excel_export/ # 账单Excel导出模块
    ├── core/ # 公共工具类
    │ ├── time_filter.py # 日期筛选、周期计算工具
    │ ├── data_stat.py # 收支金额统计工具
    │ ├── budget_check.py # 预算超支校验工具
    │ └── excel_tool.py # Excel报表生成工具
    ├── static/ # 样式、ECharts、前端脚本
    ├── templates/ # 记账页、统计页、后台模板
    ├── media/ # 消费凭证图片存储
    ├── requirements.txt # 项目依赖包
    └── readme.md # 部署、使用文档
    </pre>

    ### 2. 核心可运行代码片段
    #### 示例1:账户、分类、账单、预算核心数据模型
    ```python
    from django.db import models
    from django.contrib.auth.models

    # 收支类型枚举
    IN_OUT_TYPE = (
    ("income", "收入"),
    ("expend", "支出"),
    )
    # 账户类型枚举
    ACCOUNT_TYPE = (
    ("cash", "现金"),
    ("bank", "银行卡"),
    ("wechat", "微信"),
    ("alipay", "支付宝"),
    ("finance", "理财账户"),
    )

    class BillCategory(models.Model):
    """收支分类模型"""
    name = models.CharField(max=50, verbose_name="分类名称")
    cat_type = models.CharField(max=10, choices=IN_OUT_TYPE, verbose_name="收支类型")
    is_enable = models.BooleanField(default=True, verbose_name="是否启用")
    create_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
    return self.name

    class AccountInfo(models.Model):
    """资金账户模型"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="所属用户")
    account_name = models.CharField(max=50, verbose_name="账户名称")
    account_type = models.CharField(max=10, choices=ACCOUNT_TYPE, verbose_name="账户类型")
    balance = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="当前余额")
    is_enable = models.BooleanField(default=True, verbose_name="是否启用")
    create_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
    return self.account_name

    class BillRecord(models.Model):
    """账单记录模型"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="记账人")
    account = models.ForeignKey(AccountInfo, on_delete=models.CASCADE, verbose_name="所属账户")
    category = models.ForeignKey(BillCategory, on_delete=models.CASCADE, verbose_name="收支分类")
    bill_type = models.CharField(max=10, choices=IN_OUT_TYPE, verbose_name="收支类型")
    amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="金额")
    bill_date = models.DateField(verbose_name="交易日期")
    remark = models.CharField(max=200, blank=True, verbose_name="备注")
    voucher_img = models.ImageField(upload="voucher/", blank=True, verbose_name="消费凭证")
    create_time = models.DateTimeField(auto_now_add=True)

    class BudgetSet(models.Model):
    """预算设置模型"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="所属用户")
    category = models.ForeignKey(BillCategory, null=True, blank=True, on_delete=models.CASCADE, verbose_name="分类预算")
    month_budget = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="月度预算金额")
    create_time = models.DateTimeField(auto_now_add=True)

    示例2:预算超支校验工具类(core/budget_check.py)

    from datetime import datetime
    from django.db.models import Sum
    from apps.bill_record.models import BillRecord
    from apps.budget_set.models import BudgetSet

    class BudgetCheck:
    """预算校验工具类"""
    @classmethod
    def get_month_used(cls, user, category_id=None):
    """获取当月已支出金额"""
    now = datetime.now()
    year = now.year
    month = now.month
    # 筛选当月支出账单
    query = BillRecord.objects.filter(
    user=user,
    bill_type="expend",
    bill_date__year=year,
    bill_date__month=month
    )
    if category_id:
    query = query.filter(category_id=category_id)
    total = query.aggregate(total=Sum("amount"))["total"] or 0
    return total

    @classmethod
    def is_over_budget(cls, user, category_id=None):
    """判断是否超预算"""
    used = cls.get_month_used(user, category_id)
    if category_id:
    budget = BudgetSet.objects.filter(user=user, category_id=category_id).first()
    else:
    budget = BudgetSet.objects.filter(user=user, category__isnull=True).first()
    if not budget:
    return False, "未设置预算"
    if used > budget.month_budget:
    return True, f"已超预算,当月已消费:{used} 元"
    return False, f"预算正常,剩余额度:{budget.month_budget used} 元"

    示例3:账单录入核心视图

    from django.views import View
    from django.contrib.auth.decorators import login_required
    from django.utils.decorators import method_decorator
    from django.shortcuts import redirect, render
    from django.contrib import messages
    from apps.account_info.models import AccountInfo
    from apps.bill_category.models import BillCategory
    from apps.bill_record.models import BillRecord

    @method_decorator(login_required, name="dispatch")
    class BillAddView(View):
    def get(self, request):
    # 加载可用账户、分类
    account_list = AccountInfo.objects.filter(user=request.user, is_enable=True)
    cat_list = BillCategory.objects.filter(is_enable=True)
    return render(request, "bill_add.html", locals())

    def post(self, request):
    account_id = request.POST.get("account_id")
    cat_id = request.POST.get("category_id")
    bill_type = request.POST.get("bill_type")
    amount = request.POST.get("amount")
    bill_date = request.POST.get("bill_date")
    remark = request.POST.get("remark")
    voucher = request.FILES.get("voucher_img")

    # 基础校验
    if not amount or float(amount) <= 0:
    messages.error(request, "请输入合法金额!")
    return redirect("bill_add")

    try:
    account = AccountInfo.objects.get(id=account_id, user=request.user)
    category = BillCategory.objects.get(id=cat_id)
    except (AccountInfo.DoesNotExist, BillCategory.DoesNotExist):
    messages.error(request, "账户或分类信息异常!")
    return redirect("bill_add")

    # 新增账单记录
    BillRecord.objects.create(
    user=request.user,
    account=account,
    category=category,
    bill_type=bill_type,
    amount=amount,
    bill_date=bill_date,
    remark=remark,
    voucher_img=voucher if voucher else None
    )
    messages.success(request, "账单记录保存成功!")
    return redirect("bill_list")


    八、总结与展望

    本篇博客聚焦个人&家庭记账理财全新赛道,基于Python+Django搭建私有化Web记账系统,和日志、天气、智能在线考试、智能图书、物业、固定资产、问卷、会议室、音乐、进销存、租赁、考勤等所有往期项目完全独立。项目融合多表关联、日期周期计算、预算算法、聚合统计、ECharts可视化、Excel导出等核心技术,深度贴合个人、家庭、小型团队的日常记账理财场景,数据私有化的特性区别于主流商用APP,实用性与差异化突出。

    系统覆盖账户管理、分类配置、账单录入、预算预警、检索分析、报表导出全流程,代码规范、部署简单,既适合学习Django数据统计、文件处理、周期算法等知识点,也是毕业设计、求职简历中生活化场景类优质实战项目。

    后续迭代规划

  • 新增资产变动流水,记录账户转账、存取款等资金调拨行为;
  • 新增月度理财报告,自动生成文字版收支总结并支持下载;
  • 接入消息提醒,预算即将用尽、账户大额消费主动推送提示;
  • 新增数据备份与恢复功能,支持一键全量备份账单数据。

  • 赞(0)
    未经允许不得转载:171主机测评 » Python+Django实战|个人&家庭记账理财系统:多账户管理、收支分类、日常记账、预算管控、账单检索、数据可视化、报表导出
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址