结对第二次作业——编程实现

222200118张宇城 2024-09-30 22:50:40
这个作业属于哪个课程2024软件工程实践
这个作业要求在哪里结对第二次作业——编程实现
结对学号222200118,222200107
这个作业的目标编码实现网页原型
其他参考文献《构建之法》

目录

  • 项目地址
  • PSP表格
  • 成品展示
  • 跳转页面按钮
  • 黑色结尾面板
  • 首页
  • 奖牌榜
  • 每日赛程
  • 对阵图
  • 了解更多
  • 结对讨论过程描述
  • 设计实现过程
  • 代码说明
  • 心路历程和收获
  • 结对队友评价

项目地址

网站地址
华为云仓库地址

PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3030
•Estimate• 估计这个任务需要多少时间3030
Development开发9001200
•Analysis• 需求分析3030
•Learning• 学习新技术600900
•Coding Standard•代码规范2020
• Code• 具体编码600660
• Deploy• 部署服务器60180
Reporting报告6060
• Test Repor• 测试报告3030
• Size Measurement• 计算工作量1010
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2020
合计15952070

成品展示

跳转页面按钮

点击该按钮,会出现可选择的页面,例如首页、奖牌榜等五个选项,点击即可跳转。若没有跳转,再点击一下选择页面会消失。

img

黑色结尾面板

黑色面板放置在结尾,可点击跳转到指定界面

img

首页

首页左上角是跳转按钮;开头会有五张图流转播放,每3s一次;往下移动,会有两个大面板,点击跳转按钮会分别跳转到奖牌榜和每日赛况;再往下移动就是黑色面板的结尾。

img

img

奖牌榜

奖牌榜通过爬虫获得数据存入TotalData.json,然后将获取到数据放存入面板再用for语句进行垂直放置。

img

img

img

每日赛程

当点击日期按钮,会出现可选日期。最后,选择按钮即可跳转到日期的相关赛程。

img

img

对阵图

当鼠标移动到某一场比赛会显示高亮。

img

了解更多

了解更多设置了三个按钮,会分别跳转到三个关于奥林匹克的介绍中,三个界面会有返回键返回至了解更多,同时最底下都配有黑色的面板。

img


img

img

结对讨论过程描述

任务刚发布时就已经开始分工,遇到问题会在qq群讨论

img

一起合作完成作业照片

img

设计实现过程

代码说明

黑色面板代码

<template>
  <div class="parent-container">
    <!-- 使用全局组件 MenuComponent -->
    <MenuComponent />
    <img :src="imagePath" alt="Top Image1" class="top-blue-image" />
    <img :src="imagePath_1" alt="Second Image1" class="second-image" />
    <p class="first-text">顺序&nbsp;&nbsp;&nbsp;NOC</p>

    <div style="margin-left:6%">
      <div v-for="ranking in rankings" :key="ranking.country" class="white-panel">
        <span style="position: absolute;margin-left:6%;font-weight: bold">{{ ranking.rank }}</span>
        <img :src="ranking.qizi" :style="{ 'margin-left': '12%', 'width': '60px' }" />
        <span style="position: absolute;margin-left:20%">{{ ranking.country }}</span>
        <span style="position: absolute;margin-left:57%">{{ ranking.gold }}</span>
        <span style="position: absolute;margin-left:69%">{{ ranking.silver }}</span>
        <span style="position: absolute;margin-left:81%">{{ ranking.bronze }}</span>
        <span style="position: absolute;margin-left:90%;font-weight: bold">{{ ranking.total }}</span>
      </div>
    </div>

    <div class="last-panel">
      <img :src="imgSrc" class="img" />
      <button @click="navigate('FirstPage')">首页</button>
      <button_1 @click="navigate('SecondPage')">奖牌榜</button_1>
      <button_2 @click="navigate('ThirdPage')">每日赛程</button_2>
      <button_3 @click="navigate('LastPage')">了解更多</button_3>
    </div>
  </div>
</template>


<script>
import axios from 'axios';
import imagePath_2 from '@/assets/2.png';
import imagePath from '@/assets/11.jpg';
import imagePath_1 from '@/assets/12.png';

export default {
  data() {
    return {
      imagePath: imagePath,
      imagePath_1: imagePath_1,
      imgSrc: imagePath_2,
      rankings: []
    };
  },
  methods: {
    navigate(pageName) {
      if (this.$route.name!== pageName) {
        this.$router.push({ name: pageName });
      }
    },
  },
  created() {
    axios.get('TotalDate.json')
     .then(response => {
        this.rankings = response.data.rankings;
      });
  },
};
</script>

跳转按钮

<template>
  <div>
    <!-- 圆形按钮 -->
    <div class="floating-button-container">
      <button class="menu-button" @click="showPanel = !showPanel">
        <span class="bar"></span>
        <span class="bar"></span>
        <span class="bar"></span>
      </button>
    </div>
    <!-- 大面板 -->
    <div v-if="showPanel" class="panel" style="position: absolute; top: 90px; left: 40px; z-index: 9999;">
      <!-- 小按钮容器 -->
      <div class="button-group">
        <button class="small-button" style="font-size: 32px;" @click="goToFirstPage">首页</button>
        <button class="small-button" style="font-size: 32px;" @click="goToSecondPage">奖牌榜</button>
        <button class="small-button" style="font-size: 32px;" @click="goToThirdPage">每日赛程</button>
        <button class="small-button" style="font-size: 32px;" @click="goToDuiZhenTu">对阵表</button>
        <button class="small-button" style="font-size: 32px;" @click="goToLastPage">了解更多</button>
    </div>
  </div>
</div>
</template>

<script>
export default {
  data() {
    return {
      showPanel: false // 控制面板显示的数据属性
    };
  },
  methods: {
  goToFirstPage() {
    if (!this.$route.name || this.$route.name!== 'FirstPage') {
      this.$router.push({ name: 'FirstPage' });
    }
  },
  goToSecondPage() {
    if (!this.$route.name || this.$route.name!== 'SecondPage') {
      this.$router.push({ name: 'SecondPage' });
    }
  },
  goToThirdPage() {
    if (!this.$route.name || this.$route.name!== 'ThirdPage') {
      this.$router.push({ name: 'ThirdPage' });
    }
  },
  goToDuiZhenTu() {
    if (!this.$route.name || this.$route.name!== 'DuiZhenTu') {
      this.$router.push({ name: 'DuiZhenTu' });
    }
  },
  goToLastPage() {
    if (!this.$route.name || this.$route.name!== 'LastPage') {
      this.$router.push({ name: 'LastPage' });
    }
  },
}
};
</script>

循环获取数据的代码

<div style="margin-left:6%">
      <div v-for="ranking in rankings" :key="ranking.country" class="white-panel">
        <span style="position: absolute;margin-left:6%;font-weight: bold">{{ ranking.rank }}</span>
        <img :src="ranking.qizi" :style="{ 'margin-left': '12%', 'width': '60px' }" />
        <span style="position: absolute;margin-left:20%">{{ ranking.country }}</span>
        <span style="position: absolute;margin-left:57%">{{ ranking.gold }}</span>
        <span style="position: absolute;margin-left:69%">{{ ranking.silver }}</span>
        <span style="position: absolute;margin-left:81%">{{ ranking.bronze }}</span>
        <span style="position: absolute;margin-left:90%;font-weight: bold">{{ ranking.total }}</span>
      </div>
    </div>

router/index.js,即跳转到js文件

import Vue from 'vue';
import Router from 'vue-router';
import FirstPage from '../components/FirstPage.vue';
import SecondPage from '../components/SecondPage.vue';
import ThirdPage from '../components/ThirdPage.vue';
import LastPage from '../components/LastPage.vue';
import LastPage_1 from '../components/LastPage_1.vue';
import LastPage_2 from '../components/LastPage_2.vue';
import LastPage_3 from '../components/LastPage_3.vue';
import DuiZhenTu from '../components/DuiZhenTu.vue';

Vue.use(Router);

export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'FirstPage',
      component: FirstPage,
    },
    {
      path: '/secondpage',
      name: 'SecondPage',
      component: SecondPage,
    },
    {
      path: '/thirdpage',
      name: 'ThirdPage',
      component: ThirdPage,
    },
    {
      path: '/lastpage',
      name: 'LastPage',
      component: LastPage,
    },
    {
      path: '/lastpage_1',
      name: 'LastPage_1',
      component: LastPage_1,
    },
    {
      path: '/lastpage_2',
      name: 'LastPage_2',
      component: LastPage_2,
    },
    {
      path: '/lastpage_3',
      name: 'LastPage_3',
      component: LastPage_3,
    },
    {
      path: '/duizhentu',
      name: 'DuiZhenTu',
      component: DuiZhenTu,
    },
  ],
});

App.vue(主要的vue文件)

<template>
  <div>
    <!-- <router-link to="/">FirstPage</router-link>
    <router-link to="/secondpage">SecondPage</router-link> -->
    <!-- 使用 router-view 来显示匹配的路由组件 -->
    <router-view></router-view>
  </div>
</template>

<script>
import Vue from 'vue';
import router from './router';
import MenuComponent from './components/MyButton.vue';
import BlackPanel from './components/BlackPanel.vue';
import LastPage_1 from './components/LastPage_1.vue';
import LastPage_2 from './components/LastPage_2.vue';
import LastPage_3 from './components/LastPage_3.vue';

Vue.component('MenuComponent', MenuComponent);
Vue.component('BlackPanel', BlackPanel);
Vue.component('LastPage_1', LastPage_1);
Vue.component('LastPage_2', LastPage_2);
Vue.component('LastPage_3', LastPage_3);

export default {
  name: 'App',
  router, // 使用路由
};
</script>

<style>
/* 全局样式 */
</style>

json文件:

img

对阵图的交互,实现名字一样的会同时亮起

<div class="big-panel" style="top: 800px; left: 240px;">
      <div class="panel" @mouseenter="onMouseEnterPanel1First" @mouseleave="onMouseLeavePanel1First" style="top:5px;">
        <img src="https://gstatic.olympics.com/s1/t_original/static/noc/oly/3x2/180x120/FRA.png" alt="description">
        <span class="text-left" style="font-weight: bold;">法国</span>
        <span class="text-right" style="font-weight: bold;">1</span>
      </div>
      <div class="panel" @mouseenter="onMouseEnterPanel1Second" @mouseleave="onMouseLeavePanel1Second" style="top:60px;">
        <img src="https://olympics.com/OG2024/assets/images/flags/OG2024/ARG.webp" alt="description1">
        <span class="text-left">阿根廷</span>
        <span class="text-right" style="font-weight: bold;">1(5)</span>
      </div>
    </div>
<script>
import imagePath from '@/assets/24.jpg';
import imagePath_1 from '@/assets/25.png';
import imagePath_2 from '@/assets/26.png';
export default {
  data() {
    return {
      imagePath: imagePath,
      imagePath_1: imagePath_1,
      imagePath_2: imagePath_2,
    };
  },
  methods: {
    onMouseEnterPanel1First() {
      this.highlightPanels('法国');
    },
    onMouseLeavePanel1First() {
      this.resetPanels();
    },
    onMouseEnterPanel1Second() {
      this.highlightPanels('阿根廷');
    },
    onMouseLeavePanel1Second() {
      this.resetPanels();
    },
    onMouseEnterPanel2First() {
      this.highlightPanels('埃及');
    },
    onMouseLeavePanel2First() {
      this.resetPanels();
    },
    onMouseEnterPanel2Second() {
      this.highlightPanels('巴拉圭');
    },
    onMouseLeavePanel2Second() {
      this.resetPanels();
    },
    onMouseEnterPanel3First() {
      this.highlightPanels('摩洛哥');
    },
    onMouseLeavePanel3First() {
      this.resetPanels();
    },
    onMouseEnterPanel3Second() {
      this.highlightPanels('美国');
    },
    onMouseLeavePanel3Second() {
      this.resetPanels();
    },
    onMouseEnterPanel4First() {
      this.highlightPanels('日本');
    },
    onMouseLeavePanel4First() {
      this.resetPanels();
    },
    onMouseEnterPanel4Second() {
      this.highlightPanels('西班牙');
    },
    onMouseLeavePanel4Second() {
      this.resetPanels();
    },
    onMouseEnterPanel5First() {
      this.highlightPanels('法国');
    },
    onMouseLeavePanel5First() {
      this.resetPanels();
    },
    onMouseEnterPanel5Second() {
      this.highlightPanels('埃及');
    },
    onMouseLeavePanel5Second() {
      this.resetPanels();
    },
    onMouseEnterPanel6First() {
      this.highlightPanels('摩洛哥');
    },
    onMouseLeavePanel6First() {
      this.resetPanels();
    },
    onMouseEnterPanel6Second() {
      this.highlightPanels('西班牙');
    },
    onMouseLeavePanel6Second() {
      this.resetPanels();
    },
    onMouseEnterPanel7First() {
      this.highlightPanels('法国');
    },
    onMouseLeavePanel7First() {
      this.resetPanels();
    },
    onMouseEnterPanel7Second() {
      this.highlightPanels('西班牙');
    },
    onMouseLeavePanel7Second() {
      this.resetPanels();
    },
    onMouseEnterPanel8First() {
      this.highlightPanels('埃及');
    },
    onMouseLeavePanel8First() {
      this.resetPanels();
    },
    onMouseEnterPanel8Second() {
      this.highlightPanels('摩洛哥');
    },
    onMouseLeavePanel8Second() {
      this.resetPanels();
    },
    highlightPanels(countryName) {
      const panels = document.querySelectorAll('.panel');
      panels.forEach(panel => {
        const country = panel.querySelector('.text-left').textContent;
        if (country === countryName) {
          panel.classList.add('hovered');
          panel.querySelectorAll('.text-left,.text-right').forEach(textElement => {
            textElement.style.color = 'white';
          });
        }
      });
    },
    resetPanels() {
      const panels = document.querySelectorAll('.panel');
      panels.forEach(panel => {
        panel.classList.remove('hovered');
        panel.querySelectorAll('.text-left,.text-right').forEach(textElement => {
          textElement.style.color = 'black';
        });
      });
    },
  },
};
</script>

心路历程和收获

问题①
困难描述:一开始我们结对作业没有进行太过详细的解释,只是简单的分工。到了后面几天发现222200118用的是vue3,222200107用的是vue2,虽然差别不大,但是两人的代码在对方的vscode上都带不动。
解决方法:因为22220107做的内容较多,所以将主要的工具设置为vue2。接着,222200118将vue2的制作流程学会,并转换成功;同时,222200107将他的vue2的全部代码给22220118,因为两者本来差别都不大,都成功运行。
是否解决:是的,虽然刚开始有些不知所措,但通过查阅资料并实践操作,逐渐解决问题。
收获:在分好工后还要确定好团队的制作工具等制作细节。

问题②
困难描述:在设计跳转按钮时,总是会有灰色的大面板在按底下,同时将按钮的vue文件与别的交互时,出现了大范围的错版,当时我们两个都以为是电脑卡了都没在意,直到我们两个人的页面都出现了错版才意识到问题的严重性......
解决方法:style scoped和style的区别!一个是全局的,一个是当前vue的,当时没有注意到这个问题,困扰了我们一天才发现这个问题(感谢chatgtp)
是否解决:解决。
收获:在编程时,一定要在意细节。同时当两个人都出现问题时,一定不是设备的问题,是代码的问题(害得222200107当时改局部ccs改的贼难受),同时,出现问题一定要及时去问别人,结合别人的经验才能更好地解决问题,不要死磕!

问题③
困难描述:有一次一不小心把vscode关闭,当时还没弄好华为云,导致修改好的代码消失,尤其是在搞对阵图的时候一大串的交互消失,最后只能重做。
解决方法:无!只能下次做好的时候记得把修改好的代码传送进华为云中,这样才能保证因为误触导致的代码再修改。
是否解决:无。
收获:一定要记得及时保存代码!一定要及时上传到华为云中!

结对队友评价

222200118 to 222200107:结对过程非常愉快,我们二人可以长短互补。因为已经是第二次的合作了,相互熟悉后效率大大提高。
222200107 to 222200118:非常好队友,使我原地旋转。与熟悉的人一起完成任务是之前没有的体验,我们能再次一起互帮互助,过程愉快。

...全文
24 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
AJAX——新手快车道 前言 AJAX是什么? 首先、AJAX是一种很酷的技术,一旦采用了AJAX,就能让你的Web页面, 你的网站,甚至连同你们公司,都变得很酷。在Web2.0的时代里,不使用一点 AJAX技术的网站,就会显得很老土,很落伍。 但是,这样的理解,其实是很肤浅的。仅仅是从一个外行,从一个使用者的 角度出发,来理解AJAX,就像我在本书的第一章AJAX我也行中那样,开发 出很愚蠢,甚至都没有资格被称之为AJAX应用的纯IE、XMLHTTP应用。 AJAX更酷的一点在于,对于传统的Web开发人员来说,AJAX所运用的, 是更加先进的,更加标准化的,更加和谐高效的,完整的Web开发技术体系。 遵循这样的体系开发Web应用,能让你的开发过程变得更加轻松,也能使你们 的开发团队,显得很酷。在Web2.0 的时代里,还在采用过时的技术来开发 Web,会显得很老土,很落伍。 AJAX的相关组成技术,每一个都已经出现了N年以上了,对这些技术的 组合运用,也远远早于AJAX这个名词出现之前。所以,我真正敬佩的,并非提 出 AJAX这个缩写的Jesse James Garrett。而是那些早在N年以前,就已经在探索、 实践的先行者,他们始终在追求的:是更好的用户体验,以及更好的开发体验。 这样的精神,才是最可宝贵的,也是最值得我们学习的。许多年过去以后,当我 们再回头来看当年的这些热门技术,也许早已经变得老土,变得落伍了。在这样 的历程中,哪些人会成长为高手?会成长为大师呢?就是那些永不满足,永远 在追求更好的用户体验,永远在追求更好的开发体验的人! 新手如何上路 软件开发这个领域,永远都在飞速发展,大家都必须不断的学习新的知识、 技能、框架、IDE、甚至新的语言。传说中的骨灰级高手们,就像传说中的大侠, 任何武器、哪怕是一块木头到了他们手里,也能发挥惊人的威力,人家练了几十 年的看家本领,他们随手使来,也竟然像是打娘胎里就开始练了一样。为什么? 就算不吹那么玄的,平常我们能够碰到的那些老手,在学新东西的时候, 也比那些新手学得更快,理解得更深,运用得更熟练。而新手们呢?往往就会漫 无头绪,焦头烂额,以一副张着茫然的大眼睛的经典表情,出现在各大论坛的 新手求助区里。他们欠缺的,究竟是什么呢?为什么老手学新东西,就没遇到那 么多困难呢? 泛泛地说,自然是经验上的欠缺。仔细地说来,又可以分为三个方面: 一、本质,一种技术与另一种技术之间,往往会有本质上的相通之处,当你 对一种技术的理解与思考越来越深入时,学习一种新技术也会更加容易。触类旁 通,举一反三的能力,就是来自于对于技术本质的追寻。 二、地图,本质上或多或少的相通,也提示着我们技术之间的相互关联,当 你了解的技术越多,了解得越是深入,在你的内心,就能建立起越发清晰的技 术地图。各种知识都有一个自然、合理的位置。那么当一个老手要学习一门新技术 的时候,他其实并非在探索一个全新的、未知的领域,而是有很多脉络可寻,也 很多已知可以帮助他们快速了解未知。 三、技巧,面对同样的未知,面对同样的难题,新手们一筹莫展,而老手们 却掌握着更多的技巧和手段,帮助他们试探可能性、缩小问题的范围、迅速定位 问题、不犯明显愚蠢的错误、甚至能够列举出更具命中力的搜索关键词,而这些 技巧,都帮助老手在前进的道路上,更少跌倒,即使跌倒,也能更快的爬起来。 作为一本写给新手的入门书籍,我们希望展现给读者的,是一个老手如何 学习新技术的过程。我们相信,这样的一个学习过程,对于新手来说,是更具有 价值的。 何谓快车道 必须老老实实的承认,我吹牛了!老手虽然会比新手学习得更快一些,但 是也同样会碰到麻烦,遇到障碍,感觉头痛。如果没有真正的专家的指导,我不 可能如此迅速地将AJAX掌握到目前这样的程度,要真是让我自学三个月,然 后就写出书来的话,那真是在骗钱了。 老手能够快速学习的另一个重要的诀窍是:认识很多牛人朋友 如果没有李锟与赵泽欣的专家级指导与帮助,如果没有与李锟AJAX结对 编程的体验,如果没有三个人在MSN上无数次的长聊,我想要在短期内建立起: 对于AJAX本质的理解; 对于整个AJAX以及相关技术地图的理解; 对于AJAX编程开发所需要的很多技巧、手段的掌握; 几乎是不可能的。 如果没有(N多需要感谢的人)的(N多方面的帮助),我们这本书,也 不可能以现在这样的深度,以(N个月)内完成的速度,送到读者的面前。 希望这本书,能够对大家快速学习AJAX,有所帮助。

110

社区成员

发帖
与我相关
我的任务
社区管理员
  • FZU_SE_teacherW
  • 助教赖晋松
  • D's Honey
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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