2024秋软件工程iman现场编程作业

news/2025/2/12 14:53:50/文章来源:https://www.cnblogs.com/LeeeLong/p/18522612
作业所属课程 班级的链接
作业要求 2024秋软件工程现场编程作业 - 作业 - 软件工程2024 - 班级博客 - 博客园
作业目标 现场极限编程,制作一个个人记账本程序。
团队名称 iman
团队成员 102202146 - 蓝敏龙, 102201225 - 陈碧煌, 102202105 - 王梓铭, 102202124 - 阿依娜孜, 102202135 - 施宇翔, 102202134 - 承宇豪, 102202117 - 杨邑豪, 102202122 - 张诚坤, 102201506 - 刘宇杰, 102201137 - 郭剑敏

一、职责分工

PM-产品经理

102202146 - 蓝敏龙 进行任务拆分,统筹组员分工。整体功能设计。

前端设计小组

102201225 - 陈碧煌 负责总体界面规划,账单收支统计功能设计
102202105 - 王梓铭 负责前端界面绘制和美工设计
102202124 - 阿依娜孜 负责基础记账功能设计
102201506 - 刘宇杰 负责用户个人界面设计
102201137 - 郭剑敏 负责调试测试前端功能

后端开发与测试小组

102202135 - 施宇翔 负责前后端接口调用与数据处理,账单收支统计与GitHub仓库创建与管理
102202134 - 承宇豪 编写账单添加和记录模块和调试账单添加模块
102202117 - 杨邑豪 编写账单查询模块,调试账单查询功能
102202122 - 张诚坤 调试记账整体功能,测试功能完备性

二、程序运行环境

前端:VUE2

后端:Python3.9 Django3.1.5

三、运行截图与视频

四、关键代码展示

读取和保存每条账单记录

# 初始化 JSON 文件
def initialize_json_file():if not os.path.exists(JSON_FILE_PATH):with open(JSON_FILE_PATH, mode='w', encoding='utf-8') as file:json.dump([], file)  # 创建一个空的 JSON 数组# 读取所有记录
def read_records():initialize_json_file()  # 确保文件存在with open(JSON_FILE_PATH, mode='r', encoding='utf-8') as file:records = json.load(file)  # 从 JSON 文件加载记录return records# 保存新记录
def save_record(year, month, day, amount, category, remark):initialize_json_file()  # 确保文件存在records = read_records()  # 读取现有记录以获取最新的 IDrecord_id = len(records)  # 新记录的 ID 为现有记录的数量new_record = {"id": record_id,"year": year,"month": month,"day": day,"amount": amount,"category": category,"remark": remark}records.append(new_record)  # 将新记录添加到现有记录中# 将更新后的记录写回 JSON 文件with open(JSON_FILE_PATH, mode='w', encoding='utf-8') as file:json.dump(records, file, ensure_ascii=False, indent=4)  # 写入所有记录# 写入所有记录(用于更新)
def write_all_records(records):with open(JSON_FILE_PATH, mode='w', encoding='utf-8') as file:json.dump(records, file, ensure_ascii=False, indent=4)  # 写入所有记录

账单展示界面:

使用 v-for 循环遍历 dataList,动态生成每一条记录的展示。

<view class="item" v-for="(item, index) in dataList" :key="index"><view class="count"><view class="sa-flex-x"><view>日期: {{item.create_time}}</view><view class="week">({{item.create_time | weekFormat}})</view></view></view><view class="sa-flex-x space content"><view class="sa-flex-x center cover" :class="item.type==1 ? 'income':'expend'"><image :src="'../../static/icon/'+item.icon+'.png'" mode="aspectFill"></image></view><view class="info"><view class="name">{{item.content}}</view><view class="desc" v-if="item.remarks">{{item.remarks}}</view></view><view class="sa-flex-x money" :class="item.type==1 ? 'income':'expend'"><text class="symbol">{{item.type==1 ? '+':'-'}}</text><text>{{item.money}}</text></view></view>
</view>

weekFormat 过滤器用于格式化日期以显示星期几。

filters: {weekFormat(val) {return format.getWeekDay(val);}
},

getData() 从本地存储中获取记录并解析。total() 方法计算总支出、总收入、笔数和结余,并更新状态。

getData() {uni.getStorage({key: 'sa_storage_bill',success: res => {const data = JSON.parse(res.data);this.dataList = JSON.parse(res.data);this.total();}})},total() {const data = this.dataList;const group = format.arrayGroup(data, 'type');if(Object.keys(group).length > 0) {const expendMoney = group[0].reduce((sum, item) => sum + Number(item.money), 0);this.totalExpend = expendMoney.toFixed(2);this.sumExpend = group[0].length;}if(Object.keys(group).length > 1) {const incomeMoney = group[1].reduce((sum, item) => sum + Number(item.money), 0);this.totalIncome = incomeMoney.toFixed(2);this.sumIncome = group[1].length;}this.sumCount = data.length;this.totalbalance = (this.totalIncome - this.totalExpend).toFixed(2); }

五、亮点功能

用图表展示账单收支统计

将按天聚合的金额按日期排序,使用 Matplotlib 绘制折线图,设置图表的大小、标题、X 轴和 Y 轴标签,并添加网格。构造图像的绝对 URL,并将其作为响应返回给客户端。

@api_view(['POST'])
def get_records_image(request):records = read_records()# 获取查询参数year = request.data.get('year')month = request.data.get('month')category = request.data.get('category')# 根据查询条件过滤记录if year is not None:records = [record for record in records if record['year'] == int(year)]if month is not None:records = [record for record in records if record['month'] == int(month)]if category is not None:records = [record for record in records if record['category'] == category]# 如果没有记录,返回错误信息if not records:return Response({"error": "No records found"}, status=404)# 准备数据用于聚合daily_totals = defaultdict(int)for record in records:day = record['day']amount = record['amount']daily_totals[day] += amount# 将聚合后的数据分开为天和对应的总金额days = sorted(daily_totals.keys())amounts = [daily_totals[day] for day in days]# 绘制折线图plt.figure(figsize=(10, 5))plt.plot(days, amounts, marker='o')plt.title(f'Records for {year}-{month}')plt.xlabel('Days')plt.ylabel('Total Amount')plt.grid()# 保存图像到本地image_path = os.path.join(settings.MEDIA_ROOT, 'charts', f'records_{year}_{month}_{category}.png')plt.savefig(image_path)plt.close()# 返回图像的 URLimage_url = f"{request.build_absolute_uri(settings.MEDIA_URL)}charts/records_{year}_{month}_{category}.png"return Response({"image_url": image_url})

六、在编码、争论、复审等活动中花费时间较长,给你们较大收获的事件:

  1. 学习GitHub的协作编程

    在项目的初期阶段,我们对GitHub的协作操作还不够熟悉,出现了一些操作失误。一次因为版本合并问题,不得不重建仓库,已经上传的代码需要重新提交。虽然这个过程有些繁琐,但我们对GitHub协作有了更深的理解,认识到它在版本管理和团队协作中的巨大优势。(栋:不要使用QQ传文件!)

  2. 前后端接口的联调测试

    在开发过程中,前后端接口联调耗费了大量时间。尤其是在数据格式和接口调用方面,前后端经常出现对不上的情况。这里非常感谢我们的后端小伙伴,他们的“可以接可以接”让人心里暖暖嘟。

  3. 功能需求与技术实现的取舍

    因为三小时时间非常有限,而团队大家想法非常多想实现的功能也不少,但是考虑到整体框架的实现,我们还是做了很多取舍,最重要的是实现整体快速迭代的开发。

  4. 使用Matplotlib展示数据

    在设计账单收支统计的图表功能时,我们第一次尝试用Matplotlib来展示数据。这个地方我们碰了非常多壁,大家一起学习,最后搞定了图表展示这一问题。

七、团队成员感悟:

  • 蓝敏龙 (产品经理)

作为产品经理,我的任务是统筹全局,确保每个成员都能在各自的岗位上发挥最大效能。在任务拆分的过程中,我意识到良好的沟通是成功的关键。这个极限编程对我们一个小团队来说非常具有挑战性,但是最后还是成功的做出了一个相对成熟的man记账!

  • 陈碧煌 (前端设计)

这次编程给我最大的挑战其实是协作编程,一开始我觉得记账本很简单,还乐呵呵的跟队友说man记账可以用到我们的man游中,但是协作编程却给我带来了很大的挑战。在最开始pull和merge产生了一些失误,幸亏有队友的帮助,我也能在完成自己的工作部分的同时,也协作到团队的整体工作中,整体来说是收获满满的一次体验。

  • 王梓铭 (前端设计)

在这次团队编程中我学到了很多新东西,虽然写的代码量不多,但是我通过与队友的讨论以及实际编程学到了很多前端的注意事项,在和团队的讨论中深刻地体会到了和大家讨论的时候效率确实会变高,希望以后还有更多的机会参加团队编程。

  • 阿依娜孜 (前端设计)

负责基础记账功能设计的过程中,我深入学习了数据结构和逻辑实现。实现一个高效的记账功能不仅需要考虑用户的输入体验,还要考虑数据的准确性和存储效率。通过这个项目,我对前端技术有了更深入的认识,特别是在VUE框架下如何实现数据绑定和事件处理,让我的编程能力得到了提升。

  • 施宇翔 (后端开发)

作为后端开发人员,我主要负责前后端接口的调用与数据处理。在这个项目中,我学会了如何设计高效的API,确保前端能够顺利获取数据。遇到的挑战让我对Django框架有了更深入的理解,也让我认识到良好文档的重要性。通过与前端团队的不断沟通,我体会到协作编程的乐趣与意义。

  • 承宇豪 (后端开发)

在这次项目中,我负责编写账单添加和记录模块的工作。在实现账单添加功能时,我遇到了一些挑战,通过查阅文档和进行多次调试,我学会了使用Django中的序列化器来验证和处理数据。这不仅提高了我的编程技能,也让我更加重视代码的规范性和可维护性。与前端团队的合作让我认识到,良好的接口设计是保证数据顺利流动的关键,未来我会继续在这方面努力。

  • 杨邑豪 (后端开发)

在编写账单查询模块的过程中,我负责实现查询功能并进行调试。这个阶段的工作让我意识到后端系统的复杂性,以及如何根据不同的条件快速过滤和返回数据。为了实现高效的查询功能,我深入学习了Django ORM的使用,并尝试优化查询逻辑。在测试阶段,我和前端团队密切合作,确保接口能够准确地响应请求。

  • 刘宇杰 (前端设计)

在用户个人界面设计中,我提升了用户体验的思维,学会了如何更好地展现信息。

  • 郭剑敏 (前端设计)

调试前端功能的过程让我认识到测试的重要性,发现问题并解决是提升项目质量的关键。

  • 张诚坤 (后端开发)

调试整体功能让我意识到团队协作的重要性,沟通能有效提高工作效率和项目质量。

八、PSP:

PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 5 5
Development 开发 150 250
Analysis 需求分析 10 20
Design 具体设计 15 30
Coding 具体编码 120 180
Test 测试 20 20
合计 180 255

九、GitHub 仓库地址和 commit 记录:

仓库地址:man记账


十、组员贡献评分

组员 分数 组员 分数
102202146 - 蓝敏龙 102202134 - 承宇豪
102201225 - 陈碧煌 102202117 - 杨邑豪
102202105 - 王梓铭 102202122 - 张诚坤
102202124 - 阿依娜孜 102201506 - 刘宇杰
102202135 - 施宇翔 102201137 - 郭剑敏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/825935.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4 Empirical Properties of Limit Order Books

LOB 可以揭露很多有趣的微观信息,近年来也有许多研究。但需要注意:高频交易的进化速度极快,让这些研究很多时候比较过时。 Originally Posted at: https://clouder0.com/zh-cn/posts/lob-empirical-properties/ 总结性的来说,作者发现了这些特点:每日交易量大概占市值的 \…

2024秋软工实践iman原型设计和UML设计

信息类别 内容作业所属课程 软件工程实践 - 秋季班作业要求 第一次团队作业 - 原型设计与概要设计作业目标 根据需求分析和设计,完成项目的原型设计和概要设计,培养团队协作能力,为后续的开发奠定基础。团队名称 iman 🌟团队成员 - 102202146 - 蓝敏龙- 102201225 - 陈碧煌…

CF1658E Gojou and Matrix Game

题意题解 设f[i,j]表示(i,j)先手必胜/必败 则全局max一定必败,因为先手走出去后手走回来,重复无限次后必输 然后全局max外(距离>k)的必胜,因为可以走到全局max 之后可以发现,下一个必败的是全局max范围内的次max,因为次max不能①走出全局max范围 ②走到全局max ③走到…

20222422 2024-2025-1 《网络与系统攻防技术》实验四实验报告

一、实验内容 1、恶意代码文件类型标识、脱壳与字符串提取对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用超…

【Atcoder训练记录】AtCoder Beginner Contest 378

训练情况赛后反思 简单题又WA了一发,淦,开局崩心态,然后做题的时候被场外因素打断了。 A题 统计 \([1,4]\) 中每个数字出现的个数,输出对数即可。 #include <bits/stdc++.h> #define int long longusing namespace std;int cnt[5];void solve(){for(int i = 1;i<=…

《使用Gin框架构建分布式应用》阅读笔记:p307-p392

《用Gin框架构建分布式应用》学习第16天,p307-p392总结,总86页。 一、技术总结 1.AWS chapter 08讲使用AWS进行部署,可以根据需要选择是否阅读。因为使用到的概率很小,且还要绑卡,本人选择跳过。 2.CI/CD (1)什么是CI/CD p348,Luckily, many deployment steps can be aut…

基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现六

三、系统部分功能描述物品分类信息业务逻辑层Service、小区信息业务逻辑层Service、快递柜格子信息业务逻辑层Service、投诉信息业务逻辑层Service、快递柜类型信息业务逻辑层Service、快递柜信息业务逻辑层Service一、前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化…

团队作业3——需求改进系统设计

这个作业属于哪个课程 班级地址这个作业要求在哪里 作业要求这个作业的目标 需求改进&系统设计评分基准:需求&原型改进 - 20分系统设计 - 50分Alpha任务分配计划 - 20分测试计划 - 10分一、需求&原型改进: 1.1针对课堂讨论环节老师和其他组的问题及建议,对修改选…

2024年仿真/CAE 软件市场报告

CAE仿真市场的影响CAD、CAE呈融合趋势设计方法的革命--分析/模拟MCAE 是 MFG 设计软件的最大部分MFG设计,全称Manufacturing Design,即制造设计。它是一种在产品设计阶段就考虑制造过程的工程实践,旨在提高产品的可制造性,降低生产成本,缩短生产周期,并提升产品质量。 MC…

美团面试:Mysql如何选择最优 执行计划,为什么?

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

网络请求库–axios库

认识axiosaxios请求方式常见的配置选项axios的创建实例

基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现五

三、系统部分功能描述前台用户信息数据层Dao、物品信息数据层Dao、快递员信息数据层Dao、预约记录信息数据层Dao、消息通知信息数据层Dao、取出记录信息数据层Dao、预约取出记录信息数据层Dao一、前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量…