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

222200234马思敏 2024-09-30 23:46:56
这个作业属于哪个课程2401_CS_SE_FZU
这个作业要求在哪里结对第二次作业——编程实现
结对学号222200234 222200404
这个作业的目标基于Web技术的原型结对实现,项目部署
其他参考文献《构建之法》

目录

  • 1、项目地址
  • 1.1 git仓库链接
  • 1.2 代码规范链接
  • 1.3 部署链接
  • 2、PSP表格
  • 3、成品展示
  • 3.1 首页
  • 3.2 奖牌榜
  • 3.3 每日赛程
  • 3.4 比赛详情
  • 3.4.1 赛程详情
  • 3.4.2 出赛名单
  • 3.4.3 比赛过程详情
  • 3.5 对阵图
  • 3.6 了解更多
  • 4、结对讨论过程
  • 4.1 结对讨论截图
  • 4.2 结对过程描述
  • 5、设计实现过程
  • 5.1 功能结构图
  • 5.2 分析阶段
  • 5.3 设计阶段
  • 5.4 实现阶段
  • 5.5 遇到的问题及解决方式
  • 6、关键代码及思路
  • 6.1 后端
  • 爬取每日赛程数据
  • 加工出赛名单数据
  • 6.2前端
  • 赛程详情的滚动实现
  • 对阵图—国家高亮显示
  • 7、心路历程和收获
  • 8、评价结对队友

1、项目地址

1.1 git仓库链接

git仓库链接

1.2 代码规范链接

codestyle

1.3 部署链接

http://1.94.207.111:8801/#/home

2、PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时 (分钟)
Planning计划6040
• Estimate• 估计这个任务需要多少时间6040
Development开发26502940
• Analysis• 需求分析(包括学习新技术)420480
• Design Spec• 生成设计文档3030
• Design Review• 设计复审6040
• Coding Standard• 代码规范(为目前的开发制定合适的规范)6030
• Design• 具体设计400420
• Coding• 具体编码12001400
• Code Review• 代码复审240240
• Test• 测试(自我测试,修改代码,提交修改)240300
Reporting报告240300
• Test Report• 测试报告120180
• Size Measurement• 计算工作量2020
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划100100
合计29503280

3、成品展示

3.1 首页

首页采取自己实现的轮播图展示奥运会标志性图片。导航栏提供奖牌榜、每日赛程、了解更多的入口。

在这里插入图片描述

3.2 奖牌榜

奖牌榜界面完成对奖牌的排名,展示各国所获金牌、银牌、铜牌的数量及总数。可滚动查看。

请添加图片描述

3.3 每日赛程

设有日期下拉框,滚动并点击日期,实现日期切换功能,查询该日期的赛程信息;

请添加图片描述

点击具体赛程信息,可查看具体比赛详情。(3.4)

请添加图片描述

3.4 比赛详情

3.4.1 赛程详情

可进行组别的切换来查看不同组别赛程

请添加图片描述

3.4.2 出赛名单

展示此场比赛双方国家出赛运动员名单,位置等信息

请添加图片描述

3.4.3 比赛过程详情

展示了具体比赛过程的情况,可通过点击分别查看上下半场的详情。
再次点击即可收起上下半场详细信息。

在这里插入图片描述

3.5 对阵图

通过比赛详情中部导航栏,分别选择查看男子足球对阵图或女子足球对阵图。

在这里插入图片描述

3.6 了解更多

向用户科普了一些奥运知识,如巴黎奥运会举办背景、吉祥物及会徽。
添加了相应的超链接以便用户了解更多。

在这里插入图片描述

4、结对讨论过程

4.1 结对讨论截图

在这里插入图片描述


请添加图片描述


在这里插入图片描述

4.2 结对过程描述

拿到题目后,首先通过讨论,确定具体技术路线。我们采用Vue作为前端的主要框架,Python作为后端(爬取数据同时传输数据)进行开发。接着由刘嘉榕同学起型,开始搭建项目框架,以及配置好各种需要用到的环境和依赖和必要的函数,并配置好git仓库,便于后续协作。

再往后我们采用线上+线下的方式进行开发协作。分工协作部分主要体现在不同页面的内容和博客撰写,其中马思敏同学负责首页轮播、奖牌榜、对阵图部分界面设计和博客主要内容的撰写;刘嘉榕同学负责每日赛程,初赛名单,了解更多界面设计,后端,对接,部署和博客界面展示、思路过程等撰写。

主要遇到的问题为数据问题,我们爬取相应的数据,后端处理后返回给前端;这部分需要极大的耐心和细心进行分析。虽然过程比较艰辛,但是总体的合作讨论紧密高效,较高质量完成作业任务。

5、设计实现过程

5.1 功能结构图

在这里插入图片描述

5.2 分析阶段

在项目的初始分析阶段,明确了系统需要满足的功能要求:主要展示奥运会相关的信息,包括奖牌榜、每日赛程和详细赛程。因此,首先需要获取相应的数据,然后需要处理大量的数据文件,并动态加载不同日期或赛事的详细信息。

5.3 设计阶段

项目的设计围绕Vue 框架展开,遵循组件化和模块化的设计思想。系统的每个功能模块(如奖牌榜、对阵图)都设计为独立的Vue组件,以便于维护和扩展。
关键设计点:

  1. 组件化设计:系统的功能模块,如奖牌榜、每日赛程、详细赛程和对阵图,均设计为独立的Vue组件。这种设计不仅提高了代码的组织性,也便于未来的维护和扩展。

  2. 组件复用:为了提高开发效率和减少代码冗余,我们对Nav导航栏和banner每日赛程展示框等在多个页面中重复使用的组件进行了提取和封装。这样的复用策略不仅简化了开发流程,也使得界面的一致性得到了保障。

  3. 动态数据加载:利用Vue的watch特性,我们实现了对日期变化的监听,从而动态加载相应日期的赛程信息。这种即时渲染机制确保了用户界面能够根据用户的选择快速响应,提升了用户体验。

  4. Vuex状态管理:为了更好地管理全局状态,我们采用了Vuex。通过Vuex,我们能够集中管理和保存全局状态,如当前活跃页面(activePage)和奖牌榜(medals)。activePage有助于跟踪和管理用户的导航路径,而medals则在首次从后端获取数据后存储起来,避免了不必要的重复请求,提高了应用的性能。

    5.4 实现阶段

    为了满足用户对巴黎奥运会比赛结果的查询需求,我们计划开发一个高效、直观的前后端分离Web应用。以下是项目的详细规划:

技术栈

  • 前端:使用Vue.js框架构建用户界面和交互,提供动态和响应式的用户体验。
  • 后端:采用Python语言配合Tornado框架开发RESTful API,确保服务的高性能和异步处理能力。
  • 数据爬取:利用Selenium和Requests库进行数据爬取,以模拟用户行为和发送HTTP请求。
  • 数据处理:通过Pandas库进行数据处理,确保数据的准确性和可用性。
  • 数据交互:使用Axios和WebSocket技术在前后端之间实时传递数据。

功能特点:

  • 奖牌榜展示:用户可以查看实时更新的奖牌榜,了解各国在奥运会上的表现。
  • 特定日期比赛结果查询:用户可以通过选择日期来查询特定日期的比赛结果。
  • 数据准确性:通过自动化爬虫定期更新数据,结合人工审核机制,确保数据的准确性。:利用Selenium和Requests库进行数据爬取,以模拟用户行为和发送HTTP请求。

    5.5 遇到的问题及解决方式

  • 问题:由于CSS样式冲突,导致布局错乱

解决方式:使用浏览器的开发者工具检查元素,找出导致布局问题的CSS规则,并进行相应的调整。使用媒体查询和灵活的布局模式(如Flexbox或Grid)来实现响应式设计。

  • 问题:动态网页的数据加载通常依赖于JavaScript,这可能导致爬虫无法一次性获取所有数据,或者数据加载速度慢。

解决方式:使用像Selenium这样的工具来模拟浏览器行为,以便能够执行JavaScript并获取动态生成的内容。 对于数据加载慢的问题,可以在爬虫中设置适当的等待时间,或者使用异步加载技术来优化数据获取过程。
考虑使用API(如果可用)来获取数据,这通常比爬取网页更可靠、更高效。

  • 问题:git无法将本地仓库的更改推送到远程仓库

解决方式:未得到解决,已使用git remote -v命令查看远程仓库的地址正确,且有足够的权限将更改推送到远程仓库。但在git push时出现错误。尝试了多种方法,都无法解决问题。

6、关键代码及思路

6.1 后端

爬取每日赛程数据

这个页面数据都是动态加载的,所以处理相当复杂

def scroll_down(driver, distance):
    # 执行 JavaScript 滚动操作,滚动距离是 distance
    driver.execute_script(f"window.scrollBy(0, {distance});")
    # 等待几秒,确保内容加载
    time.sleep(3)


# 创建一个空列表来存储格式化后的数据
formatted_data = []

# 获取当前页面的高度
last_height = driver.execute_script("return document.body.scrollHeight")
scroll_distance = last_height // 6  # 每次滚动页面的 1/6 高度
container = driver.find_element_by_class_name("ribbon-bg-container")
print(container)
items = driver.find_elements_by_tag_name("a")
cards = []
for item in items:
    card = {}
    head = item.find_element_by_class_name("score-header").text.strip()
    countries_ele = item.find_elements_by_class_name("score-line  d-flex flex-row  ")
    countries = []
    for country in countries_ele:
        countries.append( country.text.strip())
    footer = item.find_element_by_class_name("card-footer").text.strip()
    card["head"] = head
    card["countries"] = countries
    card['footer'] = footer
    cards.append(card)
    print(card)

加工出赛名单数据

使用正则表达式匹配

def get_player(country1, country2):
    import re

    # 初始化一个空列表来存储解析后的事件

    events = []
    up_events = []
    down_events = []
    # 读取文件
    filename = "./data/" + country1 + "&" + country2 + ".txt"
    with open(filename, 'r', encoding='utf-8') as file:
        # 初始化变量
        event = {}
        time = None
        scores = []
        countries = []
        players = []
        situations = []
        real_time = None
        for line in file:
            line = line.strip()

            # 检查时间行
            if line.startswith('上半场') or line.startswith('上半场结束'):
                continue
            if line.startswith('比赛开始'):
                up_events = events
                events = []
                continue
            if line.startswith('下半场') or line.startswith('比赛'):
                continue
            if line.startswith('下半场开始'):
                down_events = events
                events = []
            if re.match(r"(\d+\'\s*\+\d*)|(\d+\')", line) or re.match(r"(\d+-\d+)", line):
                if time is None:
                    # 保存上一个事件
                    if countries and players and situations:
                        event["time"] = real_time
                        event["scores"] = scores
                        event["countries"] = countries
                        event["players"] = players
                        event["situations"] = situations
                        events.append(event)
                        # 初始化新事件
                        event = {}
                        time = None
                        scores = []
                        countries = []
                        players = []
                        situations = []
                    time = line
                else:
                    time += line
            else:
                if time:
                    real_time = time
                time = None
                if line.isdigit():
                    scores.append(int(line))
                elif line:
                    player_match = re.match(r'(\w+\s\w+)', line)
                    if player_match:
                        players.append(player_match.group(1))
                        continue
                    situation_match = re.match(
                        r"(犯规|被犯规|射门|被守门员扑救|黄牌|换人|越位|点球射门|核查是否判罚点球|未犯规|有可能犯规|射门未中|角球|直接任意球(射门)|未中|助攻)",
                        line)
                    if situation_match:
                        situations.append(situation_match.group(1))
                        continue
                    country_match = re.match(r'(\w+)', line)
                    if country_match:
                        countries.append(country_match.group(1))
                        continue
    for up in up_events:
        print(up)
    for down in down_events:
        print(down)
    return up_events, down_events

6.2前端

赛程详情的滚动实现

methods: {
        showEvent(group){  
            this.activeGroup = group;
        },
        scrollLeft() {
            if (this.scrollPosition > 0) {
              console.log(this.scrollPosition)
            this.scrollPosition -= 0.05; // 根据实际的间隙调整步长
            }
        },
        scrollRight() {
            if (this.scrollPosition < this.events[this.groups.indexOf(this.activeGroup)].length - 1) {
            this.scrollPosition += 0.05;
            }
        },
    }

对阵图—国家高亮显示


 <div class="pk-box" style="position: absolute; top: 50px; left: 125px;">
     <div class="pk-item" v-bind:class="{ highlighted: highlightedCountry === '法国' }"
         @mouseover="highlightCountry('法国')" @mouseleave="highlightCountry(null)">
         <img src="..\assets\images\法国.png">
         <span class="winner">法国</span>
         <span>1</span>
     </div>
</div>

  data() {
      return {
          highlightedCountry: null
      }
  },
  methods: {
      highlightCountry(countryName) {
          this.highlightedCountry = countryName;
      }
  },


.pk-item.highlighted {
    background-color: #8EB1E3;
    padding: 5px;
    /* 可以添加其他样式,如背景色、阴影等 */
}

7、心路历程和收获

  • 222200234: 在项目开始之前,我对前端开发并不熟悉。因此,我通过在线教程、B站和社区论坛等,了解并初步学习了基础的HTML、CSS、JavaScript和Vue框架。在实践中,我遇到了布局错乱、样式冲突等问题,但通过不断尝试和调整,我逐渐熟悉了前端开发的流程,技巧。除此之外,协作让我认识到了团队合作的重要性。我们相互之间的沟通和协作,使得整个项目能够更加顺利地推进。

  • 222200404: 在这次项目中,我最初认为,尽管界面不多,但带领团队应该是游刃有余的。然而,数据处理方面的挑战远远超出了我的预期,这让我深刻意识到自己的不足和需要提升的空间。这次经历不仅让我认识到了自己在技术深度上的欠缺,也激发了我进一步学习的动力。通过这次实践,我重温了服务器部署的流程,并且对Python的Tornado框架有了更深入的掌握。同时,我也加深了对爬虫技术的理解,并且在前端布局设计方面获得了更为深刻的认识。在这个过程中,我学会了耐心,尤其是在处理复杂的数据时。此外,我也体会到了团队合作的重要性,同伴的支持和帮助在面对挑战时显得尤为宝贵。

    8、评价结对队友

  • 222200234 to 222200404
    由于我之前未曾涉足实际前端开发工作,嘉榕同学给予了我极大的帮助。他不仅耐心地解答了我众多的疑问,还协助我解决了诸多我自身难以克服的难题。此外,他的积极主动性体现在与我沟通细节上,这无疑确保了作业的顺利完成。

  • 222200404 to 2222004234
    尽管思敏同学刚开始没有太多基础,但她展现出了极强的学习意愿和勤奋精神。她不仅认真学习新知识,还严格按照我的指导行动,为我提供了实质性的帮助。她的努力和贡献是项目完成不可或缺的一部分。

...全文
140 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 Altium Designer 18是一款功能丰富的电子设计自动化工具,其集成了电路原理图绘制、PCB布局规划、三维视图展示、电路仿真分析以及生产文件生成等多项核心功能,为电子工程师们提供了一个全面的硬件设计解决方案。该软件的官方中文指导材料系统地阐述了从项目初始阶段到最终完成的全过程操作方法。 在“AD18 官方中文指导材料”中,使用者可以掌握以下核心内容要点: 1. **系统配置与界面认知**:熟悉Altium Designer 18的工作平台,涵盖菜单选项、工具栏配置、工作区域安排,以及个性化工作界面的设定方法。 2. **项目创建流程**:掌握如何建立新的项目工程,包括工程参数配置、项目模板选取,以及项目文件的添加操作。 3. **电路图绘制技术**:学习电路原理图的绘制流程,包括元件库的维护管理、元件放置技巧、连接线路绘制、属性编辑操作,以及网络表的自动生成方法。 4. **元件库构建与管理**:了解如何建立自定义元件库,执行元件的导入与导出任务,以及利用Altium Designer自带的元件资源库。 5. **PCB布局设计方法**:掌握PCB设计的基本准则,如元件布局策略、布线技巧、层叠结构调整、布线规则优化,以及冲突检测与短路处理技术。 6. **设计规范与约束条件**:理解设定设计规范和电气约束条件的关键性,包括间距参数设定、焊盘尺寸规格、过孔尺寸要求等,以及运用规则检查进行设计验证的流程。 7. **三维模型整合应用**:学习如何将三维模型与PCB设计内容相结合,以实现更为直观的机械配合验证。 8. **电路性能仿真技术**:掌握使用Altium Des...
源码链接: https://pan.quark.cn/s/a4b39357ea24 ### 接口测试知识要点说明 #### 一、接口测试的定义及分类 1. **概念阐释**: - 接口测试作为软件测试的关键环节,主要对系统之间的交互点进行验证。 - 它旨在核实接口的正确性、稳定性和功能性,保障各个系统组件能够依照预期执行交互操作。 2. **实施情境**: - 适用于多系统联合开发的环境。 - 适用于包含多个子系统的复杂应用系统开发过程。 3. **适用范围**: - 为其他系统提供支持的底层基础架构系统。 - 负责协调中心服务的系统架构。 4. **分类标准**: - **模块接口测试**:通常作为单元测试的一部分,适用于独立构建的功能模块。 - **Web接口测试**: - **服务端接口测试**:针对客户端与服务器端之间的接口进行验证。 - **外部接口测试**:对第三方提供的接口进行测试,例如支付平台提供的授权登录接口。 5. **测试角度**: - **接口功能验证**:核实接口功能是否满足预期要求。 - **接口性能评估**:衡量接口的处理能力及响应时间。 - **接口稳定性考察**:检测接口在长时间运行中的表现情况。 - **接口安全检测**:确保接口能够抵御非法访问或数据篡改。 6. **测试手法**: - **参数细致测试**:深入测试接口的输入参数和输出结果。 - **场景模拟测试**:依据实际业务场景进行测试验证。 #### 二、接口测试的详细流程 1. **测试规划**: - 明确测试范围、目标及所需资源。 - 规划测试策略,选择适宜的工具和技术手段。 2. **测试用例设计**: - 依据需求文档和接口规格文档设计测试用例。 - 覆...
内容概要:本文研究基于遗传算法(GA)与粒子群算法(PSO)相结合的无人机三维路径规划方法,旨在解决无人机在复杂三维环境中避障与路径优化的关键问题。通过构建包含障碍物、威胁区域等约束的三维仿真环境,系统实现了GA与PSO两种智能优化算法的Matlab代码,并对其在路径规划中的性能进行全面对比分析,重点关注路径长度、飞行安全性、算法收敛速度等核心指标。研究充分利用GA的全局搜索能力与PSO的快速局部收敛特性,提出一种混合优化策略,有效克服单一算法易陷入局部最优或收敛缓慢的缺陷。文中不仅详细阐述了算法的设计流程、数学模型与实现细节,还提供了完整的仿真结果,验证了所提混合方法在复杂动态场景下的优越性、有效性和鲁棒性,为无人机自主导航提供了可靠的理论依据和技术方案。; 适合人群:具备一定Matlab编程基础和优化算法理论知识,从事无人机系统设计、智能控制、路径规划、人工智能应用等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市峡谷、山区、灾害救援等复杂三维环境中的无人机自主避障与最优任务路径规划;②为智能优化算法(GA、PSO及其混合策略)的学习、性能对比与工程化应用提供详实的实践案例和代码参考;③服务于高校科研教学、算法原型快速复现、以及在此基础上的进一步改进与创新研究。; 阅读建议:建议读者结合所提供的Matlab代码进行仿真运行与调试,深入理解两种算法的参数设置、适应度函数设计及路径生成机制,可通过修改环境地图、增加动态障碍物或调整优化目标函数等方式进行扩展性研究,以深化对算法本质和应用场景的理解。
内容概要:LTK8870S是一款单通道H桥有刷直流电机驱动器,支持6.5V至20V工作电压,具备3.0A峰值电流驱动能力,适用于打印机、家用电器及工业设备等机电一体化应用。该芯片采用PWM控制接口,可通过IN1和IN2逻辑输入实现电机正转、反转、滑行与制动等多种工作模式,并支持快衰减和慢衰减两种电流衰减方式以优化电机控制性能。器件集成电流调节功能,通过VREF引脚和外部检测电阻设定限流值,有效控制电机电流并降低系统功耗。同时具备低功耗休眠模式,在IN1和IN2均为低电平时自动进入,显著节省能耗。LTK8870S还集成了多重保护机制,包括VM欠压锁定(UVLO)、过温保护(TSD)、过流保护(OCP)及自动故障恢复功能,提升系统可靠性。其ESOP-8封装带裸露焊盘,利于散热,符合无铅环保标准。; 适合人群:电子硬件工程师、电机控制系统开发者、嵌入式系统设计人员,尤其适用于从事电机驱动电路设计的中级技术人员。; 使用场景及目标:①用于控制中小型有刷直流电机的正反转与调速;②应用于需要电流限制和节能休眠功能的电池供电设备;③作为工业自动化、智能家电或办公设备中的核心驱动模块;④帮助开发者理解H桥驱动、PWM调速、电流衰减模式及保护电路的设计原理。; 阅读建议:此资源技术细节丰富,建议结合典型应用电路图与电气参数表进行硬件设计参考,重点关注PWM控制逻辑、电流调节设置及保护机制的实现方式,并在实际应用中配合示波器调试输出波形与电流响应。

113

社区成员

发帖
与我相关
我的任务
社区描述
202401_CS_SE_FZU
软件工程 高校
社区管理员
  • FZU_SE_TeacherL
  • 助教_林日臻
  • 防震水泥
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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