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

222100417_余承烨 2024-03-26 13:02:54

[闲散贤咸人的博客]

作业基本信息

这个作业属于哪个课程软件工程实践-2023学年-W班
这个作业要求在哪里结对第二次作业——编程实现
结对学号222100417,222100420
这个作业的目标<将上一次结对作业所做的模型进行具体实现>
其他参考文献

目录

  • [闲散贤咸人的博客]
  • 作业基本信息
  • 一、Gitcode仓库地址和代码规范链接
  • 二、PSP表格
  • 三、展示成品
  • 四、结对讨论过程描述
  • 讨论截图
  • 五、设计实现过程
  • 前端
  • 后端
  • 功能结构图
  • 六、主要代码说明
  • 前端
  • 后端
  • 七、遇到的困难
  • 前端
  • 后端
  • 八、心路历程与收获
  • 陈佳伟
  • 余承烨
  • 九、评价结对队友
  • 陈佳伟对余承烨的评价:
  • 余承烨对陈佳伟的评价

一、Gitcode仓库地址和代码规范链接

我的GitCode代码仓库
成品链接
代码规范链接

二、PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6060
• Estimate• 估计这个任务需要多少时间3030
Development开发17001900
• Analysis• 需求分析(包括学习新技术)600800
• Design Spec• 生成设计文档2030
• Design Review• 设计复审2025
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)3035
• Design• 具体设计7080
• Coding• 具体编码700750
• Code Review• 代码复审6060
• Test• 测试(自我测试,修改代码,提交修改)120120
Reporting报告4055
• Test Repor• 测试报告2015
• Size Measurement• 计算工作量1010
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划2030
合计19002015

三、展示成品

我们设计了主页,详细界面,每日赛程,排名,奖牌榜这些主要界面,并对每个页面都设置了页眉导航栏。主页存在去往其他主要界面的连接;运动员界面提供了所有选手的信息;每日赛程中含有比赛日期、比赛项目等信息,可以切换日期查看不同赛程,并可通过点击某一赛程前往该赛程的信息界面;详细赛程界面中含有选手信息以及比赛结果;排名界面我们提供了不同的比赛项目,点击比赛项目会展开该赛程的比赛结果;更多界面展示了该赛事的一些介绍等等。

  • 主页
    主页导航栏HOME字标变色,以图片的形式显示去往其他界面的连接。

  • 选手信息
    该页面展示参赛的各个选手的信息,如国籍(Country)、运动员姓名(Athlete)、性别(Gender)、出生日期(DOB)等。

  • 选手排名
    选手排名主界面,主页导航栏RESULT字标变色,展示有结果的一些赛程,点击某一赛程框,展开改赛程的排名情况。点击其中某一个赛程便可看到排名情况,初始数据为最早的一次比赛数据,点击不同的赛次显示不同的比赛结果。

  • 每日赛程
    每日赛程主界面,按日期对各赛程进行分类,可以在中间的下拉列表内选择所需的日期进行查看当天的赛程,也可以选择ALL显示近期的所有赛程,点击某一个赛程可以进入该赛程的详细界面。

  • 详细赛况
    点击SHEDULES界面的某一赛程显示出详细赛况。其中显示本场比赛参赛选手(Athlete)、选手排名(Overall Rank)、比赛积分(Ponits)、落后积分(Pts Behind)等信息。

  • 奖牌榜
    该页面展示参赛的各个国家的获奖情况,显示各个国家分别获得的金牌数量,银牌数量,铜牌数量以及总的奖牌数,并按照一定的规则进行排名。

  • 更多
    主页导航栏MORE字标变色,展示该赛事的介绍等等。


四、结对讨论过程描述

刚拿到题目后,简单和队友讨论了一下我们要用的前端后端框架和开发工具,因为222100420同学学过后端Spring Boot开发,所以就由其负责后端开发以及云服务器的部署,222100417负责前端开发以及博客的书写。
我们遇到过前后端接口问题,为此我们专门去向一些有经验的前辈请教,并查看了一些相关文档,统一了接口问题,并且因为使用了接口,整个开发过程前后端联调的时候异常顺利。

讨论截图

image.png

运动员.png


五、设计实现过程

前端

前端采用Vue框架,搭载路由router,并在results界面使用element库进行折叠面板的编写。因为项目中主要框架基本类似,故在components专门设置pages包存放主框架,后在views设置各个界面的视图(如HomeView.vue),并设置不同界面的Main组件,通过props传参以及条件渲染来进行不同界面的展示功能。后将访问后端的接口路由放置到main.js,以便于修改。

后端

后端采用Spring Boot框架,并使用maven构建项目并管理依赖。因为项目中用到大量实体类,常量,因此将其分为三个模块。分别是server模块,用来处理请求返回请求,pojo模块,用来存实体类,common模块,用来存json文件路径。server模块分为controller包,service包和config包。controller包负责接收请求并使用@ResponseBody封装并返回数据。service包主要负责业务逻辑实现,从文件中读取数据。并返回给controller。config包负责一些配置

功能结构图

功能结构图.png


六、主要代码说明

前端

一、axios
用axios来想后端发送GET请求,backendRouter是作为声明在main.js里的全局变量,用于设置访问后端的URL

const backendRouter = inject('backendRouter');

  onMounted(() => {
      // 发送GET请求
      axios.get(backendRouter.url + '/daily/list?date=all')
      .then(response => {
          // response.data 就是上面的JSON数组
          datas.value = response.data.data;
          dates.value = datas.value.map(function(obj) {
              return obj.date;
          });
          dates.value.unshift("ALL")
      })
  });

二、el-collapse折叠面板
用element库中的el-collapse组件来设置折叠面板,当点击某个比赛面板时展开与比赛面板标题相对应的内容,并显示有几个按钮,点击按钮可以切换该比赛的不同赛段。

<el-collapse v-model="activeNames" accordion>
    <el-collapse-item v-for="match in matches" :key="match.eventName" :title="match.eventName" :name="match.eventName" >
          <div>
              <div class="buttons">
                  <button v-for="pName in types" :key="pName" @click="changeDetial(pName)"
                   :style="{backgroundColor: pName === phaseName ? 'gray' : 'white' , width: '20%', height: '40px',
                       border: '1px solid grey', borderRadius: '3px'
                      }">
                      {{ pName }}
                  </button>
              </div>
              <div >
                  <div class="title">
                      <span style="width: 15%; text-align: center;">Overall Rank</span>
                      <span style="width: 30%; text-align: center;">Country</span>
                      <span style="width: 35%; text-align: left;">Athlete</span>
                      <span style="width: 10%; text-align: center;">Age</span>
                      <span style="width: 10%; text-align: center;">Points</span>
                  </div>
                  <hr class="hrr" style="height: 3px;"/>

                  <div v-for="detial in detials" :key="detial.overallRank" 
                  :style="{ backgroundColor: detial.overallRank % 2 === 0 ? 'white' : 'rgba(128, 128, 128, 0.2)' }" class="item">
                      <span style="width: 15%; text-align: center;">{{ detial.overallRank }}</span>
                      <span style="width: 15%; text-align: right; padding-right: 8px">
                          <img :src="'/images/img-flag/' + detial.country + '.png'" style="width: 30px;" />
                      </span>
                      <span style="width: 15%; text-align: left;">{{ detial.country }}</span>
                      <span style="width: 35%; text-align: left; color: black; ">
                          <div v-for="athlete in detial.athletes" :key="athlete.athleteName">{{ athlete.athleteName }}</div>
                      </span>
                      <span style="width: 10%; text-align: center;">
                          <div v-for="athlete in detial.athletes" :key="athlete.athleteName">{{ athlete.age }}</div>    
                      </span>
                      <span style="width: 10%; text-align: center;">{{ detial.totalPoints }}</span>
                  </div>
              </div>
          </div>
    </el-collapse-item>
  </el-collapse>
watch(activeNames, () => { 
      /* console.log(activeNames.value) */
      if(activeNames.value !== "" ){
          /* console.log(activeNames.value) */
          // 发送GET请求
      axios.get(backendRouter.url +'/rank/detail?eventName=' + activeNames.value )
          .then(response => { 
              // response.data 就是上面的JSON数组Message: {{ msg }}
              datas.value = response.data.data;
              types.value = types.value.filter((t) => t === '')
              datas.value.forEach(element => {
                  types.value.push(element.phaseName);
              });
              phaseName.value = types.value[types.value.length - 1];
              datas.value.forEach(element => {
                  if(element.phaseName === phaseName.value){
                      detials.value = element.eventRanks;
                  }
              });
          })
      } 
  })

三、下拉列表显示,选择不同选项进行切换日期
设有一个下拉列表,选择不同选项可以进行切换日期,下面的内容改变为当天的比赛日程。使用router-link标签使其可以点击某个比赛日程,可以通过路由跳转到相应的detials界面

<div class="title">
      <select v-model="selectedDate" class="select" style="margin-right: 20px;">
          <option v-for="date in dates" :value="date" class="select">{{ date }}</option>
      </select>
  </div>
  <hr class="hrr" style="height: 3px;"/>

  <div v-for="data in showDatas" :key="data.date" style="width: 95%; margin: 0 auto;">
      <p class="date">{{ data.date }}</p>
      <router-link v-for="match in data.events" :key="match.eventTime" :to="{ name:'details', params: { name: match.eventName, type: match.eventPhase } }" class="routerlinktext">
          <div  class="routerlink">
              <div class="vertical-line" style="background-color: #0D4FAD;height: 30px; width: 3px;"></div>
              <span style="width: 15%; text-align: center;">{{ match.eventTime }}</span>
              <div class="vertical-line"></div>
              <span style="width: 40%; text-align: right; font-size: 20px;">{{ match.eventName }}</span>
              <span style="width: 3%;"></span>
              <span style="width: 20%; text-align: left; color: gray; font-size: 20px;">{{ match.eventPhase }}</span>
              <span style="width: 20%; text-align: right; color: #BEBEBE;">{{ "ENTER DETAIL →" }}</span>
          </div>
      </router-link>
  </div>  
watch(selectedDate, () => {
      if (selectedDate.value === "ALL") {
          showDatas.value = props.datas;
      } else {
          showDatas.value = props.datas.filter(item => selectedDate.value === item.date);
      }
  })

后端

一、Swagger
因为前后端同时进行开发时,不能使用前端来发送请求,而每次想检验请求是否能正确返回参数就得在网站输入,非常的麻烦与不便,使用Swagger他就会自动根据接口来生成请求,还会保存请求参数,非常方便快捷

Swagger.png

二、统一返回结果代码
因为每个界面要求的数据不一样,如果直接返回的话,结果会非常杂乱,不利于前端的使用和维护,统一封装到Result对象中返回,其中code表示成功与否,1为成功,其他数字为失败,msg表示失败的原因,data是返回给前端的数据。

Result.png

三、跨域
前后端联调时发现前端请求后端数据返回的状态是200,但并未接收到数据,去查询了许多人,发现是前端运行的端口号与后端运行端口号不一致导致的,但是修改端口号以后也会遇到很多问题,故此在后端写了跨域的代码,以此允许前端获得数据

跨域.png


七、遇到的困难

前端

  1. 问题:第一次使用组合式vue,对很多属性不熟悉
    解决:使用原web知识,再配合vue的官方文档进行学习
  2. 问题:不同路由之间不知如何传输多个参数
    解决:在router/index.js文件中对每个路由设置name属性,使其能够通过name属性转接,再通过params将所需要传输的多个数据进行封装,最后通过:to="{ name:'details', params: { name: match.eventName, type: match.eventPhase } }"语句将参数通过props传输给另外一个路由
  3. 问题:el-collapse的标题格式无法改变
    解决:由于el-collapse对其class进行的绑定,以至于无法在使用时,之间通过其class属性修改标题格式,我查阅资料,最终使用:deep(.el-collapse-item__header)来进行对header格式的修改。

后端

  1. 问题:在服务器运行后端程序时,一直运行不起来
    解决:通过查看java版本,发现服务器java环境没有配置,配置Java环境,运行,发现端口冲突,修改运行端口,运行成功
  2. 问题:后端程序在运行无法处理请求
    解决:通过nphup.out,查看报错原因,未检测到json文件,查看代码,后端设计时把路径写死,无法访问到打包在jar包里的json数据,修改读取路径,成功读取并返回

八、心路历程与收获

陈佳伟

在完成本次作业前,对使用git合作,拉代码还是一知半解,经过本次合作后,不仅对git命令的使用,还是项目的管理,分模块,都有了更深刻的理解。对已经学习的技术进行进一步的实践加深了对知识的理解。

余承烨

在本次作业前,对vue框架几乎不会,所有前端界面代码的编写都是先学的。经过本次项目后对vue框架的结构有了较深的了解,对大组件分化为小组件,以及各种组件的组合,访问和管理有了更加深刻的理解,进一步理解前端页面的布置。

九、评价结对队友

陈佳伟对余承烨的评价:

余承烨是一个非常善于发现自身不足并改进,同时也善于发挥自身优势来推动工作进展的好搭档,在本次结对作业的过程中多次发现问题,并和我积极讨论解决方案,和他合作让我感觉很有动力,因为我们总是在不断改善,不断进步。

余承烨对陈佳伟的评价

陈佳伟展现了高水平的专业知识和技能,并且善于沟通,有效传达清晰的想法和解决问题,愿意分享知识和技能,为设计的成功贡献了强大的力量,他展现出来高度的可靠性和责任感,是一位优秀的合作伙伴。

...全文
327 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
助教鲍仁俊 2024-03-27
  • 打赏
  • 举报
回复

前端的目录链接进行了设计,赞!布局上考虑了手机端的用户,值得肯定。但是没有实现页面的自适应。参赛选手的头像没有渲染上去。

助教邓雨红 2024-03-27
  • 打赏
  • 举报
回复

前端页面布局不够美观,网页宽度不够,观感差,可以考虑做一下自适应布局,还有网页可以做成中文的,这样也方便国内的用户使用。

FZU_SE_teacherW 教师 2024-03-27
  • 打赏
  • 举报
回复

日期选择实现的不错,赞!
设计过程的前后端文字描述结合设计图会更直观;

助教张宇梦 助教 2024-03-27
  • 打赏
  • 举报
回复

主页面内容和导航栏完全重复了,改善的话可以添加一些统计信息的部分或者资讯,起到统领或介绍的效果

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,有所帮助。

310

社区成员

发帖
与我相关
我的任务
社区描述
福州大学的软件工程实践-2023学年-W班
软件工程需求分析结对编程 高校 福建省·福州市
社区管理员
  • FZU_SE_teacherW
  • Pity·Monster
  • 助教张富源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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