142
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2022年福大-软件工程;软件工程实践-W班 |
|---|---|
| 这个作业要求在哪里 | 作业要求 |
| 这个作业的目标 | 实现结对作业一原型设计对应的网页 |
| 结对学号 | 021900521 221900214 |
| 其他参考文献 | 见博客末尾 |
PairProject of 021900521_221900214
the Olympic Winter Games Being 2022
| PSP | Personal Software Process Stages | 预估消耗时间(分钟) | 实际消耗时间(分钟) |
|---|---|---|---|
| 计划 | Planning | ||
| •估计这个任务需要多久 | •Estimate | 10 | 12 |
| 开发 | Development | ||
| •需求分析 | •Analysis | 10 | 15 |
| •制定代码规范 | •Deciding Code Style | 15 | 20 |
| •素材获取 | •Material acquisition | 20 | 40 |
| •复习Yii框架及php语法 | •Previous Improving | 60 | 90 |
| •编写代码 | •Coding | 1200 | 1700 |
| •完善及改进 | •Improve and perfect | 220 | 400 |
| •撰写报告 | •Reporting | 60 | 75 |
| •计算工作量 | •Workload calculation | 5 | 7 |
| •总结 | •Summary | 20 | 30 |
| 总计 | 1620 | 2389 |
与预期的时间相比,实际付出的时间还是比较多的,并且其实编码时间还要近似的乘二。分析个中原因主要是因为我们两人都对使用Yii框架编写网页的方式有错估,并且对php的语法也不够熟悉,在编码进行到一半的时候才意识到Yii主要依赖引入Widget来编写网站,依靠自带的Widget其实能呈现的效果非常有限,但是我们两人的php版本都是php5,在win11上要降级composer又非常的困难,这两者版本的不兼容造成了我们无法轻易引入widget,所以在编写赛程和地图板块时走了很多弯路。总之就是php的基础较为薄弱,对yii2.0框架的运用也不够熟悉,造成了这次项目浪费了较多的时间。
网站分为四部分:奖牌地图、奖牌榜、赛程赛况、关于冬奥

奖牌地图包含世界上所有国家,对于有获奖的国家进行涂色,并按照总奖牌数量多少填涂颜色深浅。

鼠标移动悬停到有颜色国家时,会进行高亮,并且会显示国家英文名和中文名,以及金牌数,银牌数,铜牌数,还有总数。

奖牌总榜默认按照排名顺序显示各地区奖牌状况,并进行分页显示
主要包括
排名 国家简称 国旗 国家名 奖牌数 金牌数 银牌数 铜牌数

并且可以点击 排名 国家简称 国旗 国家名 奖牌数 金牌数 银牌数 铜牌数按钮
按照对应的选项排序,例如按照总奖牌数排序

可以并且可以在 排名 国家简称 国旗 国家名 奖牌数 金牌数 银牌数 铜牌数下的输入框进行相关信息搜索,并且可以组合搜索
例如搜索自己想了解的国家

赛程默认按照时间顺序显示比赛,并进行分页显示
主要包括

可以进行组合查询搜索

有各届冬奥了解链接以及吉祥物,底部有冬奥风采轮播图
点击对应超链接了解冬奥详情

有些讨论比如实现工具方法面对面讨论了就没法截图了



因为两个人比较熟了,其它聊天记录口嗨比较多就不截了。

前端页面大体设计思路和原型设计时相差无几,并利用Gii生成的CRUD模型来进行页面与数据的交互。

其中schedule为赛程表,存储赛程信息。total存储奖牌榜信息,migration为系统自动生成的保存版本信息的表,表中字段如下图所示。


我们利用GII生成相应模型类,以及对应模型搜索类,还有基本控制类,以及基本view文件
项目结构

奖牌地图部分引入highchart,得到初步的奖牌地图,
关键代码


设计思路
对于访问index.php?r=total/index的链接
会由TotalController下的 actionIndex()进行接收请求以及传dataProvider数据以及请求参数容器searchModel给view以渲染视图
public function actionIndex()
{
$searchModel = new TotalSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
view目录下total目录下的index.php文件
利用yii自带GridView小部件用于在网格中显示数据。网格表的列根据 yii\grid\Column 类进行配置,并且会根据$searchModel进行搜索相关数据并进行显示
并且利用
'rowOptions'=>function($model){
if ($model->countryid == 'CHN')
{
aa();
return ['style'=>'color:red;'];
}
else if (aa() % 2 == 0)
return ['style'=>'color:white;'];
else
return ['style'=>'color:#0036a0;'];
},
将奇数行显示蓝色,偶数行显示白色,并且另外将中国这行高亮显示红色
关键代码
<img src="https://p4.img.cctvpic.com/photoAlbum/page/performance/img/2022/2/20/1645366824272_174.jpg" height="600" width="1150" />
<div class="total-index">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'rank:text:排名',
'countryid:text:国家简称',
[
'label' => '国旗',
"format"=>'raw',
'value' => function($model) {
return Html::img("https://p1.img.cctvpic.com/sports/data/olympic/teamImg/".$model->countryid.".png",["width"=>"80","height"=>"80"]);
},
],
'countryname:text:国家名',
'count:text:奖牌数',
'gold:text:金牌数',
'silver:text:银牌数',
'bronze:text:铜牌数',
],
'rowOptions'=>function($model){
if ($model->countryid == 'CHN')
{
aa();
return ['style'=>'color:red;'];
}
else if (aa() % 2 == 0)
return ['style'=>'color:white;'];
else
return ['style'=>'color:#0036a0;'];
},
]); ?>
</div>
利用yii2.0的gridView小部件,引入dataProvider和filterModel,编写shedule和scheduleSearch类的逻辑,实现赛程显示,模糊搜索,组合查询等功能。
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
// ['class' => 'yii\grid\SerialColumn'],
['attribute'=>'startdatecn',
'label'=>'时间',
'filter'=>\common\models\Schedule::getDate(),
],
['attribute'=>'itemcodename',
'label'=>'大项',
'filter' =>\common\models\Schedule::findBySql("select distinct itemcodename from schedule")
->indexBy('itemcodename')
->column(),
],
['attribute'=>'title',
'label'=> '比赛',
'value' => function ($query=array()) {
if ($query->homename != null)
return "{$query->title} {$query->homename} VS {$query->awayname}";
return $query->title;
},
'filter' =>\common\models\Schedule::findBySql("select distinct title from schedule")
->indexBy('title')
->column(),
],
['attribute'=>'venuename',
'label'=> '场馆',
'filter' =>\common\models\Schedule::findBySql("select distinct venuename from schedule")
->indexBy('venuename')
->column(),
],
],
]); ?>
ScheduleSearch的Search方法
public function search($params)
{
$query = Schedule::find();
// add conditions that should always apply here
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
if (!$this->validate()) {
// $query->where('0=1');
return $dataProvider;
}
// grid filtering conditions
$query->andFilterWhere([
'startdatecn' => $this->startdatecn,
]);
$query->andFilterWhere(['like', 'id', $this->id])
->andFilterWhere(['like', 'itemcodename', $this->itemcodename])
->andFilterWhere(['like', 'title', $this->title])
->andFilterWhere(['like', 'venuename', $this->venuename])
->andFilterWhere(['like', 'homename', $this->homename])
->andFilterWhere(['like', 'awayname', $this->awayname])
->andFilterWhere(['like', 'homescore', $this->homescore])
->andFilterWhere(['like', 'awayscore', $this->awayscore]);
return $dataProvider;
}
Schedule类的getData方法
public static function getDate(){
$dates = Schedule::find()
->select(['DATE_FORMAT(startdatecn,"%d日%H:%i")'])
//->select("startdatecn")
->from('schedule')
->distinct()
->indexBy("startdatecn")
->orderBy(['startdatecn' => SORT_ASC])
->column();
return $dates;
}
这个页面其实就与php没什么关系了,基本可以说是纯html/css页面
<!-- 其中一个简介的样式-->
<button class="date0">
<img class="data_logo0" src="../../image/2022panda.png" height="100px" width="100px"/>
<div class="introduction0">
<div class="introduction_title0" >
<a href="https://baike.baidu.com/item/2022%E5%B9%B4%E5%8C%97%E4%BA%AC%E5%86%AC%E5%AD%A3%E5%A5%A5%E8%BF%90%E4%BC%9A/12061628?fromtitle=2022%E5%86%AC%E5%A5%A5%E4%BC%9A&fromid=22749318&fr=aladdin" target="_blank">2022北京冬奥会</a>
</div>
<div class="introduction_img0">
<a href="https://baike.baidu.com/item/2022%E5%B9%B4%E5%8C%97%E4%BA%AC%E5%86%AC%E5%AD%A3%E5%A5%A5%E8%BF%90%E4%BC%9A/12061628?fromtitle=2022%E5%86%AC%E5%A5%A5%E4%BC%9A&fromid=22749318&fr=aladdin" target="_blank">第24届冬季奥林匹克运动会(XXIV Olympic Winter Games),简称2022年北京冬季奥运会,是由中国举办的国际性奥林匹克赛事,于2022年2月4日开幕,2月20日闭幕。2022年北京冬季奥运会共设7个大项,15个分项,109个小项。</a>
</div>
</div>
</button>
<!--轮播图的css及html代码-->
<style type="text/css">
/*标题样式*/
p{
text-align: center;
font-size: 25px;
color: cadetblue;
font-family: fantasy;
}
.imgBox{
border-top: 2px solid cadetblue;
width: 80%;
height: 500px;
margin: 0 auto;
}
.imgBox img{
width: 80%;
height: 500px;
margin: 0 auto;
padding-top: 30px;
}
.img1{
display: block;
}
.img2{
display: none;
}
.img3{
display: none;
}
</style>
<p>冬奥风采</p>
<div class="imgBox">
<img class="img-slide img1" src="https://p2.img.cctvpic.com/photoAlbum/page/performance/img/2022/2/21/1645421982313_521.jpg" alt="1">
<img class="img-slide img2" src="https://p2.img.cctvpic.com/photoAlbum/page/performance/img/2022/2/21/1645416176196_372.jpg" alt="2">
<img class="img-slide img3" src="https://p5.img.cctvpic.com/photoAlbum/page/performance/img/2022/2/20/1645368874877_875.jpg" alt="3">
</div>
林俊杰评何震东:动手能力强,善于沟通交流,愿意主动分担任务,能很好得运用以往的项目经验,对新的知识上手很快,总之是靠谱的成年男性。
何震东评林俊杰:思路清晰,对于解决问题总有自己的一些小妙招,面对看似麻烦的问题总能转变思路以更简单更好的效果呈现,总能规划好项目,按照计划执行,有条不紊。
总体功能完成得比较全面!
如果背景色和表格可以做一些配色设计的话会更美观些。