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报表导出,自定义中间件完成登录与数据权限拦截。整体分层架构流程图如下:

plain 复制代码
┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ 账户管理层  │────▶│ 分类配置层  │────▶│ 账单录入层  │────▶│ 预算管控层  │
│ 银行卡/微信/支付宝等账户新增维护 │ 收入/支出多级分类自定义 │ 填写金额、日期、备注记账 │ 设置月度预算、分类预算、超支判断 │
       │                    │                    │                    │
       ▼                    ▼                    ▼                    ▼
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ 账单检索层  │────▶│ 数据分析层  │────▶│ 报表导出层  │
│ 按日期/分类/账户多条件筛选账单 │ 收支占比、趋势图表可视化分析 │ 全量账单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. 账本权限模块

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

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

五、创新价值与亮点

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

六、应用前景与落地场景

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

七、完整代码结构示例

1. 项目整体目录结构

python 复制代码
django-account-book/
├── 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)
python 复制代码
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:账单录入核心视图
python 复制代码
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数据统计、文件处理、周期算法等知识点,也是毕业设计、求职简历中生活化场景类优质实战项目。

后续迭代规划

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

相关推荐
FirstFrost --sy1 小时前
基于高并发服务器的web小游戏测试
服务器·前端·javascript·c++·python·集成测试
abcy0712131 小时前
在Python 中使用Celery和Kafka进行消息队列的生产者和消费者实现
python·kafka
川石课堂软件测试1 小时前
UI自动化测试|下拉选择框&弹出框&滚动条操作实践
开发语言·python·jmeter·ui·docker·单元测试·harmonyos
北极星日淘1 小时前
Python爬虫断点续爬实战|基于Redis实现日淘商品增量抓取(解决重启全量重爬问题)
redis·爬虫·python
爱睡懒觉的焦糖玛奇朵1 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具Dataset Cleaner】
人工智能·python·学习·算法·yolo·音视频
E_ICEBLUE1 小时前
将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化)
python·word·excel
ZHW_AI课题组2 小时前
调用智谱AI实现特定角色扮演对话
python
nexustech2 小时前
simplejson:Python JSON 处理的备用引擎
开发语言·python·其他·json
lulu12165440782 小时前
OpenAI 如何用开源前端生态为 GPT-5.6 铺路? - 微元算力(weytoken)
java·前端·人工智能·python·gpt·开源·ai编程