因为把dll看成ddl而急死——CodeArts团队实战总结

因为把dll看成ddl而急死 2025-11-12 23:43:00
这个作业属于哪个课程2501_CS_SE_FZU
这个作业要求在哪里软工实践——CodeArts团队实战总结
团队名称因为把dll看成ddl而急死
这个作业的目标极限编程,实现基于大语言模型的购车意向咨询系统,博客撰写
其他参考文献

目录

  • 一、项目地址
  • 二、CodeArt 的提交日志截图
  • 三、程序运行环境
  • 四、功能实现思路描述
  • 模块划分与逻辑
  • 1) 用户管理模块(规划/前端已接入)
  • 2) 咨询请求处理模块(已实现 + 规划)
  • 3) 结果展示与格式化模块(前端)
  • 4) 数据安全模块
  • 类图
  • 系统用例图
  • 系统顺序图
  • 五、程序截图说明
  • 1.服务器运行响应日志
  • 2.apifox配置
  • 3.登录的请求响应
  • 4.获取用户基本信息响应
  • 5.获取用户详细资料响应
  • 6.获取最近一次咨询响应
  • 7.建立咨询会话id响应
  • 8.输入基本信息,模型给出初步候选响应
  • 9.最终推荐响应
  • 六、组员分工及贡献比例
  • 七、合作中遇到的困难及解决方法
  • 1.1 叶达(102300229)
  • 遇到的困难
  • 解决方法
  • 1.2 张钰婷(102300206)
  • 遇到的困难
  • 解决方法
  • 1.3 郑天浩(102300109)
  • 遇到的困难
  • 解决方法
  • 1.4 陈彦哲(032201218)
  • 遇到的困难
  • 解决方法
  • 1.5 李严(102300127)
  • 遇到的困难
  • 解决方法
  • 1.6 苏峻(102300221)
  • 遇到的困难
  • 解决方法
  • 1.7 朱添驰(032201109)
  • 遇到的困难
  • 解决方法
  • 1.8 陈雨昕(102300214)
  • 遇到的困难
  • 解决方法
  • 1.9 陈雨桐(102300202)
  • 遇到的困难
  • 解决方法
  • 1.10 吴嘉鑫(102300225)
  • 遇到的困难
  • 解决方法
  • 八、PSP表格
  • 1.1 叶达(102300229)
  • 1.2 张钰婷(102300206)
  • 1.3 郑天浩(102300109)
  • 1.4 陈彦哲(032201218)
  • 1.5 李严(102300127)
  • 1.6 苏峻(102300221)
  • 1.7 朱添驰(032201109)
  • 1.8 陈雨昕(102300214)
  • 1.9 陈雨桐(102300202)
  • 1.10 吴嘉鑫(102300225)

一、项目地址

CodeArts仓库

二、CodeArt 的提交日志截图

学号姓名提交次数
102300229叶达15
102300206张钰婷4
102300109郑天浩3
032201218陈彦哲4
102300127李严3
102300225吴嘉鑫4
102300221苏峻3
032201109朱添驰3
102300214陈雨昕3
102300202陈雨桐3

img

img

img

三、程序运行环境

-前端:Flutter 3.35.7
-后端:Python 3.11 + FastAPI
-数据库:MySQL 8.4,开发/CI 用 SQLite 内存库
-依赖与环境管理:uv包管理器

四、功能实现思路描述

模块划分与逻辑

遵循参考博客的模块划分,结合当前实现与规划,分为「用户管理」「咨询请求处理」「结果展示与格式化」「数据安全」四个模块:

1) 用户管理模块(规划/前端已接入)

-功能描述
-账号注册、登录、令牌刷新与退出登录。
-登录成功后持久化访问令牌与刷新令牌(SharedPreferences/Hive)。

-接口定义(RESTful,统一前缀 /api/v1/users

接口方法入参(JSON)出参(JSON)
/api/v1/users/registerPOSTusernameemail?phone?password{ code, message, data }
/api/v1/users/loginPOSTidentifierpassword{ code, message, data: { access_token, refresh_token } }
/api/v1/users/refreshPOSTrefresh_token{ code, message, data: { access_token } }

-实现要点
-服务端统一响应结构与错误码;异常统一由 routes.py 注册的处理器返回:backend/app/api/v1/routes.py:36-52
-前端 API 客户端自动刷新令牌与重试:frontend/llm_app/lib/services/api_client.dart:21-84

2) 咨询请求处理模块(已实现 + 规划)

-功能描述
-查询系统中已注册的 LLM 模型,选择模型启动咨询。
-按四阶段提示词契约执行咨询流程,结果以 Markdown 列表与表格输出,便于解析与渲染。

-接口定义

接口方法入参出参
/api/v1/llm/modelsGET-{ code, message, data: { items: [...] }, request_id }
/api/v1/consult/startPOST{ modelId? , customModel? } 二选一{ code, message, data: { consultId, modelSource }, request_id }
/api/v1/llm/consultationsPOST{ credentials, modelId? , customModel? }{ code, message, data: { consultations_id } }
/api/v1/llm/consultations/phase1POST需求关键字/预算等{ code, message, data: { candidates: [...] } }
/api/v1/llm/consultations/phase2POST需求关键词修正{ code, message, data: { updated: [...] } }
/api/v1/llm/consultations/phase3POST参数对比维度{ code, message, data: { table: ... } }
/api/v1/llm/consultations/phase4GETconsultations_id{ code, message, data: { final: ... } }

-LLM 接口调用设计
-固定 system prompt 与结构化输出(严格):backend/app/services/llm/prompts.py:7-13
-Builder 模式封装客户端、上下文记忆与阶段提示词注入:backend/app/services/llm/client.py:155-213
-请求重试与指数退避、统一异常:backend/app/services/llm/client.py:102-153

3) 结果展示与格式化模块(前端)

-功能描述
-将 LLM 输出按约定格式渲染,列表项遵循 - 车型名 - 一句话理由;表格列固定为:车型|价格(万元)|动力类型|续航/油耗|空间|安全配置|适合人群|总评
-采用 flutter_markdown 渲染 Markdown 文本,配合业务解析器保证稳定展示。

-实现要点
-前端服务封装与仓储解耦:frontend/llm_app/lib/services/consultation_service.dart:1-32frontend/llm_app/lib/repositories/consultation_repository.dart:1-46
-Provider 统一状态:frontend/llm_app/lib/providers/consultation_provider.dart:1-31

4) 数据安全模块

-功能描述
-身份认证:JWT(访问令牌与刷新令牌),令牌拦截器自动注入。
-配置安全:通过环境变量注入(Pydantic Settings),禁止硬编码密钥与连接串。
-访问控制:限流(SlowAPI)、结构化日志与 request_id 贯穿。

-实现要点
-后端配置:backend/app/core/config.py:20-60.env 加载、字段说明)。
-令牌拦截与自动刷新:frontend/llm_app/lib/services/api_client.dart:21-84

类图

img

系统用例图

img

系统顺序图

img


五、程序截图说明

img

img

img

img

img

img

img

img

1.服务器运行响应日志

img

2.apifox配置

img

3.登录的请求响应

img

4.获取用户基本信息响应

img

5.获取用户详细资料响应

img

6.获取最近一次咨询响应

img

img

7.建立咨询会话id响应

img

8.输入基本信息,模型给出初步候选响应

img

9.最终推荐响应

img

六、组员分工及贡献比例

学号姓名工作内容贡献度
102300229叶达后端框架搭建13
102300206张钰婷前端 咨询模块 编写12
102300109郑天浩后端数据库模型定义8
032201218陈彦哲后端 测试模块 编写8
102300127李严后端schema接口输入输出结构定义8
102300225吴嘉鑫前端“推荐”模块编写11
102300221苏峻前端“我的”模块编写10
032201109朱添驰前端“咨询模块编写”12
102300214陈雨昕博客随笔内容的编写10
102300202陈雨桐后端api端点编写8

七、合作中遇到的困难及解决方法

1.1 叶达(102300229)

遇到的困难

每次咨询会话存在内存管理问题,如果用户不完成会话

解决方法

当模型客户端长时间未接受输入,则自动结束会话

1.2 张钰婷(102300206)

遇到的困难

对前端实现不够熟练

解决方法

加强学习,询问组长

1.3 郑天浩(102300109)

遇到的困难

模块的输入输出的格式不符合要求

解决方法

和其他模块的同学沟通,了解整个流程

1.4 陈彦哲(032201218)

遇到的困难

在编写测试代码的时候,经常会测试失败。这些失败有时候是队友代码的问题,但有的时候是我自己的代码的问题。
所以我经常会误以为是队友代码的问题,然后和队友沟通,结果发现是自己的问题,这样大大增加了沟通成本。

解决方法

为我的测试代码编写对应的测试代码,也就是“测试的测试”。在我自己对自己测试没有问题之后,我再去测试队友的代码。
这样大大减少了沟通成本,提升了沟通效率。

1.5 李严(102300127)

遇到的困难

功能实现不够熟练

解决方法

加强学习

1.6 苏峻(102300221)

遇到的困难

与服务器进行连接时无法获取到正确的数据

解决方法

借助ai进行错误查询以找出问题所在,然后再进行测试所得数据。

1.7 朱添驰(032201109)

遇到的困难

因数设计时考虑不够周到导致部分接口设计时存在一定问题

解决方法

与其他组员交流,重新设计接口

1.8 陈雨昕(102300214)

遇到的困难

开发时间短,学习使用框架的时间紧张,不熟悉前后端交互

解决方法

上网查询,与队友交流解决办法

1.9 陈雨桐(102300202)

遇到的困难

使用git不太熟练;一开始api设计不够合理

解决方法

通过ai查不同的git指令;和队友沟通满满解决了

1.10 吴嘉鑫(102300225)

遇到的困难

1.布局与内容溢出(BOTTOM OVERFLOWED)的冲突:
最初的需求是顶部卡片1(推荐信息)固定不动,而下方的卡片(2, 3, 4)在剩余空间中滚动。
当卡片1的“推荐理由”内容过多时,导致其 SizedBox(固定 30% 屏幕高度)发生内容溢出(出现黄色警告条)。
尝试“点击放大卡片1”的方案(即动态改变 SizedBox 的 height)导致了更严重的布局冲突:Column 无法计算一个“固定”组件和一个“动态高度”组件的布局,导致整个页面溢出。
2.动态数据绑定与状态管理:
如何实现顶部的 DropdownButton(下拉框)能够同时控制页面上所有卡片(推荐卡、基本信息卡、详细信息卡、参数对比卡)的数据显示。
在 initState 中加载一次数据后,如何在切换下拉框时,让所有卡片都接收到对应的新数据并刷新。
3.复杂UI组件的实现:
卡片3 (详细信息): 需要显示“核心需求”和“偏好设置”等标签 (Chips),这些标签必须能在空间不足时自动换行。
卡片4 (参数对比): 需要显示一个多列的表格,而这个表格的宽度远超屏幕宽度,必须能横向滚动,且不能显示滚动条。
4.项目结构与代码可维护性:
随着四个卡片的功能全部实现,所有的数据模型(如 RecommendationInfo)、模拟数据(如 teslaComparisonData)和UI构建逻辑(所有 _build... 方法)全部堆积在 main.dart 一个文件中。
这导致 main.dart 文件变得极其臃肿,难以阅读、修改和维护。

解决方法

1.采用“固定高度 + 弹窗”方案解决布局冲突:
放弃了“点击放大”方案,回到了 Column + Expanded 的稳定布局。卡片1被包裹在 SizedBox(height: screenHeight * 0.25) 中,保持其高度固定。
为了显示卡片1的完整内容,我们移除了内部滚动条,并对“推荐理由”文本设置 maxLines: 1 和 overflow: TextOverflow.ellipsis(显示省略号)。
关键解决方案:为卡片1添加 GestureDetector,当用户点击时,调用 showDialog 方法弹出一个 AlertDialog (详情弹窗)。这个弹窗在新的图层显示,可以自由滚动并展示全部的推荐理由,完美解决了固定高度和内容溢出的矛盾。
2.创建统一的数据模型与服务层:
统一数据模型: 创建了一个总的 AppScreenData 类,它封装了该页面所有需要变化的数据(卡片1、2、3、4的数据模型)。
建立“数据库”: 在 _DropdownCardPageState 中,创建了一个 Map<String, AppScreenData> _mainDatabase 变量。
数据驱动UI: initState 时,从 MockApiService 加载所有数据并填充 _mainDatabase。DropdownButton 的 onChanged 回调中只负责 setState 更改 _selectedOption(选中的车型名称)。build 方法根据 _selectedOption 从 _mainDatabase 查找对应的 AppScreenData,然后将数据分发给各个卡片。
3.使用 Wrap 和 SingleChildScrollView 构建复杂UI:
卡片3 (自动换行): 在 ConsultationDetailCard 中,使用 Wrap Widget 来布局标签 (Chips)。Wrap 会自动根据屏幕宽度计算布局,当一行放不下时,自动将下一个 Chip 折到新的一行,完美实现了响应式布局。
卡片4 (横向滚动): 在 ComparisonTableCard 中,使用 SingleChildScrollView(scrollDirection: Axis.horizontal) 包裹一个 Row(Row 中包含多个 Column)。这使得表格可以横向滚动。最后用 ScrollConfiguration 包裹它,并设置 scrollbars: false 来隐藏滚动条。
重构项目(关注点分离):
4.按照专业项目结构,将代码分离到三个独立的文件夹中:
lib/models/: 存放所有的数据结构文件(如 recommend_model.dart)。
lib/services/mock/: 存放模拟API服务(如 mock_recomend_service.dart),它负责提供数据。
lib/widgets/: 存放所有独立的UI组件(如 recommendation_card.dart, comparison_table_card.dart 等)。
main.dart 文件现在变得非常简洁,只负责页面骨架、状态管理和 import 导入需要的服务与 Widgets,大大提高了代码的可读性和可维护性。

八、PSP表格

1.1 叶达(102300229)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划8060
• Estimate• 估计这个任务需要多少时间8060
Development开发680620
• Analysis• 需求分析 (包括学习新技术)10090
• Design Spec• 生成设计文档8070
• Design Review• 设计复审4030
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)3025
• Design• 具体设计8070
• Coding• 具体编码240210
• Code Review• 代码复审4030
• Test• 测试(自我测试,修改代码,提交修改)150160
Reporting报告7060
• Test Report• 测试报告4030
• Size Measurement• 计算工作量2015
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划3030
合计760680

1.2 张钰婷(102300206)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6045
• Estimate• 估计这个任务需要多少时间6045
Development开发620570
• Analysis• 需求分析 (包括学习新技术)9080
• Design Spec• 生成设计文档6050
• Design Review• 设计复审3025
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)2015
• Design• 具体设计6055
• Coding• 具体编码200180
• Code Review• 代码复审3025
• Test• 测试(自我测试,修改代码,提交修改)130140
Reporting报告6050
• Test Report• 测试报告3020
• Size Measurement• 计算工作量1010
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2020
合计740665

1.3 郑天浩(102300109)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划7050
• Estimate• 估计这个任务需要多少时间7050
Development开发640600
• Analysis• 需求分析 (包括学习新技术)10090
• Design Spec• 生成设计文档7060
• Design Review• 设计复审4035
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)3025
• Design• 具体设计7065
• Coding• 具体编码220200
• Code Review• 代码复审4030
• Test• 测试(自我测试,修改代码,提交修改)140150
Reporting报告7060
• Test Report• 测试报告4025
• Size Measurement• 计算工作量1515
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2520
合计810735

1.4 陈彦哲(032201218)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划10085
• Estimate• 估计这个任务需要多少时间8055
Development开发400370
• Analysis• 需求分析 (包括学习新技术)11095
• Design Spec• 生成设计文档8070
• Design Review• 设计复审5040
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)2520
• Design• 具体设计8075
• Coding• 具体编码240220
• Code Review• 代码复审5040
• Test• 测试(自我测试,修改代码,提交修改)200180
Reporting报告10095
• Test Report• 测试报告5550
• Size Measurement• 计算工作量2020
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2515
合计710625

1.5 李严(102300127)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划8070
• Estimate• 估计这个任务需要多少时间8070
Development开发860780
• Analysis• 需求分析 (包括学习新技术)7060
• Design Spec• 生成设计文档6050
• Design Review• 设计复审5040
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)4035
• Design• 具体设计6055
• Coding• 具体编码360360
• Code Review• 代码复审5040
• Test• 测试(自我测试,修改代码,提交修改)9080
Reporting报告7060
• Test Report• 测试报告4025
• Size Measurement• 计算工作量1515
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2520
合计930850

1.6 苏峻(102300221)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3025
• Estimate• 估计这个任务需要多少时间2015
Development开发500550
• Analysis• 需求分析 (包括学习新技术)5040
• Design Spec• 生成设计文档5055
• Design Review• 设计复审3540
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)3520
• Design• 具体设计5560
• Coding• 具体编码150170
• Code Review• 代码复审2025
• Test• 测试(自我测试,修改代码,提交修改)30100
Reporting报告8090
• Test Report• 测试报告5030
• Size Measurement• 计算工作量2015
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划4060
合计11651295

1.7 朱添驰(032201109)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划8070
• Estimate• 估计这个任务需要多少时间8070
Development开发600580
• Analysis• 需求分析 (包括学习新技术)7060
• Design Spec• 生成设计文档6050
• Design Review• 设计复审5040
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)4035
• Design• 具体设计6055
• Coding• 具体编码360360
• Code Review• 代码复审5040
• Test• 测试(自我测试,修改代码,提交修改)9080
Reporting报告7060
• Test Report• 测试报告4025
• Size Measurement• 计算工作量1515
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2520
合计670600

1.8 陈雨昕(102300214)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6070
• Estimate• 估计这个任务需要多少时间6070
Development开发645695
• Analysis• 需求分析 (包括学习新技术)3040
• Design Spec• 生成设计文档5060
• Design Review• 设计复审5040
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)3020
• Design• 具体设计3025
• Coding• 具体编码300320
• Code Review• 代码复审120150
• Test• 测试(自我测试,修改代码,提交修改)5040
Reporting报告6560
• Test Report• 测试报告3025
• Size Measurement• 计算工作量1015
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2520
合计785835

1.9 陈雨桐(102300202)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1520
Estimate估计这个任务需要多少时间1520
Development开发675740
Analysis需求分析 (包括学习新技术)130120
Design Spec生成设计文档3030
Design Review设计复审2025
Design具体设计6075
Coding具体编码300330
Code Review代码复审2040
Test测试(自我测试,修改代码,提交修改)115120
Reporting报告5050
Test Repor测试报告3030
Size Measurement计算工作量2020
合计740810

1.10 吴嘉鑫(102300225)

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1520
Estimate估计这个任务需要多少时间1520
Development开发705740
Analysis需求分析 (包括学习新技术)140120
Design Spec生成设计文档3030
Design Review设计复审2025
Design具体设计6075
Coding具体编码320330
Code Review代码复审2540
Test测试(自我测试,修改代码,提交修改)110120
Reporting报告5050
Test Repor测试报告3030
Size Measurement计算工作量2020
合计740810
...全文
81 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

103

社区成员

发帖
与我相关
我的任务
社区描述
2501_CS_SE_FZU
软件工程 高校
社区管理员
  • FZU_SE_LQF
  • 木村修
  • 心态773
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧