142
社区成员




这个作业属于哪个课程 | 2022年福大-软件工程;软件工程实践-W班 |
---|---|
这个作业要求在哪里 | 软件工程实践结对作业二 |
结对学号 | 221900305、221900331 |
这个作业的目标 | 记录PSP表格、编程实现冬奥会网页、部署发布 |
其他参考文献 | CSDN、博客园等 |
git仓库:https://gitcode.net/qq_52783287/pairproject/-/tree/master/221900305_221900331/2022
代码规范:https://gitcode.net/qq_52783287/pairproject/-/blob/dev/221900305_221900331/2022/%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83.md
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 20 |
• Estimate | • 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 3245 | 3690 |
• Analysis | • 需求分析 (包括学习新技术) | 120 | 150 |
• Design Spec | • 生成设计文档 | 20 | 15 |
• Design Review | • 设计复审 | 20 | 15 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
• Design | • 具体设计 | 20 | 25 |
• Coding | • 具体编码 | 2880 | 3270 |
• Code Review | • 代码复审 | 15 | 10 |
• Test | • 测试(自我测试,修改代码,提交修改) | 50 | 40 |
• Team Communication | • 结对讨论 | 120 | 150 |
Reporting | 报告 | 45 | 55 |
• Test Repor | • 测试报告 | 20 | 30 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 15 | 15 |
合计 | 3310 | 3765 |
确定项目开发方式
刚拿到项目时第一时间想到的就是用上学期才学的三件套来写,本来在犹豫是否要学习新的框架,但感觉时间不是很充裕,就决定以html+css+js为基础进行前端开发,在js中读取json数据。
爬取数据【该爬取行为仅用于课程教学!】
由于之前的作业已经进行过数据爬取(在官网中的开发者模式获取json数据,并对json数据进行处理,存为单独的json文件),本次作业直接对已有的json文件进行读取。
功能结构图
设计思路和实现过程
本次作业是在上次作业原型的基础上进行的,因此在设计时首先就是对原型进行分析,分析原型可保留的地方和应该要修改的地方。大体上将项目分为五个部分:首页,奖牌榜,奖牌地图,赛程,其他功能。
首页:主要参照了原型设计时的样式排版,但删除了导航栏,把进入子页面的触发事件改在冰墩墩身上,使网页更加美观和有趣。
奖牌榜:我们用了一些css模板来使页面更加美观,在将奖牌榜嵌入css模板中时,遇到了大小不符合的问题。本来将表格嵌入时没遇到什么问题,但是当国旗导入时,图片的大小会出现冲突,无法与表格大小和子项大小兼容。试了许多百度的方法(如改变图片属性使其自适应大小)都没法解决,最后用傻办法将所有图片的尺寸改成与表格子项的大小一致。
奖牌地图:刚开始在网上找了许多地图资源,但有些无法使用。后来我们找到了echart写的世界的疫情地图,于是根据教程导入到项目中,本以为改改地图上的数据是很容易的事,但在过程中对地图上数据的value类型一直没搞清楚。后来发现是类似于map类型的键值对,而一个国家只能对应一个值,最后我们对该值进行除法和取余,将其划分为多个数据,分别为奖牌总数和金银铜牌数。
赛程:刚开始不知道如何不用后端读取数据,就想着简单一些,直接把数据写在代码里,就先做了第一个版本的赛程表,是用类似下拉列表的思路设计的,筛选过程是模糊搜索,输入关键字就能找出对应的赛程。但后来发现这样没法实现组合筛选,并且把数据写死在代码中明显是不合理的。因此后来我们通过请教同学以及百度查资料,学习了如何用js读取json数据,便根据原型的设计制作了新的赛程表,通过读取json文件来获取数据,通过三个下拉框实现组合筛选。
其他功能和页面主要涉及到的是前端的页面设计,起到了美化整个网站的效果。我们设计了冬奥简介,项目介绍,精彩瞬间和新闻速递四个页面,主要是同过一些css和js的模板为页面增加了一些美观的图片和介绍。
tooltip: {
trigger: 'item',
formatter: function (params) {
var value = (params.value + '');
var rank = Math.floor(value*100%100);
var gold = Math.floor(value*10000%100);
var silver = Math.floor(value*1000000%100);
var bronze = Math.floor(value*100000000%100);
if(value>0)
string = params.name + '<br/>' + '金牌榜第' + rank + '名' + '<br/>' +
'金:' + gold +'<br/>' + '银:' + silver +'<br/>' + '铜:' + bronze ;
else
string = params.name ;
return string;
}
},
visualMap: {
min: 0,
max: 37,
text:['High','Low'],
realtime: false,
calculable: true,
color: ['#f82c00','#f8bd00','#eeeeee']
},
<table width=800px class=table4_8>
<tr>
<th width=100px >排名</th>
<th>国家</th>
<th width=67px>国旗 </th>
<th> </th>>
<th>金牌</th>
<th>银牌</th>
<th>铜牌</th>
<th>总计</th>
</tr>
<tr>
<td>1</td>
<td> <strong>挪威</strong></td>
<td style="background: url(../2022/public/nuowei.png);"> </td>
<td> </td>
<td>16</td>
<td>8</td>
<td>13</td>
<td>37</td>
</tr>
$(function ()
{
//点击让其展示出列表 默认让其都隐藏
$(".box tr.parent").click(function () {
$(this)
.toggleClass("selected")
.siblings(".child_"+this.id).stop().toggle();
}).click();//此行代码表示要立即执行
//设置列表查询
$("#filterName").keyup(function () {
$("table tbody tr").stop().hide() //将tbody中的tr都隐藏
.filter(":contains('"+($(this).val())+"')").show(); //,将符合条件的筛选出来
});
});
function Search (s)
{
var url = "data//02" + s.substr(2,3) + ".json";
var request = new XMLHttpRequest();
request.open("GET",url);
request.send(null);
request.onload = function()
{
if (request.status == 200)
{
var json = JSON.parse(request.responseText);
var matchData = document.getElementById("match");
for (var i=0;json.data.matchList[i]!=null;i++)
{
var row = document.createElement("tr");
var dateCell = document.createElement('td');
var sportCell = document.createElement('td');
var matchCell = document.createElement('td');
var placeCell = document.createElement('td');
matchData.appendChild(row);
row.appendChild(dateCell);
row.appendChild(sportCell);
row.appendChild(matchCell);
row.appendChild(placeCell);
var dateCellText = document.createTextNode(json.data.matchList[i].startdatecn);
var sportCellText = document.createTextNode(json.data.matchList[i].itemcodename);
var matchCellText;
if (json.data.matchList[i].homename == "")
matchCellText = document.createTextNode(json.data.matchList[i].title);
else
matchCellText = document.createTextNode(json.data.matchList[i].title+ " " + json.data.matchList[i].homename + "VS" + json.data.matchList[i].awayname);
var placeCellText = document.createTextNode(json.data.matchList[i].venuename);
dateCell.appendChild(dateCellText);
sportCell.appendChild(sportCellText);
matchCell.appendChild(matchCellText);
placeCell.appendChild(placeCellText);
}
}
}
}
function CombinationQuery (DateOption,SportOption,PlaceOption)
{
var url = "data//02" + DateOption.substr(8,9) + ".json";
var request = new XMLHttpRequest();
request.open("GET",url);
request.send(null);
request.onload = function()
{
if (request.status == 200)
{
var f = true;
var json = JSON.parse(request.responseText);
var matchData = document.getElementById("match");
for (var i=0;json.data.matchList[i]!=null;i++)
{
if (json.data.matchList[i].itemcodename == SportOption && json.data.matchList[i].venuename == PlaceOption)
{
var row = document.createElement("tr");
var dateCell = document.createElement('td');
var sportCell = document.createElement('td');
var matchCell = document.createElement('td');
var placeCell = document.createElement('td');
var dateCellText = document.createTextNode(json.data.matchList[i].startdatecn);
var sportCellText = document.createTextNode(json.data.matchList[i].itemcodename);
var matchCellText;
if (json.data.matchList[i].homename == "")
matchCellText = document.createTextNode(json.data.matchList[i].title);
else
matchCellText = document.createTextNode(json.data.matchList[i].title+ " " + json.data.matchList[i].homename + "VS" + json.data.matchList[i].awayname);
var placeCellText = document.createTextNode(json.data.matchList[i].venuename);
dateCell.appendChild(dateCellText);
sportCell.appendChild(sportCellText);
matchCell.appendChild(matchCellText);
placeCell.appendChild(placeCellText);
matchData.appendChild(row);
row.appendChild(dateCell);
row.appendChild(sportCell);
row.appendChild(matchCell);
row.appendChild(placeCell);
f = false;
}
}
for(var i=0;i<odiv_length;i++)
{
if(i%4==0)
{
odiv[i].className='f-border';
}
var n=parseInt( i / 4) % 2==0?num++:num--
wheel=odiv_t.offsetHeight/5*n
odiv[i].style.transform='translateY('+wheel+'px)';
(function(i)
{
setTimeout(function()
{
odiv[ln].classList.remove('active');
odiv[i].classList.add('active');
ln = i;
if(i==odiv_length-1)
{
setTimeout(function(){
odiv[i].classList.remove('active');
},500)
}
timeline_box[parseInt(i/4)].style.opacity= 1;
timeline_box[parseInt(i/4)].style.transform='scaleX(1)';
},150*i)
}(i))
}
for(var i=0;i<timelenght;i++)
{
timeline_box[i].index=i;
timeline_box[i].onmouseover=function()
{
timeline_box[this.index].style.transform=this.index%2?'translateY(10px)':'translateY(-10px)'
imgs[this.index].style.transform='rotate(360deg)' ;
}
timeline_box[i].onmouseout=function()
{
timeline_box[this.index].style.transform='translateY(0)';
imgs[this.index].style.transform='rotate(0)' ;
}
}
结对的过程真的没有看起来那么容易,尤其这是我们第一次接触和使用git去共同管理一个项目。在代码的过程中深刻体会到了与对方的沟通是多么重要,有时候因为没有及时沟通,然后一方写完得代码或功能另一方可能不够满意,便要多浪费许多时间。并且在两边同时改代码的时候容易造成代码的冲突。有一次他没有及时拉取我提交的代码,我便拉取了他的代码,导致我写的部分代码没掉了,还好在gitcode的提交记录中可以找回。这让我之后对拉取和提交格外谨慎。总之,结对做项目真是非常锻炼人的过程,虽然项目的难度并不是很大,这个过程中我还是收获了许多,锻炼了代码能力,学会了与他人沟通,熟练掌握了对git等项目管理网站的的使用,也为后面更大更难的团队项目打下了基础。
阅读《构建之法》第四章和完成这次的作业有很多的收获,第一个便是git的使用。从第一次作业对git的懵懂,到后面的担惊受怕,生怕误操作,再到后来的慢慢熟练,不再犹豫。Git的使用虽然不是什么技术,但是一次很好的成长,让我们意识到了软件开发中细节的重要性。这次的作业我们注重在了前端,复习和学习了很多前端的知识,如何布局,如何设计一个好看的界面,为后面的团队项目奠定了基础。结对的过程也愈发的熟练,有了第一次结对和第一次团队协作,再进行结对作业,也比较的熟练,完成的效率比上一次高得多,并且还认识到了结对的更多好处,就是分工可以让工作量不再看起来那么多,遇到问题也能相互想办法,多一个人多一份力。
与zjt的合作过程还算是比较顺利,主要是因为我们比较熟,并且语言表达能力和欲望都是比较强的。因此在沟通的过程中没有太多的矛盾和意外,任务的推进就会比较顺利。他的代码能力虽然不强,但是他比较善于做一些组织和部署,类似项目经理的角色吧,我认为这种合作关系也是比较合理的。
JarenD非常的认真负责,能够十分负责任的完成任务,还帮我解决了很多问题,给这次结对作业带来了极大的活力。他的感染力不仅体现在代码上,还体现在出言献策、解决问题上。我还需要向他多多学习!
网站做的真好看啊!博客做的很详细,针对设计过程展开也很丰富,很用心!
邹欣老师给所有同学的附加问题: 假如有另几个体育盛会 (全运会, 亚运会)需要你们做类似的工作, 你的代码能否快速地部分重构,就能解决新的需求? 还是说必须改写所有的模块? 请问哪些是需要重构的,哪些不用?
答:奖牌总榜和与赛程相关的一些功能是需要重构的;而奖牌地图和部分赛程功能仅需修改传入数据和进行部分调整即可;其他附加功能则需更改内容,代码部分无需过多改动。
卡片设计的项目介绍和冬奥介绍,很赞!每日赛事界面中日期的选择不够友好,背景图有些干扰用户对赛程的查看,建议优化。建议尽量避免大段代码粘贴。