Code Nova—beta冲刺
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering24/homework/15658 |
|---|---|
| 团队名称 | Code Nova |
| 团队成员学号-姓名 | 3224004495-程天润 3224004457-李佳琪 3124004436-莫仕明 |
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering24/?page=2 |
| 这个作业的目标 | 继续完善项目,介绍项目的特色功能 |
一.功能改造总结
本次主要新增了两个功能:
- 收入 / 支出识别与统计
- 按月统计筛选
1、原来存在的问题
(1) 账单只能按支出处理
原来的 /parse_bill 后端解析逻辑里,账单类型是固定的:
"type": "支出"
所以无论用户输入:
午饭花了25
工资到账5000
收到兼职收入300
最终都会被当成支出。
影响是:
- 收入无法被识别
- 账单列表只有支出概念
- 编辑页不能修改收入/支出类型
- 统计页只会计算总支出
- AI 分析也无法区分收入和支出
(2) 统计只能看全部账单
原来的统计页会直接读取全部本地账单:
wx.getStorageSync('bills')
然后统计所有账单。
问题是:
- 不能看某个月的收入
- 不能看某个月的支出
- 不能按月对比
- 时间越久,统计结果越不清晰
(3) 账单时间字段不稳定
原来保存账单时只有:
createdAt: new Date().toLocaleString()
这个字段适合展示,但不适合做稳定的月份筛选。
不同系统、语言环境下格式可能不同,后续解析月份不够可靠。
2.功能一:收入 / 支出识别
先沿着账单数据流分析:
输入一句话
→ 请求 /parse_bill
→ 返回 parsed
→ 首页保存到 bills
→ 列表展示
→ 编辑页修改
→ 统计页统计
发现关键点在后端:
parse_text_to_bill()
只要这里返回正确的 type,前端保存时因为使用了:
...parsed
理论上可以自动保存收入/支出类型。
但仅改后端不够,因为:
- 编辑页没有 type
- 列表跳转编辑页没有传 type
- 统计页没有按 type 分开计算
解决过程
(1)后端新增收入/支出识别
新增关键词规则:
- 工资、奖金、兼职、报销、到账、收到 → 收入
- 花了、买、支付、消费、吃饭 → 支出
(2) 后端新增收入分类
收入分类包括:
- 工资
- 奖金
- 兼职
- 报销
- 理财
- 其他收入
(3) 首页保存兼容旧数据
如果旧账单没有 type,默认补成支出。
(4) 列表页支持收入/支出展示
收入显示为:
+¥金额
支出显示为:
-¥金额
(5) 编辑页新增类型切换
增加“收入 / 支出”切换按钮,保存时把 type 写回账单。
(6) 统计页拆分统计逻辑
从原来的单一总额,变成:
- 总收入
- 总支出
- 结余
- 收入分类统计
- 支出分类统计
3.功能二:按月统计筛选
探索思路
先看统计页原逻辑:
读取全部 bills
→ 统计全部账单
要按月筛选,需要先解决两个问题:
- 每笔账单属于哪个月份?
- 统计页如何切换月份?
所以设计了新的账单字段:
date: '2026-06-05'
month: '2026-06'
其中 month 专门用于按月统计。
** 解决过程**
(1) 首页保存账单时增加稳定日期字段
新账单保存时增加:
date
month
这样后续统计页不用依赖 createdAt。
(2)兼容旧账单
旧账单没有 month,所以统计页按顺序尝试推断:
month 字段
date 字段
createdAt 字段
id 时间戳
当前月份
这样不会丢失旧账单。
(3) 统计页生成月份列表
从账单里提取所有月份:
monthOptions
并默认选中当前月份或最近有账单的月份。
(4) 修复月份选择器为空的问题
后来发现如果没有历史月份,picker 可能为空。
于是把当前月份强制加入:
[
currentMonth,
...账单月份
]
这样月份选择器至少会显示当前月份。
(5) 统计只计算当前月份账单
切换月份后:
全部账单
→ 筛选 selectedMonth
→ 计算收入/支出/结余/分类
(6) AI 分析只分析当前月份
原来 AI 分析提交全部账单,现在提交:
currentBills
也就是当前选中月份的账单。
4.最终效果
现在小程序已经支持:
- 一句话识别收入
- 一句话识别支出
- 收入/支出分别展示
- 编辑账单时修改类型
- 总收入统计
- 总支出统计
- 结余统计
- 收入分类统计
- 支出分类统计
- 按月份筛选统计
- 当前月份兜底显示
- AI 分析当前月份账单
5.后续补充
为了避免后续功能改坏核心逻辑,还添加了轻量单元测试:
- 后端解析测试
- 统计逻辑测试
- 账单保存逻辑测试
这些测试主要保护:
- 收入/支出判断
- 金额解析
- 月份筛选
- 结余计算
- 新账单字段生成
二.项目特色功能介绍
1. 首页模块
(1) 文字记账
功能描述
用户在首页输入一句自然语言收入或消费描述,系统将其发送到后端进行解析,返回金额、类别和备注,并允许用户保存为账单。
输入示例

*工资到账5000元
- 今天中午吃饭花了25元
- 买了一杯奶茶18元
- 打车花了12元
输出结果

- 类型:支出/收入
- 金额:数值
- 分类:餐饮 / 交通 / 购物等
- 备注:提炼后的消费说明
前端要求
- 提供输入框
- 提供“解析这句话”按钮
- 显示解析结果
- 提供“保存账单”按钮
后端要求
- 接收文本内容
- 提取金额
- 调用分类逻辑
- 返回结构化 JSON
(2) 语音记账
功能描述
用户在首页录音,说出消费/收入内容,系统上传音频到后端,由百度语音识别转为文字,再进入解析流程。
前端要求
- 提供“开始录音”“结束录音”“识别录音”按钮
- 请求录音权限
- 上传录音文件
- 接收识别文字并自动进入解析流程
后端要求
- 接收音频文件
- 进行格式处理
- 调用百度语音识别接口
- 返回识别文字
关键流程
录音 → 上传 → 语音识别 → 返回文字 → 自动解析 → 显示解析结果
(3)最近账单预览

功能描述
首页显示最近 3 条账单,便于用户快速查看最新记录。
前端要求
- 从本地存储读取账单
- 显示最近 3 条数据
- 显示分类、金额、备注和时间
后端要求
- 无强依赖,由前端本地数据完成
2.账单列表模块
(1)查看账单列表
功能描述
展示用户已保存的所有账单。
前端要求
- 列表卡片化展示
- 显示分类、金额、备注、时间
- 风格与首页统一
后端要求
- 当前版本可由前端本地存储读取
- 后续可扩展为数据库读取
(2) 删除账单
功能描述
用户点击删除按钮后,可删除某条账单。
前端要求
- 提供删除按钮
- 删除前弹出确认框
- 删除后立即刷新列表
后端要求
- 当前版本由前端本地更新
- 后续可扩展为删除接口
(3) 编辑账单
功能描述
用户可修改账单的金额、分类和备注。
前端要求
- 从账单列表跳转到编辑页
- 自动带入原有账单数据
- 保存后返回列表页并更新显示
后端要求
- 当前版本由前端本地更新
- 后续可扩展为修改接口
3 统计模块
(1) 总支出/收入与账单数量
功能描述
统计全部账单的金额总和与账单数量。
前端要求
- 在统计页显示总支出与账单数量
- 使用卡片样式展示
后端要求
- 当前版本可由前端基于本地数据计算
- 后续可扩展为后端汇总
(2) 按分类汇总
功能描述
统计各消费分类的金额及占比。
前端要求
- 显示分类名称
- 显示分类金额
- 显示百分比
- 显示横向占比条
后端要求
- 当前版本由前端按账单数据汇总
- 支持金额降序排序
4 AI 智能分类模块
(1) AI 分类
功能描述
当用户输入一句消费描述时,后端调用百炼大模型进行语义分类,解决规则分类在边界场景下的误判问题。
典型场景
- 雪糕3元:餐饮或购物的歧义判断
- 茶瀑布18元:品牌语义理解
- 酸菜鱼30元:餐饮类自动识别
前端要求
- 无额外交互
- 解析成功后直接显示 AI 分类结果
后端要求
- 将文本传给大模型
- 要求模型输出 JSON
- 若 AI 调用失败则自动回退到规则分类
5 AI 消费分析模块
(1) 生成消费分析
功能描述
用户在统计页点击按钮后,系统基于账单统计结果调用 AI,生成消费分析与建议。
输出内容
- 消费分析
- 消费建议
前端要求
-
提供“生成 AI 消费分析”按钮
-
支持按钮状态切换:
- 生成 AI 消费分析
- 分析生成中...
- 重新生成 AI 分析
-
结果显示为页面卡片而非弹窗
后端要求
- 接收账单列表
- 先由程序做统计
- 再调用 AI 生成分析文本
- 返回结构化 JSON
三.自动化单元测试
1.单元测试视频
2.单元测试报告
当前项目一共有 3 个测试文件。
(1) server/test_app_logic.py
测试后端账单解析逻辑。
主要测试内容:
- 金额提取是否正确:
- 午饭花了25
- 工资到账5000
- 报销120.5元
- 收入/支出类型识别是否正确:
- 工资、兼职收入识别为收入
- 午饭、购物识别为支出
- 收入分类是否正确:
- 工资
- 奖金
- 兼职
- 报销
- 理财
- 其他收入
- 完整账单解析结果是否包含:
- type
- amount
- category
- remark
- 支出解析时使用 mock,避免真实调用 AI 接口。
(2) tests/stats.test.js
测试小程序统计逻辑。
主要测试内容:
- 没有账单时,月份选择器仍然包含当前月份。
- 账单月份推断是否正确:
- 从 month 字段读取
- 从 date 字段读取
- 从 createdAt 字段推断
- 从 id 时间戳推断
- 无时间信息时默认当前月份
- 按月统计是否正确:
- 总收入
- 总支出
- 结余
- 当前月份账单数量
- 收入分类统计
- 支出分类统计
- 旧账单没有 type 时,默认按支出处理。
(3)tests/bill.test.js
测试小程序账单保存前的数据组装逻辑。
主要测试内容:
- 日期格式是否正确:
- YYYY-MM-DD
- YYYY-MM
- 新账单没有 type 时,是否默认是支出。
- 新账单已有 type: 收入 时,是否保留收入类型。
- 创建账单时是否自动生成:
- id
- createdAt
- date
- month
- 创建账单时是否保留原始字段:
- amount
- category
- remark
- type
运行方式
前端逻辑测试:
node tests\bill.test.js
node tests\stats.test.js
后端逻辑测试:
cd server
python -m unittest test_app_logic.py
四.团队协作记录
| 成员 | 主要负责内容 | 实际承担工作 | 工作量占比 |
|---|---|---|---|
| 李佳琪 | 核心开发与系统联调 | 负责微信小程序前端开发、Flask 后端开发、基础语音识别接入、核心业务逻辑实现、前后端联调与整体系统集成 | 40% |
| 程天润 | 页面设计与功能测试 | 协助页面 UI 设计、协助小程序前端开发、基础语音接入、页面布局调整、功能测试与问题反馈 | 35% |
| 莫仕明 | 需求分析与项目展示 | 负责需求文档、系统设计文档、项目资料整理与部分流程图绘制、协助功能测试与问题反馈、负责 PPT 制作、项目展示材料整理、技术资料查阅与演示协助 | 25% |
五.体会和收获
李佳琪:
通过这次“喵喵记账”小程序的开发,我第一次较完整地体验了一个软件项目从需求分析、系统设计到前后端开发与测试联调的全过程,也让我对软件工程有了更加真实的认识。
在开发过程中,我发现真正困难的不只是写代码,而是如何将不同模块连接起来。例如语音记账不仅涉及录音,还需要处理音频上传、接口调用以及真机调试等问题。
此外,我也第一次接触了生成式 AI 在实际项目中的应用,学习了大模型 API 接入与提示词设计。总体来说,这次开发提升了我的前后端联调能力,也让我对 AI 应用开发与团队协作有了更深入的理解。
程天润:
在本次记账小程序的开发中,我主要承担了前端界面设计、布局调整以及基础语音功能的接入工作。从最初的UI构思到最终在手机上呈现出流畅的页面,我深刻体会到了将设计稿转化为实际代码的成就感。特别是在调试语音接入和反复进行功能测试的过程中,我学会了如何从用户的角度去发现并反馈问题,不断优化交互细节。这次实践不仅锻炼了我的前端编码能力,更让我明白了优秀的软件离不开对每一个像素和每一次交互的精细打磨,团队协作让复杂的开发过程变得高效且充满乐趣。
莫仕明:
作为团队中负责文档与展示的成员,我主要完成了需求与系统设计文档的撰写、流程图绘制以及最终的项目展示材料整理。虽然不直接编写核心业务代码,但通过查阅技术资料和梳理项目脉络,我深刻理解了“文档先行”在软件工程中的重要性。在协助功能测试和制作答辩PPT的过程中,我学会了如何将复杂的技术逻辑转化为清晰的表达,确保团队的努力能被完美呈现。这次经历极大地提升了我的逻辑思维与统筹能力,让我明白一个成功的项目不仅需要过硬的技术,更需要清晰的规划与出色的表达。

浙公网安备 33010602011771号