Skip to content

学海无涯

作者:江月迟迟
发表于:2024-12-10
字数统计:1339 字
预计阅读5分钟

介绍

小蓝最近一直在云课平台学习,为了更好的督促自己,于是将每天的学习时间都记录了下来,但是如何更加直观的显示学习时间让小蓝很是苦恼。本题需要你使用 ECharts 帮助小蓝实现统计学习时间图表。

准备

本题已经内置了初始代码,打开实验环境,目录结构如下:

txt
├── css
│   └── style.css
├── data.json
├── index.html
└── js
    ├── axios.min.js
    └── echarts.min.js

其中:

  • index.html 是主页面。
  • js/echarts.min.js 是 ECharts 文件。
  • js/axios.min.js 是 axios 文件。
  • css/style.css 是样式文件。
  • data.json 是学习时长数据。

选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。

接着,打开环境右侧的【Web 服务】,就可以在浏览器中看到如下效果:

图片描述

目标

请完成 index.html 文件中的 TODO 部分。

  1. 完成数据请求(数据来源 ./data.json),data.json 中存放的数据为对应月份中小蓝每天的学习时长,单位为分钟(在项目目录下已经提供了 axios,考生可自行选择是否使用)。
  2. 页面加载完成后,默认显示周统计数据。点击周和月,x 轴对应显示正确的周数(格式为:"x 月 x 周")和月份,Y 轴显示小蓝对应周和对应月学习的总时长

完成后,最终页面效果如下:

图片描述

规定

  • 请勿修改 js/echarts.min.js 文件中的任何内容。
  • 请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径等,以免造成无法判题通过。

判分标准

  • 完成数据请求,得 5 分。
  • 初始化数据显示正确,得 5 分。
  • 点击周和月切换后,数据显示正确,得 5 分。

总通过次数: 902 | 总提交次数: 1069 | 通过率: 84.4%

难度: 中等 标签: 2022, 省模拟赛, Web 前端, ECharts

题解

js
<!DOCTYPE html>
<html lang="zh-CN" style="height: 100%">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>学海无涯</title>
    <!-- <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@5.3.3/dist/echarts.min.js"></script> -->
    <script src="./js/echarts.min.js"></script>
    <link rel="stylesheet" href="./css/style.css" />
    <script src="./js/axios.min.js"></script>
  </head>

  <body style="height: 100%; margin: 0">
    <!-- tab 栏 -->
    <div class="container">
      <div class="tabs">
        <input type="radio" id="week" name="tabs" checked />
        <label class="tab" for="week">周</label>
        <input type="radio" id="month" name="tabs" />
        <label class="tab" for="month">月</label>
        <span class="glider"></span>
      </div>
    </div>
    <div
      id="container"
      style="width: 80%; height: 80%; margin: 40px auto 0"
    ></div>
    <script type="text/javascript">
      
      let objData
      let weekaXais = []
      let weekData = []
      let monthXais = []
      let monthData = []
      let xAxisData = []
      let seriesData = []
      // TODO:待补充代码
      fetch('./data.json', {method: 'get'}).then(res => res.json()).then(data => {
        objData = data.data
        for(let key in objData) {
          let count = 1
          let len = objData[key].length % 7 === 0 ? objData[key].length / 7 : Math.floor(objData[key].length / 7) + 1
          let weekDataChunk = []
          let weekAxaisChunk = []
          weekDataChunk.length = len
          weekDataChunk = new Array(len).fill(0)
          for(let i = 0; i < objData[key].length; i++) {
            weekDataChunk[Math.floor(i / 7)] += objData[key][i]
          }
          weekData.push(...weekDataChunk)
          for(let i = 0; i < len; i++) weekAxaisChunk.push(`${key}第${i + 1}周`)
          weekaXais.push(...weekAxaisChunk)

          monthXais.push(key)
          monthData.push(objData[key].reduce((a,b) => a + b))
        }
        console.log(weekData);
        console.log(weekaXais);
        console.log(monthXais);
        console.log(monthData);

        xAxisData = weekaXais
        seriesData = weekData

        var dom = document.getElementById("container");
      var myChart = echarts.init(dom, null, {
        renderer: "canvas",
        useDirtyRect: false,
      });
      var option;
      option = {
        title: {
          text: "学习时长统计图",
        },
        legend: {},
        xAxis: {
          // x 轴数据
          type: "category",
          data: xAxisData,
        },
        yAxis: {
          type: "value",
          name: "分钟",
          axisLabel: {
            formatter: "{value}",
          },
        },
        series: [
          // y 轴数据
          {
            data: seriesData,
            type: "bar",
          },
        ],
      };
      if (option && typeof option === "object") {
        // 设置图表
        myChart.setOption(option);
      }
      window.addEventListener("resize", myChart.resize);
      })
      const weekBtn = document.getElementById('week')
      const monthBtn = document.getElementById('month')
      weekBtn.addEventListener('click', () => {
        console.log('1');
        if (weekBtn.checked) {
          xAxisData = weekaXais
          seriesData = weekData
          var dom = document.getElementById("container");
      var myChart = echarts.init(dom, null, {
        renderer: "canvas",
        useDirtyRect: false,
      });
          var option;
      option = {
        title: {
          text: "学习时长统计图",
        },
        legend: {},
        xAxis: {
          // x 轴数据
          type: "category",
          data: xAxisData,
        },
        yAxis: {
          type: "value",
          name: "分钟",
          axisLabel: {
            formatter: "{value}",
          },
        },
        series: [
          // y 轴数据
          {
            data: seriesData,
            type: "bar",
          },
        ],
      };
      if (option && typeof option === "object") {
        // 设置图表
        myChart.setOption(option);
      }
      window.addEventListener("resize", myChart.resize);
        }
      })
      monthBtn.addEventListener('click', () => {
        console.log('2');
        if (monthBtn.checked) {
          xAxisData = monthXais
          seriesData = monthData
          var dom = document.getElementById("container");
      var myChart = echarts.init(dom, null, {
        renderer: "canvas",
        useDirtyRect: false,
      });
          var option;
      option = {
        title: {
          text: "学习时长统计图",
        },
        legend: {},
        xAxis: {
          // x 轴数据
          type: "category",
          data: xAxisData,
        },
        yAxis: {
          type: "value",
          name: "分钟",
          axisLabel: {
            formatter: "{value}",
          },
        },
        series: [
          // y 轴数据
          {
            data: seriesData,
            type: "bar",
          },
        ],
      };
      if (option && typeof option === "object") {
        // 设置图表
        myChart.setOption(option);
      }
      window.addEventListener("resize", myChart.resize);
        }
      })
    </script>
  </body>
</html>