2024秋软件工程现场编程作业
作业所属课程 | 班级链接 |
---|---|
作业要求 | 作业要求链接 |
作业的目标 | 开发一个个人记账本应用 |
团队名称 | 爱码单车队 |
成员1 | 102201542--曾庆徽 |
成员2 | 102201211--池家益 |
成员3 | 102201302--毛震 |
成员4 | 102201420--林传昊 |
成员5 | 102201425--郑礼鑫 |
成员6 | 102201538--黄志梁 |
成员7 | 102201630--岳俊杰 |
成员8 | 102201227--陈铭扬 |
成员9 | 102201239--翁林靖 |
成员10 | 102201257--王党兵 |
一.组员分工
成员 | 学号 | 分工职责 |
---|---|---|
成员1 | 曾庆徽 | 组织与演示 |
成员2 | 池家益 | 编写app.py |
成员3 | 毛震 | 测试与反馈 |
成员4 | 林传昊 | 编写index.html以及index.css |
成员5 | 郑礼鑫 | 编写records.html以及style.css |
成员6 | 黄志梁 | 整理代码目录以及调试app.py |
成员7 | 岳俊杰 | 设计功能 |
成员8 | 陈铭扬 | 编写monthly_statistics.html |
成员9 | 翁林靖 | 代码审查 |
成员10 | 王党兵 | 编写linechart.html以及linechart.css |
二.程序运行环境
1. 安装 Python
确保你已经在系统上安装了 Python 3.x。可以在 Python 官方网站 下载适合你操作系统的安装包。
检查 Python 安装
在终端或命令提示符中输入以下命令,检查 Python 是否已安装:
python --version
或
python3 --version
如果没有安装,你可以按照说明进行安装。
2. 安装 pip
pip 是 Python 的包管理工具,通常在安装 Python 时会自动安装。你可以通过以下命令检查 pip 是否已安装:
pip --version
如果未安装,可以通过以下方式安装:
python -m ensurepip --upgrade
4. 安装项目
克隆github项目https://github.com/zqh666nb/Personal-Editor
5. 运行 Flask 应用
在编译器(推荐vscode)中打开该项目文件,根据requirements.txt中的要求安装(配置)好相应的库,然后可以在终端中打开文件运行app.py。
6. 访问应用
打开浏览器,访问 http://localhost:5000
查看应用。
三.程序运行截图和视频:
截图:
视频:
四.关键代码:
关键部分其实就是添加记录,查询记录,绘制简单表格等功能的实现:
# 定义路由,当以 POST 方式访问 /add_record 路径时执行 add_record 函数
@app.route('/add_record', methods=['POST'])
def add_record():
# 从表单获取日期、金额、类型、类别和备注信息
date = request.form['date']
amount = float(request.form['amount'])
record_type = request.form['type'] # 获取用户选择的类型
# 根据类型调整金额的正负,如果是支出类型,将金额设置为负值
if record_type == 'expense':
amount = -abs(amount) # 将支出金额设置为负值
category = request.form['category']
note = request.form['note']
# 加载现有数据
data = load_data()
# 创建新的记录字典
record = {
'date': date,
'amount': amount,
'category': category,
'note': note
}
# 将新记录添加到数据列表中
data.append(record)
# 保存数据
save_data(data)
# 重定向到查看记录的页面
return redirect(url_for('view_records'))
# 定义路由,当访问 /view_records 路径时执行 view_records 函数
@app.route('/view_records')
def view_records():
# 加载数据
data = load_data()
# 根据日期对数据进行排序
sorted_data = sorted(data, key=lambda x: datetime.strptime(x['date'], '%Y-%m-%d'))
# 返回 records.html 模板,并传递排序后的数据
return render_template('records.html', records=sorted_data)
# 定义路由,当访问 /monthly_statistics 路径时执行 monthly_statistics 函数
@app.route('/monthly_statistics')
def monthly_statistics():
# 加载数据
data = load_data()
# 使用 defaultdict 创建一个字典,默认值是一个包含 'income' 和 'expenses' 键的字典,初始值都为 0
monthly_stats = defaultdict(lambda: {'income': 0, 'expenses': 0})
for record in data:
# 从记录中获取日期、金额
date = record['date']
amount = record['amount']
# 将日期转换为月份字符串
month = datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m') # 获取月份字符串
# 如果金额大于 0,将其累加到当月的收入中
if amount > 0:
monthly_stats[month]['income'] += amount
else:
# 如果金额小于 0,将其绝对值累加到当月的支出中
monthly_stats[month]['expenses'] += abs(amount) # 记录为正值
# 对 monthly_stats 进行排序,确保按月份顺序显示
sorted_monthly_stats = dict(sorted(monthly_stats.items(), key=lambda item: datetime.strptime(item[0], '%Y-%m')))
# 将排序后的结果传递给模板
return render_template('monthly_statistics.html', stats=sorted_monthly_stats)
# 定义路由,当访问 /statistics 路径时执行 statistics 函数
@app.route('/statistics')
def statistics():
# 加载数据
data = load_data()
# 计算总收入,即金额大于 0 的记录的金额总和
income = sum(record['amount'] for record in data if record['amount'] > 0)
# 计算总支出,即金额小于 0 的记录的金额总和(取绝对值)
expenses = sum(record['amount'] for record in data if record['amount'] < 0)
# 返回包含总收入和总支出的 JSON 数据
return jsonify({'total_income': income, 'total_expenses': expenses})
# 定义路由,当访问 /line_chart 路径时执行 generate_line_chart 函数
@app.route('/line_chart')
def generate_line_chart():
# 加载数据
data = load_data()
if not data:
# 如果没有数据,返回 line_chart.html 模板,并设置图表 URL 为 None
return render_template('line_chart.html', chart_url=None)
# 使用 defaultdict 创建一个字典,默认值是一个包含 'income'、'expenses' 和 'profit' 键的字典,初始值都为 0
monthly_stats = defaultdict(lambda: {'income': 0, 'expenses': 0, 'profit': 0})
for record in data:
# 从记录中获取日期、金额
date = record['date']
amount = record['amount']
# 将日期转换为月份字符串
month = datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m') # 获取月份字符串
五.软件亮点:
亮点一:
用户界面设计的精益求精:在设计用户友好型界面的过程中,团队成员对于界面的布局、颜色搭配和交互方式等方面存在不同的意见。通过反复争论和复审,不断调整设计方案,最终打造出简洁直观、美观大方的界面,极大地提高了用户的操作便利性和满意度。
亮点二:
我们不仅涉及了全部的收支记录,还分类规划了月度收支记录,方便更好地分析和了解自己的每个月的具体收支
亮点三:
附加功能的实现,我们能够成功实现绘制收支的折线图。
六.收获事件:
1.我们在设计编码的时候,考虑是采用json还是csv的时候意见产生了分歧,原因是json它的解码结构会将中文转换成其他的字母语言,并且查看时只能用txt文件来查看。
而csv可以正常解码,而且还能以表格的形式打开,一目了然,但是我们原本就是按json文件来保存,后期时间有点紧迫,所以就采用了json,不过好在问题不大😳。
2.对于前端的样式设计,我们立志追求简洁高效,当然这也对我们组内产生了很大的冲突,不过好在大家都会退让,及时筛选出优秀的样式设计进行取舍。
3.复审环节有一件事印象很深,就是大家想要争取实现在应用上添加一个删除数据的功能,但是感觉这个功能不痛不痒,所以大家都笑着决定放弃吧。
七.每个组员的编程体验:
曾庆徽:超超级级无敌有意思
郑礼鑫:AI真好用
池家益:编写个人记账本程序就像搭建一个专属的财务小管家,从定义收支类别到数据存储与计算,每一步都是对编程逻辑与功能实现的有趣探索
翁林靖:遇到了不会的东西现场学习,能得到很多收获
黄志梁:有趣生动充满挑战
王党兵:与AI辅助和优秀团队合作,编写账本应用,从数据记录到图表生成,全程高效流畅,技术提升与团队协作相得益彰
林传昊:在本次团队合作中,每个组员身上都有各自的闪光点,令我学到了很多个人和结对编程中不曾体验的收获。
陈铭扬:通过本次软件工程小组实践,我提升了与小组成员共同协商完成代码的能力以及对于前端网页设计的能力,并且在3个小时现场实践的过程之中,提升自身的应变能力。
毛震:哈哈哈哈,这编程可太棒啦。
岳俊杰:ai真厉害,队友更厉害,安心来自大哥
八.组长打分:
成员 | 学号 | 组长打分(满分100分) |
---|---|---|
成员2 | 池家益 | 96 |
成员3 | 毛震 | 95 |
成员4 | 林传昊 | 97 |
成员5 | 郑礼鑫 | 97 |
成员6 | 黄志梁 | 96 |
成员7 | 岳俊杰 | 95 |
成员8 | 陈铭扬 | 96 |
成员9 | 翁林靖 | 95 |
成员10 | 王党兵 | 97 |
九.github仓库链接以及commit记录:
github链接:https://github.com/zqh666nb/Personal-Editor
commit记录:
(ps:因为有些成员把代码在其他成员机子上先和修改的一并测试,所以没体现在记录上捏。)