这个作业属于哪个课程 | 构建之法-2021秋-福州大学软件工程 |
---|---|
这个作业要求在哪里 | 2021秋软工实践第二次结对编程作业 |
个人学号 | 031902126 |
结对成员学号 | 031902106 |
结对小伙伴的作业博客链接 | 他的链接 |
GitHub 仓库地址 | GitHub链接 |
视频演示链接 | 传送门 |
PSP表格和学习进度条
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
·Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 2400 | 2650 |
· Analysis | · 需求分析 (包括学习新技术) | 360 | 480 |
· Design Spec | · 生成设计文档 | — | — |
· Design Review | · 设计复审 (和同事审核设计文档) | — | — |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 60 | 50 |
· Coding | · 具体编码 | 1680 | 1800 |
· Code Review | · 代码复审 | 180 | 210 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 50 |
Reporting | 报告 | 170 | 160 |
· Test Report | · 测试报告 | — | — |
· Size Measurement | · 计算工作量 | 50 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 120 | 130 |
合计 | — | 2600 | 2840 |
学习进度条
第N天(从9.30开始) | 新增代码(行) | 累计代码(行) | 当天学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 1 | 1 | 开始了解python的django框架 |
2 | 0 | 0 | 5 | 6 | 学习了django与数据库的联系,并写demo练习,写规范文档 |
3 | 50 | 50 | 2 | 8 | 配置了内网穿透,让前端可以网络请求,并且写了所需model |
4 | 100 | 150 | 4 | 12 | 深入了解了django,建立起了基本的框架 |
5 | 100 | 250 | 7 | 19 | 编写了一部分的视图和路由分配,并和前端协商了传输数据的结构 |
6 | 70 | 320 | 5 | 24 | 学习了github合作上传项目,为前端编写了接口文档 |
7 | 250 | 570 | 8 | 32 | 编写了前端所需的所有接口,并生成了文档,编写了单元测试,顺便开始写博客 |
8 | 50 | 620 | 2 | 34 | 根据前端的需求略微修改,顺便学习如何把项目部署到服务器上(虽然没成功) |
9 | 50 | 670 | 3 | 37 | 对项目进行完善,撰写博客,完善GitHub |
编程思考
因为我是负责写后端的,所以主要是用 python 的 django 框架,所以编程的内容就在于这个框架的构建:
重点
- 模型 Model
django 中的模型就扮演着数据库中表的结构的角色,那么重点就演变为如何构建表能使访问数据库更加地简洁。在这次构建表结构中我使用了外键,这个概念我也是刚从本学期数据库课程中学到的。所以创建模型也是一个重点。附上我画的 E-R 图。
- 视图 View 与 路由 Url
视图和路由分配就是 django 的核心。View 负责对应与数据库等交互的接口,接受前端传递的信息以及返回前端所需信息,而路由分配则是根据前端请求的 Url 来绑定视图。重点就在于接口的编写,其中需要用到下一点的 ORM。
本次编程编写的接口: 接口文档 密码:1234 - ORM
它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的 SQL 语句打交道,只要像平时操作对象一样操作它就可以了 。但这样也有缺点,不能像 SQL 语句一样灵活地查询数据。
难点
编程中遇到的最大的困难就是玩家头像的存储与返回,即图片如何保存到数据库并可以返回给前端。最后的实现方法是收到前端的图片后,将图片保存到本地固定路径下面,同时把相对路径存储到数据库中(ORM 的 ImageField 可以实现)。之后配置路由,当前端请求头像时,返回相对路径即可生成 URL 访问到图片。
# 玩家模型
class Player(models.Model):
name = models.CharField(max_length=10) # 昵称
photo = models.ImageField(upload_to="photos", default="a.jpg") # 头像
level = models.SmallIntegerField(null=True) # 最高奖项
# 路由配置
re_path('^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT})
Player表 样例
+----+-------+------------------+-------+
| id | name | photo | level |
+----+-------+------------------+-------+
| 1 | zhou | photos/a.jpg | 1 |
| 9 | yan | photos/img1.jpg | 8 |
| 10 | huang | photos/img2.jpg | 3 |
| 11 | hu | photos/img3.jpg | 7 |
+----+-------+------------------+-------+
结对编程过程
Github相关
- 仓库地址:传送门
- commit记录:
编程体验
- 这次编程与之前个人作业相比,有了小伙伴的督促和激励,学习的兴趣也高涨了许多。而且在遇到困难的时候也可以和小伙伴一起讨论,思考错误的可能原因,共同解决问题。但有时候也会因为沟通不及时,产生一些奇怪的报错。
- 与第一次结对编程作业相比,如果说之前是要我们张开想象的翅膀,尽情地思考和创新,那这一次就需要我们脚踏实地,一步一个脚印地编写出合适的代码。
- 总而言之,这次的编程让我对 python 的掌握更加深入,对合作编程也有了一定的了解。同时也更加期待着接下来的团队编程改如何完成。
编程主要事件及收获
因为对 http 请求的请求头和请求体,以及后端接受请求信息的不了解,导致和前端的信息传递经常出错。尤其是需要上传头像的时候,不了解图片应该如何放在请求体中,以及后端如何获取,导致无法获取到信息。后来,暂停了一会手头的后端工作,转去详细了解了微信小程序是如何编写请求体的,最终解决了问题。所以当我们遇到问题时,不一定要纠结当前这一部分哪里有问题。可以换位思考,思考一下对方应该如何做,进而找到错误。