独立产品从微信支付宝账单到可视化报表,我写了个财务小助手

头像
小海波
153阅读5评论

你是不是也遇到过这些烦恼?

  1. 每月想记账,但手动输入太麻烦,坚持几天就放弃了
  2. 微信、支付宝账单一堆,想分析钱花哪儿了,Excel 却看得眼花
  3. 总是超支,但不知道是哪个类别花超了

为了解决这个问题,我用 Python 写了一个个人财务自动化工具。只需要把微信/支付宝导出的账单放进去,就能自动清洗、分类、生成可视化报表,还能根据预算标出超支项。全程只需几秒钟,每月消费清清楚楚。

后来我又给它加了个网页版,支持多用户登录、在线编辑规则、交互式图表、历史报表管理……现在它已经是一个完整的全栈小项目了。数据全存在本地 MySQL 里,隐私安全有保障。


🛠️ 功能简介

多平台账单支持

  • 微信账单(Excel)自动导入清洗
  • 支付宝账单(CSV)自动导入清洗
  • 支持同时上传多个文件,自动合并去重

用户自定义分类

  • 通过 JSON 文件配置关键词,自由定义支出类别(如“居住”、“餐饮”)
  • 大小写不敏感,支持子串匹配,未匹配的自动归入“其他”
  • 支持在线编辑:网页端直接修改规则,即时生效

自动分类与统计

  • 基于规则对每笔支出打标签,输出月度汇总
  • 支持多月份数据合并分析

可视化报表

  • 生成包含明细、月度汇总、超支统计的 Excel 报表
  • 内嵌饼图(图例含金额)、月度趋势折线图、月度柱状图、超支条形图

网页端交互式图表

  • 使用 ECharts 实现可交互的饼图、趋势图、超支条形图,鼠标悬停显示详情
  • 上传后直接在网页上预览,无需下载

智能超支提醒

  • 按月度设置预算(支持默认预算),自动检查超支
  • 在 Excel 报表中标红超支单元格
  • 输出超支明细 CSV 文件

多用户与数据隔离

  • 注册/登录功能,每个用户只能查看自己的账单数据
  • 数据安全存储于 MySQL 数据库

仪表盘首页

  • 展示用户信息、总收支、交易笔数、报表数量
  • 当月支出概览与超支状态
  • 最近5笔支出记录,快速导航至各功能

报表历史管理

  • 每个用户可查看自己生成的所有报表
  • 支持下载和删除报表(物理文件+数据库记录)

在线预算编辑

  • 网页端直接修改月度预算,格式校验,未设置的月份自动使用默认预算

一键运行

  • 命令行版:python src/main.py 完成导入、分类、报表全流程
  • Web 版:python web_app/app.py 启动本地服务,浏览器访问

🧰 技术栈

  • 后端:Python 3.8+,Flask 框架
  • 数据库:MySQL 8.0,SQLAlchemy ORM(含 Flask-SQLAlchemy)
  • 数据处理:Pandas,PyArrow(Parquet 格式)
  • 可视化:ECharts(前端交互图表),Matplotlib + OpenPyXL(Excel 报表图表)
  • 前端:HTML,Jinja2 模板,Bootstrap 5,ECharts JS
  • 用户认证:Flask-Login,Flask-Bcrypt
  • 表单处理:Flask-WTF,WTForms
  • 配置文件:JSON
  • 版本控制:Git

模块化设计,代码清晰易扩展,欢迎 Fork 或 PR。


📁 项目结构

personal_finance/
├── config/                       # 配置文件
│   ├── budget.json                # 月度预算(用户可在线编辑)
│   └── category_rules.json        # 分类规则(用户可在线编辑)
├── data/
│   ├── raw/                       # 原始账单文件(用户放置)
│   └── processed/                  # 清洗后的中间数据(自动生成)
├── src/                           # 核心处理模块
│   ├── import_data.py             # 导入与清洗(微信/支付宝)
│   ├── classify.py                # 基于规则的分类
│   ├── report.py                  # 报表生成与图表绘制(Excel)
│   ├── alert.py                   # 超支检查与标记
│   └── main.py                    # 命令行一键运行入口
├── web_app/                       # Web 应用目录
│   ├── app.py                      # Flask 主程序
│   ├── templates/                   # HTML 模板
│   │   ├── base.html                # 基础模板(导航栏、闪现消息)
│   │   ├── dashboard.html           # 用户仪表盘首页
│   │   ├── index.html               # 上传页面
│   │   ├── result.html              # 结果页面(交互式图表)
│   │   ├── history.html             # 历史查询页面(含超支条形图)
│   │   ├── reports_list.html        # 我的报表列表(带删除)
│   │   ├── edit_rules.html          # 编辑分类规则
│   │   ├── edit_budget.html         # 编辑预算
│   │   ├── login.html               # 登录页面
│   │   └── register.html            # 注册页面
│   └── static/                      # (可选)CSS/JS 文件
├── output/                         # 生成的报表、超支记录
├── .gitignore                      # 忽略临时文件
├── requirements.txt                # 依赖包
└── README.md                       # 本文件

📸 效果展示

网页端页面(Bootstrap 美化)

从微信支付宝账单到可视化报表,我写了个财务小助手
从微信支付宝账单到可视化报表,我写了个财务小助手
从微信支付宝账单到可视化报表,我写了个财务小助手
从微信支付宝账单到可视化报表,我写了个财务小助手
从微信支付宝账单到可视化报表,我写了个财务小助手

分析结果页(交互式图表预览)

从微信支付宝账单到可视化报表,我写了个财务小助手

历史查询页面(带超支条形图)

从微信支付宝账单到可视化报表,我写了个财务小助手

从微信支付宝账单到可视化报表,我写了个财务小助手

Excel 报表示例

从微信支付宝账单到可视化报表,我写了个财务小助手
从微信支付宝账单到可视化报表,我写了个财务小助手
从微信支付宝账单到可视化报表,我写了个财务小助手


🚀 快速上手

1. 克隆项目

git clone https://github.com/liguojing112/personal-finance-assistant.git
cd personal-finance-assistant

2. 安装依赖

pip install -r requirements.txt
pip install flask-login flask-bcrypt flask-wtf email-validator  # Web 版额外依赖

3. 配置 MySQL

  • 安装 MySQL 8.0,启动服务。
  • 创建数据库:
    CREATE DATABASE finance_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 修改 web_app/app.py 中的数据库密码(第 20 行左右)。
  • 创建数据表:
    from app import app, db
    with app.app_context():
        db.create_all()
    

4. 自定义分类规则

编辑 config/category_rules.json,或登录 Web 后在“分类规则”页面在线编辑。示例:

{
    "居住": ["水电费", "恒星邦办", "康佳滚筒"],
    "餐饮": ["便利店", "农夫山泉", "肉夹馍", "水果"],
    "购物": ["抖音电商", "拼多多"],
    "社交": ["转账", "红包"],
    "学习": ["打印", "复印"],
    "其他": []
}

5. 配置预算(可选)

编辑 config/budget.json,或登录 Web 后在“编辑预算”页面在线编辑。未设置的月份自动使用默认预算。

{
    "2026-01": {
        "总预算": 800,
        "居住": 200,
        "餐饮": 300,
        "购物": 150,
        "社交": 100,
        "学习": 30,
        "其他": 50
    }
}

6. 运行 Web 应用

cd web_app
python app.py

浏览器访问 http://127.0.0.1:5000,注册账号并登录。

7. 上传账单

从微信/支付宝导出账单,一次性选择多个文件(支持 .xlsx.csv),点击上传。

8. 查看结果

  • 网页上立即显示交互式饼图(图例含金额)和月度趋势图(可悬停)。
  • 下载 Excel 报表,查看详细汇总和超支标记。
  • 在“历史查询”页面按日期筛选,查看各类别累计超支条形图。
  • 在“我的报表”页面可下载或删除历史生成的报表。
  • 在“分类规则”和“编辑预算”页面随时调整配置。

⚙️ 自定义预算

编辑 config/budget.json,按月份设置预算。未设置的月份会自动使用内置默认预算。

{
    "2026-01": {
        "总预算": 800,
        "居住": 200,
        "餐饮": 300,
        "购物": 150,
        "社交": 100,
        "学习": 30,
        "其他": 50
    }
}

💡 开发经验与心得

写这个项目的过程,就像组装一套乐高,从零开始一块块搭建,中间踩了不少坑,也学到了很多东西。分享几点我觉得对新手有帮助的经验:

1️⃣ 数据处理:永远有你想不到的脏数据

微信和支付宝导出的账单格式不完全一样,甚至同一平台不同时间导出也可能有小差异。一开始我以为用 Pandas 读进来就完事了,结果遇到:

  • 支付宝 CSV 编码是 GBK 不是 UTF-8,导致读取报错;
  • 备注字段里居然有 NaN,插入 MySQL 时直接崩溃;
  • 交易单号末尾带着制表符 \t,去重失败。

解决方案:对每个字段做清洗、类型转换、空值处理,最后统一用 Parquet 格式存储中间数据,既快又稳定。所以永远不要相信原始数据,清洗这一步必须做扎实。

2️⃣ 分类规则:从硬编码到用户自定义

一开始我把分类逻辑写在代码里,每次改规则都要改代码、重启服务,太不优雅了。后来改为 JSON 配置文件,用户可自行修改。再后来,干脆做了个在线编辑页面,直接在网页上改 JSON,实时生效。
感悟:把可变的部分配置化,是程序可维护性的第一步。能做成在线配置的,就别让用户改文件。

3️⃣ 图表可视化:静态图片 vs 交互图表

最开始用 Matplotlib 生成静态图片插入 Excel 和网页,虽然能用,但体验一般,鼠标悬停看不了详情,也不够酷。后来换成 ECharts,数据以 JSON 形式传给前端,图表瞬间变得生动,还能缩放、悬停、导出数据。
教训:在数据量不大的个人项目中,前端交互图表带来的体验提升远大于后端生成图片的简单性。现代 Web 开发,选对可视化库能让用户觉得“这很专业”。

4️⃣ 数据库与多用户:设计要提前想

一开始没考虑多用户,所有数据混在一起。后来加用户系统时,才发现要改模型、加外键、迁移数据,折腾了半天。
建议:如果项目将来可能有多用户需求,哪怕现在只有你自己用,也先把 user_id 字段留好,用默认值占位。这样后面扩展时轻松很多。

5️⃣ 关于 Flask 和全栈开发

这是我第一次完整用 Flask 写一个带数据库、用户认证、在线编辑的应用。最大的收获是理解了MVC 模式在实际项目中的样子:模型(Model)放数据,视图(View)用模板渲染,控制器(Controller)写业务逻辑。配合 SQLAlchemy ORM,操作数据库非常优雅。
给新手的建议:不要怕犯错,报错是最好的学习材料。从 ImportErrorKeyError,再到 MySQL connection failed,每解决一个坑,你对整个系统的理解就深一层。

6️⃣ 一些小坑的快速解决法

  • 路径问题:永远用 os.path.abspath(__file__) 获取当前文件路径,再往上找根目录,避免在命令行不同目录运行时报错。
  • 编码问题:支付宝 CSV 是 GBK,微信 Excel 是 UTF-8,统一用 encoding='utf-8-sig' 输出,至少保证 Excel 打开不乱码。
  • 调试技巧:遇到 Flask 报错不要慌,看终端里的完整 traceback,一般都能找到是哪行代码出问题。实在不行,加 print() 大法,虽然原始,但有效。

总的来说,这个小项目让我把 Python 后端、数据库、前端、数据分析都串了一遍,收获巨大。如果你也想做一个类似的工具,建议从最简单的版本开始,一点点加功能,每次只解决一个问题。过程中你会发现,原来自己也可以做出一个“能用”且“好看”的东西。

📌 项目地址

GitHub: https://github.com/liguojing112/personal-finance-assistant

欢迎 Star、Fork、提 Issue 或 PR!


💡 后续计划

  • [ ] 增加机器学习辅助分类(当规则未覆盖时)
  • [ ] 支持多账单合并(如多个微信账号)
  • [ ] 增加年报表与同比分析
  • [ ] 部署到云服务器,支持在线使用
  • [ ] 添加数据导出功能(CSV/PDF)

🤝 欢迎交流

如果你也有类似的需求或想法,欢迎在评论区留言,或到 GitHub 上找我。我们一起让生活更美好~


Happy budgeting! 🧾

最后修改于

收藏
举报
精选评论

由于每个人的消费情况不同且复杂,我打算将分类规则外置为配置文件,优化完就可以用了。

版块详情

独立产品

1k 帖子
3k 评论
616 关注
请真诚分享你的个人作品的创作灵感、开发经验、运营过程等;不得只罗列产品功能来借机营销
版主
远程老司机/游牧旅居中/电鸭社区站长
远程全职推荐

扫码下载应用

下载APP以便及时收到回复或进展