一、项目背景与痛点
个人、家庭、自由职业者以及小型工作室的日常收支记账是普遍需求。目前主流记账方式分为纸质手写账本、本地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. 账本权限模块
区分个人与共用场景,保障数据隐私安全:
- 独立账本:单人使用时,数据完全私密,他人无法访问;
- 家庭共享:支持添加共享成员,多人共用一套账本,权限统一管控;
- 操作权限:普通成员仅可记账、查询,管理员可维护分类与账户;
- 访问拦截:未登录用户禁止进入记账系统。
五、创新价值与亮点
- 私有化数据存储:所有收支数据留存自有服务器,不上传第三方平台,彻底解决记账隐私泄露问题;
- 多账户统一管理 整合现金、银行卡、线上支付等全类型账户,一站式查看总资产与明细;
- 双重预算预警 月度总预算+分类预算双重管控,超支实时提醒,辅助理性消费;
- 全维度可视化分析 多类型图表解析收支结构,告别人工统计分析;
- 轻量化零广告 纯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数据统计、文件处理、周期算法等知识点,也是毕业设计、求职简历中生活化场景类优质实战项目。
后续迭代规划
- 新增资产变动流水,记录账户转账、存取款等资金调拨行为;
- 新增月度理财报告,自动生成文字版收支总结并支持下载;
- 接入消息提醒,预算即将用尽、账户大额消费主动推送提示;
- 新增数据备份与恢复功能,支持一键全量备份账单数据。