echarts 实现签到记录日历组件

news2024/9/21 14:24:57

以下笔记来源:编程导航

分析

有三种基本图表可以选择:

  1. 基础日历图:https://echarts.apache.org/examples/zh/editor.html?c=calendar-simple
  2. 日历热力图:https://echarts.apache.org/examples/zh/editor.html?c=calendar-heatmap

跟上一个图的区别就是鼠标放上去可以展示具体的热力值,热力值越高,图块的颜色越深。

  1. 日历图:https://echarts.apache.org/examples/zh/editor.html?c=calendar-charts

当我们只需要实现签到功能的时候,不涉及热力数值的区分(只有 0 和 1 签到 / 未签到的区别)。

官方生成数据的循环代码如下:

for (let time = date; time <= end; time += dayTime) {
  data.push([
    echarts.time.format(time, '{yyyy}-{MM}-{dd}', false),
    Math.floor(Math.random() * 10000)
  ]);
}

得到的数据是一个二维数组,每个元素表示一个日期和对应的数值(也正是后端需要返回的结构):

[
  ['2017-01-01', 3456],
  ['2017-01-02', 8975],
  ...
]

调整热力值的范围,从而控制颜色深浅。还支持调整颜色:

visualMap: {
  show: false,
    min: 0,
    max: 1,
    inRange: {
    color: ['#efefef', 'lightgreen']  // 颜色从灰色到浅绿色
  },
},

在这里插入图片描述

实现

安装 ECharts:https://echarts.apache.org/zh/index.html

和 React ECharts 可视化库:https://github.com/hustcc/echarts-for-react

npm install --save echarts
npm install --save echarts-for-react

安装失败的话,在命令后加 --force

封装日历图组件:

1)参考 React ECharts 的 官方文档 来使用 ECharts 组件,把 Demo 代码复制到新建的组件文件中。

2)定义签到日期数组变量,将数组转换为图表需要的数据。其中,对日期的处理需要用到 dayjs 库:

tsx
复制代码
// 签到日期列表([1, 200],表示第 1 和第 200 天有签到记录)
const [dataList, setDataList] = useState<number[]>([]);

// 计算图表需要的数据
const year = new Date().getFullYear();
const optionsData = dataList.map((dayOfYear, index) => {
  // 计算日期字符串
  const dateStr = dayjs(`${year}-01-01`)
    .add(dayOfYear - 1, "day")
    .format("YYYY-MM-DD");
  return [dateStr, 1];
});

4)参考 Echarts 的官方 Demo 开发前端日历图:https://echarts.apache.org/examples/zh/editor.html?c=calendar-simple

先在 Demo 页面里调整好效果,得到 options 选项。

💡 小技巧:可以通过配置项或者询问 AI 得到需要的配置

import React, {useEffect, useState} from "react";
import ReactECharts from "echarts-for-react";
import "./index.css";
import dayjs from "dayjs";
import {getUserSignInRecordUsingGet} from "@/api/userController";
import {message} from "antd";

/**
 * 日历图组件
 * @constructor
 */
export default function CalendarChart() {
  // 签到日期列表([1, 200],表示第 1 和第 200 天有签到记录)
  const [dataList, setDataList] = useState<number[]>([1, 200]);

  const fetchDataList =  async  () => {
    try {
      // 请求后端获取数据
      const res = await getUserSignInRecordUsingGet({
        year
      });
      setDataList(res.data);
    } catch (e) {
      message.error(`获取刷题签到记录失败: ${e.message}`);
    }
  }

  useEffect(() => {
    fetchDataList();
  }, []);

  // 计算图表需要的数据
  // 当前年份
  const year = new Date().getFullYear();
  const optionsData = dataList.map((dayOfYear, index) => {
    // 计算日期字符串
    const dateStr = dayjs(`${year}-01-01`)
      .add(dayOfYear - 1, "day")
      .format("YYYY-MM-DD");
    return [dateStr, 1];
  });

  // 图表配置
  const options = {
    visualMap: {
      show: false,
      min: 0,
      max: 1,
      inRange: {
        // 颜色从灰色到浅绿色
        color: ["#efefef", "lightgreen"],
      },
    },
    calendar: {
      range: year,
      left: 20,
      // 单元格自动宽度,高度为 16 像素
      cellSize: ['auto', 16],
      yearLabel: {
        position: "top",
        formatter: `${year} 年刷题记录`,
      }
    },
    series: {
      type: "heatmap",
      coordinateSystem: "calendar",
      data: optionsData,
    },
  };

  return <ReactECharts option={options} />;
}

执行签到:

这里单独封装了一个钩子,因为进入详情页面时才会执行自动签到,而详情页面是在服务端渲染(本项目),获取不到登录态,所以我们需要单独封装一个钩子,在客户端额外发送请求来执行签到。

import { useEffect, useState } from "react";
import { message } from "antd";
import { addUserSignInUsingPost } from "@/api/userController";

/**
 * 添加用户签到记录钩子
 */
const useAddUserSignInRecord = () => {
  const [loading, setLoading] = useState(false);

  // 请求后端执行签到
  const doFetch = async () => {
    setLoading(true);
    try {
      await addUserSignInUsingPost();
    } catch (e) {
      message.error("添加刷题签到记录失败," + e.message);
    } finally {
      setLoading(false);
    }
  };

  useEffect(() => {
    doFetch();
  }, []);

  return { loading };
};

export default useAddUserSignInRecord;

该钩子需要在客户端组件中执行,因为用到了 useEffect 防止重复请求、并且还需要获取到用户登录态。

todo: 签到成功,可以保存到 LocalStorage 等位置,防止每次刷题都重复发送签到请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2113989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos8构建nginx1.27.1+BoringSSL+http3+lua+openresty

需要接入http3&#xff0c;索性最新的nginx在构建一波&#xff0c;趟一遍坑 准备工作 1.环境命令安装 yum install GeoIP -y yum install GeoIP-devel -y yum install libmaxminddb-devel -y yum install -y patch wget zlib zlib-devel lftp gcc gcc-c make openssl-devel p…

YOLOv5: 从0开始搭建环境进行模型训练

视频链接&#xff1a;YOLOv5&#xff1a; 从0开始搭建环境进行模型训练_哔哩哔哩_bilibili 《YOLOv5&#xff1a;从0开始搭建环境进行模型训练》课程致力于帮助学生实战YOLOv5目标检测算法。常心老师将手把手带领大家从0开始搭建YOLOv5环境&#xff0c;带领大家排坑、避坑、填…

windows 环境下搭建mysql cluster 集群详细步骤

1、环境准备 下载mysql集群版本&#xff0c;我这里下载的是mysql-cluster-8.0.39-winx64 https://dev.mysql.com/downloads/cluster/ 2、创建配置文件 mysql集群版本下载以后解压后目录如下&#xff0c;创建配置文件 config.ini(集群配置文件&#xff0c;my.ini mysql配置…

人工智能、机器学习与深度学习的区别及其应用

引言 在过去的十年中,人工智能(AI)从研究实验室走向了工业应用的前沿,成为推动各个行业转型的关键技术。然而,AI 并不仅仅是某一种单一的技术,它包含了多种不同的方法和工具,适用于解决从自动驾驶到医疗诊断等复杂问题。与此同时,行业内对“人工智能”、“机器学习”与…

数据库锁之行级锁、记录锁、间隙锁和临键锁

1. 行级锁 InnoDB 引擎支持行级锁&#xff0c;而MyISAM 引擎不支持行级锁&#xff0c;只支持表级锁。行级锁是基于索引实现的。 对于普通的select语句&#xff0c;是不会加记录锁的&#xff0c;因为它属于快照读&#xff0c;通过在MVCC中的undo log版本链实现。如果要在查询时对…

如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧

如何从硬盘恢复已删除/丢失的文件&#xff1f;本教程将教您如何使用专业硬盘恢复软件从内置或外置硬盘恢复数据&#xff0c;或不使用软件从硬盘恢复已删除的文件。 “有人知道如何从外部硬盘恢复文件吗&#xff1f;当我将外部硬盘插入计算机时&#xff0c;我错误地删除了一些文…

自动提取上升沿周期时间python

import pandas as pd import numpy as np# 读取你的CSV数据&#xff08;假设数据已经加载到 DataFrame df 中&#xff09; # df pd.read_csv(your_data.csv)# 确保保存时间是datetime类型 df[保存时间] pd.to_datetime(df[保存时间])# 假设喂料电机实时转速的列名为 喂料电机…

828华为云征文|基于Flexus云服务器X实例的应用场景-拥有一款自己的ssl监控工具

先看这里 写在前面效果图华为云Flexus云服务器X实例介绍特点可选配置购买 连接服务器Uptime-kuma简介开源信息部署准备工作&#xff1a;docker部署命令访问uptime-kuma 基本配置总结 写在前面 作为一个个人开发者&#xff0c;相信你手里肯定也有不少自己的服务&#xff0c;有的…

【Linux修行路】线程安全和死锁

目录 ⛳️推荐 一、线程安全 1.1 常见的线程不安全情况 1.2 常见的线程安全情况 1.3 常见的不可重入情况 1.4 常见可重入的情况 1.5 可重入与线程安全的联系 1.6 可重入与线程安全的区别 二、死锁 2.1 死锁的四个必要条件 2.2 如何避免产生死锁&#xff1f; ⛳️推荐…

Mysql高级教程

1.安装部署 安装依赖性&#xff1a; [rootmysql-node10 ~]# dnf install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el7_4.x86_64.rpm rpcgen.x86_64 下载并解压源码包 [rootmysql-node10 ~]# tar zxf mysql-boost-5.7.44.tar.gz [rootmysql-no…

SpringSecurity原理解析(一)

一、SpringSecurity 核心组件 在SpringSecurity中的jar包有4个&#xff0c;作用分别为&#xff1a; spring-security-coreSpringSecurity的核心jar包&#xff0c;认证和授权的核心代码都在这里面spring-security-config如果使用Spring Security XML名称空间进行配置或Spring S…

营业执照贷款揭秘,不只是有证那么简单!

聊到营业执照贷款&#xff0c;不少人误以为手里有证就能秒到账&#xff0c;这其实是个误区。正经说&#xff0c;这是经营性贷款&#xff0c;放款速度可不是“一刀切”。快的话&#xff0c;一天搞定&#xff1b;慢的呢&#xff0c;三五天到半个月不等&#xff0c;全看你的条件和…

materail3 CircularProgressIndicator和LinearProgressIndicator有难看的白块和断点

看看&#xff0c;就是这个垃圾效果&#xff1a; 圆圈的进度条有断点&#xff0c;不连接&#xff1b; 横线进度条&#xff0c;有尾部亮色&#xff0c;进度处又有分割。 它的原出处在这里&#xff1a;https://m3.material.io/components/progress-indicators/overview&#xff0…

CSP-J基础之cmath常见函数

文章目录 前言1. **sin 函数**2. **cos 函数**3. **exp 函数**4. **log 函数**5. **fabs 函数**6. **pow 函数**7. **sqrt 函数**8. **ceil 函数**9. **floor 函数** 总结 前言 在计算机科学与编程中&#xff0c;数学函数是解决各种计算问题的基础工具。C标准库中的 cmath 头文…

【Qt】处理键盘事件

处理键盘事件 要想获取到用户的键盘按键&#xff0c;在之前的学习中使用过QShortCut&#xff0c;这个函数是信号槽机制封装过获取键盘按键的方式&#xff0c;站在更底层的角度&#xff0c;也可以通过事件获取到当前用户键盘按下的情况。 Qt 中的按键事件是通过 QKeyEvent 类来实…

【Nacos】负载均衡

生产环境相对是比较恶劣的,我们需要对服务的流量进行更加精细的控制.Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等. 1. 服务下线 当某一个节点上接口的性能较差时,我们可以第一时间对该节点进行下线. 操作步骤: 服务详情 ->下线 当点击下线后&#xff0c;…

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候&#xff0c;发现很多博客在onTimer(event: (utc: number, elapsedTime: number) > void) 这里提到elapsedTime&#xff1a;计时器经过的时间&#xff0c;单位为毫秒。我不清楚是否为版本问题。 在我查看ver…

Linux 进程创建

进程串 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> int main(){int p1,p2,p3,p4;while((p1fork())-1);if(p10){printf("child %d parent %d\n",getpid(),getppid());while((p2fork())-1);if(p20)…

[C++#33][异常] 错误码 | 抛出与捕获 | 异常安全 | 异常体系

目录 C语言与C错误处理方式的对比及应用 一、C语言传统的错误处理方式 1. 终止程序&#xff1a;assert 2. 返回错误码 缺点&#xff1a; 二、C中的异常处理机制 1. 基本概念 2. 异常的抛出与捕获 3. 异常的重新抛出 三、C中的异常安全 1. 构造函数与析构函数的异常 …

数字图像噪声常用的概率分布

高斯、瑞利、指数、埃尔朗分布都是指数家族分布。 注&#xff1a;冈萨雷斯的四版都是错的。 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码