688
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2023年福大-软件工程实践-W班 |
|---|---|
| 这个作业要求在哪里 | 结对第二次作业--编程实现 |
| 结对学号 | 222000132,222000228 |
| 这个作业的目标 | 1.实现原型中的部分功能;2.撰写博客 |
| 其他参考文献 | 《构建之法》 |
| PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 20 | 25 |
| • Estimate | • 估计这个任务需要多少时间 | 20 | 25 |
| Development | 开发 | 1020 | 1530 |
| • Analysis | • 需求分析 (包括学习新技术) | 60 | 120 |
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
| • Design | • 具体设计 | 40 | 60 |
| • Coding | • 具体编码 | 800 | 1200 |
| • Code Review | • 代码复审 | 40 | 40 |
| • Test | • 测试(自我测试,修改代码,提交修改) | 60 | 80 |
| Reporting | 报告 | 175 | 275 |
| • Deploy | • 项目部署 | 100 | 180 |
| • Test Repor | • 测试报告 | 30 | 30 |
| • Size Measurement | • 计算工作量 | 15 | 15 |
| • Postmortem & Process Improvement Plan | • 事后总结 | 30 | 50 |
| 合计 | 1215 | 1830 |
云服务器地址
(2023.4.22过期)
进入首页前的页面,点击即可进入首页浏览

可以选择本网站提供的四个基本栏目,包括选手排名、每日赛况、晋级图以及了解更多。

展示了Singles Aces Leaders的排名,包括Name、Rank、Matches和Aces.

- 展示每一天的赛事,显示比赛类型(女单男单等)、比赛场地、参与选手、比赛时间和比分,且获胜者姓名加粗显示
- 支持通过切换日期查看不同比赛日的赛程,包括从Q1到Day14的赛程

展示比赛的详细成绩,包含本场比赛参赛选手、每个小场比分和获胜选手、最终比赛的获胜选手等比赛数据,包括set1和set2,可按键返回当日赛程

- 可以通过晋级图看到选手的晋升路线,晋级图中要有选手和姓名和比分,并高亮显示晋级选手
- 鼠标移动到某一场比赛时有高亮或显示边框提示
- 可以按返回键直接回到首页

共有四个版块,分别为发展历史、赛地、冠军奖杯和中国选手。其中发展历史的六张图片支持轮播图的形式展出,用户可以自行选择观看的图片或等待其自己播放。







在结对讨论之后,我们决定使用php。因为php能够直接读取JSON文件,还支持嵌入HTML,对于前后端都非常友善。
根据原型设计的样式,采用侧边导航栏,用div块先设计好大致页面布局,根据每块的内容进行排版,导航栏里的选项使用列表的方式进行实现,同时写CSS文件进行界面美化,实现鼠标悬浮到选项上方及选项选中的效果。
在观察澳网选手排名的显示结构后,我们直接将
statistics-name:Aces数组中的数据分为两块,分别是男单和女单来进行显示,对比转换数据后读取其中的full_name(Name)、rank(Rank)、matches(Matches)、value(Aces)。我们在php数组中添加了表格显示,以CSS样式优化后呈现给用户。
一是日期选择,采用按钮组进行实现,因为做不出来原型设计中左右移动箭头显示被遮住的按钮的效果,所以将按钮全部罗列,点击后日期按钮跳转至读取当日赛况的php文件中,并将日期数据作为
id传到php文件中,php根据get的数据进行查询,最后显示赛况界面。
二是将每一个赛况以表格形式呈现,其中获胜方名字字体加粗,并且该单元格背景设置颜色,接下来设置鼠标悬浮高亮效果,以及点击表格进入到详细赛况。
主要是场次选择后下方赛事数据的改变,场次选择采用下拉列表实现,赛事数据通过php读取json文件后以表格形式呈现,下拉列表选中选项后,通过触发事件判断选中内容,设置div块的display的显示隐藏,以此达到切换效果。因为详细赛况数据较多,只使用Day1第一个比赛的详细赛况数据,其它比赛显示与之相同。
这个页面格式排版比较复杂,数据就直接写在代码里,只有
Men’s Singles的晋级图页面,上方下拉列表选择其它选项的时候也是显示相同页面,然后对每个比赛的div块设置鼠标悬浮高亮效果。
在了解更多中,我们提供了四个模块供用户进行观看。分别是发展历史,赛地,冠军奖杯和中国选手。其中赛地,冠军奖杯以及中国选手都图文并茂地向用户讲述了相关方面的知识,而发展历史则采用了轮播图的展示形式,共有六张图片自动播放,并可以让用户自己选择观看某一张图片。
这是新增的一个页面,制作进入首页前的封面,提示用户进入的是关于澳大利亚网球公开赛的网站。
功能结构图:

1、php用于解析选手排名JSON文件的代码,是本次任务中读取数据的代表代码。
通过file_get_contents(文件名)获取数据文件,利用json_decode()将JSON文件转化为php数组,再按照结构逐一剖析所需要的数据。用字符串$content接收输出的数据表格,配合CSS后直接用于页面的数据显示。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<title>首页</title>
<!-- 引入字体图标 -->
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<div class="header">
<img src="pic/navbar.png" alt="图片失效" />
</div>
<div class="nav">
<nav>
<ul class="menus">
<li class="li">
<a href="showIndex.php" class="on">
<i class="fa fa-star-half-full" aria-hidden="true"></i>
选手排名</a>
</li>
<li class="li">
<a href="dailyGame.html">
<i class="fa fa-table" aria-hidden="true"></i>
每日赛程</a>
</li>
<li class="li">
<a href="draws.html">
<i class="fa fa-magnet" aria-hidden="true"></i>
晋级图</a>
</li>
<li class="li">
<a href="knowmore.php">
<i class="fa fa-tags" aria-hidden="true"></i>
了解更多</a>
</li>
</ul>
</nav>
</div>
<div class="content">
<!-- 详细内容部分省略 -->
</div>
<div class="footer">
<p>copyright@2023 Design by <br />222000132 and 222000228</p>
</div>
导航栏中有4个选项,以列表形式排版,设置鼠标悬浮到列表项时的效果和选中列表项的效果:使字体放大。
* {
/* 初始化 */
margin: 0;
padding: 0;
}
body {
/* 100%窗口高度 */
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
/* background-color: #d3dafa; */
background-color: #ffffff;
}
ul {
list-style: none;
}
.container {
position: relative;
width: 100%;
min-height: 100%;
}
.header {
position: fixed;
top: 0;
left: 0;
}
.drawsHeader {
width: 100%;
height: auto;
top: 0px;
left: 0px;
}
img {
left: 0;
top: 0;
width: 100%;
object-fit: cover;
}
nav {
position: fixed;
top: 100px;
left: 0;
width: 200px;
height: 100%;
/* background-color: #8a98c9; */
float: left;
background-color: #0091d2;
}
.content {
position: absolute;
top: 100px;
left: 200px;
background-color: #ffffff;
width: 80%;
}
.drawsContent {
position: absolute;
margin: 0 auto;
top: 150px;
left: 0px;
width: 100%;
background-color: #fff;
}
.footer {
height: 50px;
position: fixed;
bottom: 0px;
left: 10px;
font-size: small;
color: #eae9e8;
}
.menus {
margin: 60px 0;
color: #fff;
}
.li {
letter-spacing: 2px;
font-size: 17px;
font-weight: 600;
padding: 16px 0;
transition: 0.3s;
}
.menus li:hover {
/* background-color: #beb5df; */
background-color: #0091d2;
font-size: x-large;
cursor: pointer;
}
a {
color: #ffffff;
text-decoration: none;
}
.on {
font-size: x-large;
}
.li .fa {
font-size: 20px;
width: 50px;
height: 20px;
text-align: center;
margin-left: 5px;
}
.li ul {
width: 0;
height: 550px;
padding: 50px 0;
/* 绝对定位 */
position: absolute;
top: 0;
right: 0;
overflow: hidden;
/* background-color: #59699b; */
background-color: #0091d2;
transition: 0.3s;
}
.li ul li {
padding: 16px 24px;
white-space: nowrap;
transition: 0.3s;
}
.li:hover ul {
width: 250px;
}
.li ul li:hover {
/* background-color: #828eb9; */
background-color: #0091d2;
}
3、选手排名表格的css代码
通过php获取数据后,以表格的形式展示数据,表格的奇数行和偶数行采用不同颜色显示。
table {
border-collapse: separate;
border-spacing: 0px 10px;
margin: 0 auto;
text-align: center;
}
table td,
table th {
border: 5px #cad9ea;
color: #515151;
height: 30px;
width: 110px;
}
table thead th {
background-color: #CCE8EB;
width: 100px;
}
table tr:nth-child(odd) {
background: #fff;
}
table tr:nth-child(even) {
background: #c7eaf1;
}
4、详细赛况的下拉列表选择场次切换界面的JavaScript代码
通过设置div的diplay属性完成界面的显示及隐藏,以此达到切换效果。
<span class="dropdown2">
<select id="setChoice" onchange="setChange()">
<option value="set2">set2</option>
<option value="set1">set1</option>
</select>
</span>
<script>
function setChange() {
var myselect = document.getElementById('setChoice');
var index = myselect.selectedIndex;
var set = myselect.options[index].value; //选中的值
var divs = document.querySelector('.changebox').querySelectorAll('div');
if (set == "set2") {
divs[0].style.display = 'block';
divs[1].style.display = 'none';
}
if (set == "set1") {
divs[1].style.display = 'block';
divs[0].style.display = 'none';
}
}
</script>
5、了解更多的轮播图播放的JavaScript代码
<script>
// 1. 获取全部图片和按钮
const imgs = document.querySelectorAll('.slider .imgs img');
const btns = document.querySelectorAll('.slider .btns span');
// 2. 设置激活状态
function setActive() {
imgs.forEach(img => img.classList.remove('active'));
btns.forEach(btn => btn.classList.remove('active'));
event.target.classList.add('active');
imgs.forEach(img => {
if (img.dataset.index === event.target.dataset.index) {
img.classList.add('active')
}
})
}
// 3.定义并调用自动播放函数
timer = setInterval((arr) => {
let i = arr.shift();
arr.push(i);
btns[i].dispatchEvent(new Event('click'))
}
, 2000, Object.keys(btns));
//4. 鼠标悬停时自动停止播放
document.querySelector('.slider .imgs').onmouseover = () => clearInterval(timer);
//5. 实现鼠标离开时又自动播放
document.querySelector('.slider .imgs').onmouseout = function () {
timer = setInterval((arr) => {
let i = arr.shift();
arr.push(i);
btns[i].dispatchEvent(new Event('click'))
}
, 2000, Object.keys(btns));
};
</script>
222000228:
一开始在确定好使用哪个web框架后,本以为扒完数据之后就万事大吉了,直到真上手后才发现前端的排版和布局更为棘手,这也是我们之前CSS不够熟练酿下的祸端。之前一直觉得前端比后端容易,现在看来都挺难。不过在经历了本次项目后,我深刻认识到了相互配合的重要性,只有各司其职才能做好一个合格的项目。
222000132:
当看完作业要求时就预感到这次作业不好做,果然预感是正确的,光一个首页选手排名的布局排版就折腾了很久,原型设计时直接拖组件有多快乐,编码就有多难过。界面全靠自己一点点组合起来,确实web知识遗忘了太多,捡得很辛苦。虽然这个过程很艰辛,但是我对最终的效果还是比较有成就感的。最后也有挺多收获,狠狠复习了一把web的知识,学会了怎么用git分支合作,如何部署云服务器等,收获不易,还是要坚持努力。
222000228 to 222000132:
我的结对队友是一个非常刻苦用心的人,这次她负责部署云服务器,钻研了很久,而且为本次项目的页面布局做出了巨大的贡献。她温和友善,容易沟通,做事积极,可谓是非常优秀的队友。
222000132 to 222000228:
我觉得她挺厉害的,学习能力特别强。当我还在研究这个界面布局时,她已经用将下一个界面需要的数据处理好了,效率极快,善于交流,积极配合,完成的任务质量也很不错。
1.晋级图的连线未实现?2.功能较完整,但是界面还可以再优化美观一些