使用 React 实现自定义数据展示日历组件

目录

    • 背景
    • 实现
      • 日历组件
      • 父组件
      • 数据
    • 效果
    • 最后

背景

项目中需要实现一个日历组件,并且需要展示月,日所对应的数据(因为项目需求问题,就不统计年数据总量)。网上找了一堆,基本都不大符合项目需求,且改动麻烦(方便以后项目新需求改动),另外很少做这种需求,所以好奇心下,决定自己单独写一个组件。

实现

日历组件

import { useEffect, useState } from 'react';
import {LeftOutlined,RightOutlined,DoubleLeftOutlined,DoubleRightOutlined,CalendarOutlined,} from '@ant-design/icons';

import './index.less';

const weekData = ['一', '二', '三', '四', '五', '六', '日'];

const CustomDatePickerModalPage = (props: any) => {
  const { title, dataSource, onChange } = props;

  // 公共获取当前日期
  const publicGetCurrentDateFn = () => {
    const date = new Date();
    const Y = date.getFullYear();
    const M = date.getMonth() + 1;
    const D = date.getDate();
    return {
      Y,
      M,
      D,
    };
  };

  // 获取年基础年份
  const publicGetBaseYear = (YEAR: number) => {
    const yearToStr = YEAR.toString();
    const prefixYearToStr = yearToStr.slice(0, -1);
    return Number(prefixYearToStr + '0');
  };

  const [datePickerState, setDatePickerState] = useState<string>('day');

  // 展示年
  const [yearArry, setYearArry] = useState<any[]>([]);
  const [baseYear, setBaseYear] = useState<number>(() => {
    const { Y } = publicGetCurrentDateFn();
    return publicGetBaseYear(Y);
  });

  // 展示月
  const [monthArry, setMonthArry] = useState<any[]>([]);
  const [baseMonth, setBaseMonth] = useState<number>(() => {
    const { M } = publicGetCurrentDateFn();
    return M;
  });

  // 展示当前月,上个月末尾及下个月开头日期
  const [monthDay, setMonthDay] = useState<any[]>([]);

  // 设置当前年
  const [currentYear, setCurrentYear] = useState<number>(() => {
    const { Y } = publicGetCurrentDateFn();
    return Y;
  });
  
  // 设置当前月份
  const [currentMonth, setCurrentMonth] = useState<number>(() => {
    const { M } = publicGetCurrentDateFn();
    return M;
  });
  
  // 设置当前时间
  const [currentDay, setCurrentDay] = useState<number>(() => {
    const { D } = publicGetCurrentDateFn();
    return D;
  });

  // 公共获取时间
  const publicGetDateFn = (TYPE: string = 'day',YEAR: number,MONTH: number): any => {
    const monthDayCount = 42;
    let prefixMonthDay: number[] = [];
    let currentMonthDay: number[] = [];
    let suffixMonthDay: number[] = [];

    prefixMonthDay.length = 0;
    currentMonthDay.length = 0;
    suffixMonthDay.length = 0;

    switch (TYPE) {
      case 'year':
        // 根据基准年计算10年间年度区间
        const initYearNum: number = publicGetBaseYear(YEAR);
        const prefixYearNum: number = initYearNum - 1;
        const currentYearNum: number[] = [];
        for (let i = 0; i < 10; i++) {
          currentYearNum.push(initYearNum + i);
        }
        const LastCurrentYearNum: number =
          currentYearNum[currentYearNum.length - 1] + 1;
        const computedAllYear: number[] = [
          prefixYearNum,
          ...currentYearNum,
          LastCurrentYearNum,
        ];
        return computedAllYear;
      case 'month':
        // 一年固定12个月
        const monthArry: { month: number; year: number }[] = [];
        for (let i = 0; i < 12; i++) {
          monthArry.push({ month: i + 1, year: YEAR });
        }
        return monthArry;
      case 'day':
        const step: Date = new Date(YEAR, MONTH, 0);
        const monthDayLen: number = step.getDate();
        const monthOneToWeek: number = new Date(`${YEAR}-${MONTH}-1`).getDay();

        if (monthOneToWeek === 1) {
          // 星期一
          // 当前月份天数
          for (let i = 0; i < monthDayLen; i++) {
            currentMonthDay.push(i + 1);
          }

          // 下个月天数
          for (let i = 0; i < monthDayCount - monthDayLen; i++) {
            suffixMonthDay.push(i + 1);
          }
        } else {
          // 星期二到星期日

          // 获取上个月的总天数
          const step = new Date(YEAR, MONTH - 1, 0);
          const prefixMonthDayLen = step.getDate();

          // 上个月展示天数
          const prefixNum = monthOneToWeek === 0 ? 6 : monthOneToWeek - 1;
          const prefixDayNum = prefixMonthDayLen - prefixNum;
          for (let i = prefixDayNum; i < prefixMonthDayLen; i++) {
            prefixMonthDay.push(i + 1);
          }

          // 当前月份展示天数
          for (let i = 0; i < monthDayLen; i++) {
            currentMonthDay.push(i + 1);
          }

          // 下个月展示天数
          for (let i = 0; i < monthDayCount - monthDayLen - prefixNum; i++) {
            suffixMonthDay.push(i + 1);
          }
        }

        const formatPrefixMonthDay: {
          type: string;
          day: number;
          month: number;
          year: number;
        }[] = [];
        const formatCurrentMonthDay: {
          type: string;
          day: number;
          month: number;
          year: number;
        }[] = [];
        const formatSuffixMonthDay: {
          type: string;
          day: number;
          month: number;
          year: number;
        }[] = [];

        prefixMonthDay?.length > 0 &&
          prefixMonthDay.forEach((item: number) =>
            formatPrefixMonthDay.push({
              type: 'up',
              day: item,
              month: MONTH,
              year: YEAR,
            }),
          );
        currentMonthDay?.length > 0 &&
          currentMonthDay.forEach((item: number) =>
            formatCurrentMonthDay.push({
              type: 'current',
              day: item,
              month: MONTH,
              year: YEAR,
            }),
          );
        suffixMonthDay?.length > 0 &&
          suffixMonthDay.forEach((item: number) =>
            formatSuffixMonthDay.push({
              type: 'lower',
              day: item,
              month: MONTH,
              year: YEAR,
            }),
          );

        const computedAllMonthDay: {
          type: string;
          day: number;
          month: number;
          year: number;
        }[] = [
          ...formatPrefixMonthDay,
          ...formatCurrentMonthDay,
          ...formatSuffixMonthDay,
        ];

        return computedAllMonthDay;
    }
  };

  // 展示年份
  const handleYearFn = (
    type: string,
    value: number = publicGetCurrentDateFn()['Y'],
  ) => {
    if (type === '1') {
      setDatePickerState('year');
      if (currentYear === baseYear) {
        const data = publicGetDateFn('year', baseYear, currentMonth);
        setYearArry(data);
      } else {
        const data = publicGetDateFn('year', baseYear, currentMonth);
        setYearArry(data);
      }
    }
    if (type === '2') {
      setDatePickerState('month');
      setCurrentYear(value);
      const data = publicGetDateFn('month', value, currentMonth);
      setMonthArry(data);
      onChange('month', `${value}`);
    }
  };

  // 展示月份, 1:点击头,2:点击每一月
  const handleMonthFn = (type: string, value: number = 0) => {
    if (type === '1') {
      setDatePickerState('month');
      const data = publicGetDateFn('month', currentYear, value);
      setMonthArry(data);
      onChange('month', `${currentYear}`);
    }
    if (type === '2') {
      setDatePickerState('day');
      setCurrentMonth(value);
      const data = publicGetDateFn('day', currentYear, value);
      setMonthDay(data);
      onChange('day', `${currentYear}-${value}`);
    }
  };

  // 展示每天
  const handleDateFn = (value: number) => {
    setDatePickerState('day');
    // const data = publicGetDateFn('day', ,value);
  };

  // 左右 icon 图标年份切换
  const publicGetYearToDateFn = (TYPE: string) => {
    if (TYPE === 'UP') {
      if (datePickerState === 'year') {
        const computedBaseYear = publicGetBaseYear(baseYear - 1);
        setBaseYear(computedBaseYear);
        const data = publicGetDateFn('year', computedBaseYear, currentMonth);
        setYearArry(data);
      } else {
        const computedCurrentYear = currentYear - 1;
        setCurrentYear(computedCurrentYear);
        if (datePickerState === 'day') {
          const data = publicGetDateFn(
            'day',
            computedCurrentYear,
            currentMonth,
          );
          setMonthDay(data);
          onChange('day', `${computedCurrentYear}-${currentMonth}`);
        } else {
          onChange('month', `${computedCurrentYear}`);
        }
      }
    }
    if (TYPE === 'LOWER') {
      if (datePickerState === 'year') {
        const computedBaseYear = publicGetBaseYear(baseYear + 10);
        setBaseYear(computedBaseYear);
        const data = publicGetDateFn('year', computedBaseYear, currentMonth);
        setYearArry(data);
      } else {
        const computedCurrentYear = currentYear + 1;
        setCurrentYear(computedCurrentYear);
        if (datePickerState === 'day') {
          const data = publicGetDateFn(
            'day',
            computedCurrentYear,
            currentMonth,
          );
          setMonthDay(data);
          onChange('day', `${computedCurrentYear}-${currentMonth}`);
        } else {
          onChange('month', `${computedCurrentYear}`);
        }
      }
    }
  };

  // 左右 icon 图标月份切换
  const publicGetMonthToDateFn = (TYPE: string) => {
    let computedCurrentMonth = currentMonth;
    if (TYPE === 'UP') {
      if (currentMonth - 1 > 0) {
        computedCurrentMonth = currentMonth - 1;
      }
    }
    if (TYPE === 'LOWER') {
      if (currentMonth + 1 <= 12) {
        computedCurrentMonth = currentMonth + 1;
      }
    }
    setCurrentMonth(computedCurrentMonth);
    const data = publicGetDateFn('day', currentYear, computedCurrentMonth);
    setMonthDay(data);
    onChange('day', `${currentYear}-${computedCurrentMonth}`);
  };

  useEffect(() => {
    const { Y, M, D } = publicGetCurrentDateFn();
    setBaseYear(publicGetBaseYear(Y));
    setBaseMonth(M);

    setCurrentYear(Y);
    setCurrentMonth(M);
    setCurrentDay(D);

    const data = publicGetDateFn('day', Y, M);
    console.log('初始化时间:', data);
    setMonthDay(data);
  }, []);

  // 设置系统当前天高亮
  const getCurrentDayMaskFn = ({ type, day, month, year }: any) => {
    const { Y, M, D } = publicGetCurrentDateFn();
    if (type === 'current' && day === D && month === M && year === Y)
      return 'tbody-td-active';
    else return '';
  };

  // 设置系统当前月高亮
  const getCurrentMonthMaskFn = ({
    month,
    year,
  }: {
    month: number;
    year: number;
  }) => {
    const { Y, M } = publicGetCurrentDateFn();
    if (year === Y && month === M) return 'tbody-td-active';
    else return '';
  };

  // 设置系统当前年高亮
  const getCurrentYearMaskFn = (year: number) => {
    const { Y, M } = publicGetCurrentDateFn();
    if (year === Y) return 'tbody-td-active';
    else return '';
  };

  // 获取当前时间,主要用来获取对应日期数据
  const getCurrentDateFn = (value: number): number => {
    switch (datePickerState) {
      // case 'day':
      //     return Number(`${currentYear}${currentMonth < 10 ? `0${currentMonth}` : currentMonth}${value < 10 ? `0${value}` : value}`);
      case 'month':
        return Number(`${currentYear}${value < 10 ? `0${value}` : value}`);
      case 'year':
        return Number(`${value}`);
      default:
        return Number(
          `${currentYear}${
            currentMonth < 10 ? `0${currentMonth}` : currentMonth
          }${value < 10 ? `0${value}` : value}`,
        );
    }
  };

  return (
    <>
      {/* <CalendarOutlined /> */}

      <div className="customDatePickerWrp">
        <div className="header-Wrp">
          <div className="header-title">{title}</div>
          <ul className="header-operate-wrp">
            <li key={0} onClick={() => publicGetYearToDateFn('UP')}>
              <DoubleLeftOutlined />
            </li>
            {datePickerState === 'day' && (
              <li key={1} onClick={() => publicGetMonthToDateFn('UP')}>
                <LeftOutlined />
              </li>
            )}

            <li key={2} className="yearMonthWrp">
              {datePickerState === 'year' && (
                <div onClick={() => handleYearFn('1')}>
                  {baseYear} - {baseYear + 9}
                </div>
              )}
              {datePickerState !== 'year' && (
                <div onClick={() => handleYearFn('1')}>{currentYear}</div>
              )}

              {datePickerState === 'day' && (
                <div onClick={() => handleMonthFn('1')}>{currentMonth}</div>
              )}
            </li>
            {datePickerState === 'day' && (
              <li key={3} onClick={() => publicGetMonthToDateFn('LOWER')}>
                <RightOutlined />
              </li>
            )}

            <li key={4} onClick={() => publicGetYearToDateFn('LOWER')}>
              <DoubleRightOutlined />
            </li>
          </ul>
        </div>
        <div className="content-Wrp">
          {
            // 展示日期
            datePickerState === 'day' && (
              <>
                <ul className="table-thead-wrp">
                  {weekData.map((item: string, index: number) => (
                    <li className="table-td" key={index}>
                      {item}
                    </li>
                  ))}
                </ul>
                <ul className="table-tbody-wrp">
                  {monthDay.map((item, index: number) => {
                    return (
                      <li
                        key={index}
                        className={`tbody-td ${
                          item['type'] !== 'current'
                            ? 'tbody-otherMonthDay-td'
                            : ''
                        } ${getCurrentDayMaskFn(item)}`}
                      >
                        <div>{item['day']}</div>
                        <div>{dataSource[getCurrentDateFn(item['day'])]}</div>
                      </li>
                    );
                  })}
                </ul>
              </>
            )
          }

          {
            // 展示月份
            datePickerState === 'month' && (
              <ul className="table-tbody-month-wrp">
                {monthArry?.length > 0 &&
                  monthArry.map((item, index: number) => {
                    return (
                      <li
                        key={index}
                        className={`tbody-month-td ${getCurrentMonthMaskFn(
                          item,
                        )}`}
                        onClick={() => handleMonthFn('2', item['month'])}
                      >
                        <div>{item['month']}</div>
                        <div>{dataSource[getCurrentDateFn(item['month'])]}</div>
                      </li>
                    );
                  })}
              </ul>
            )
          }

          {
            // 展示年份
            datePickerState === 'year' && (
              <ul className="table-tbody-year-wrp">
                {yearArry?.length > 0 &&
                  yearArry.map((item, index: number) => {
                    return (
                      <li
                        key={index}
                        className={`tbody-year-td ${getCurrentYearMaskFn(
                          item,
                        )}`}
                        onClick={() => handleYearFn('2', item)}
                      >
                        <div>{item}</div>
                        <div>{dataSource[getCurrentDateFn(item)]}</div>
                      </li>
                    );
                  })}
              </ul>
            )
          }
        </div>
      </div>
    </>
  );
};

export default CustomDatePickerModalPage;

父组件

const parentModalPage = () => {

	// 请查看月/日数据
	const customDatePickerData = {
	    "202301": 286687680,
	    "202302": 55312480,
	    "202303": 61211920,
	    "202304": 59266360,
	    "202305": 61211920,
	    "202306": 59245440,
	    "202307": 61211920,
	    "202308": 206082920,
	    "202309": 812388661.2,
	    "202310": 778804150,
	    "202311": 487160,
	    "202312": 43771360
	};

	return (
		<div style={{ width: '100%', height: '100%', padding: '0 20px 20px 20px' }}>
            <CustomDatePicker title="历史用能日历" dataSource={customDatePickerData} onChange={(type: string, value: string) => {
                console.log('历史用能日历::', type, value, typeof value, customDatePickerData);
					
				// 调用接口获取数据
                getEnergyUsageStatsFn(true, {
                    granularity: type,
                    startDate: publicGetCurrentDateFn(type, value.toString())['startDate'],
                    endDate: publicGetCurrentDateFn(type, value.toString())['endDate'],
                });
                
            }} />
        </div>
	)
};

数据

  • 月数据

    // 返回数据格式-月份数据
    const customDatePickerData = {
        "202301": 286687680,
        "202302": 55312480,
        "202303": 61211920,
        "202304": 59266360,
        "202305": 61211920,
        "202306": 59245440,
        "202307": 61211920,
        "202308": 206082920,
        "202309": 812388661.2,
        "202310": 778804150,
        "202311": 487160,
        "202312": 43771360
    };
    
  • 日数据

    const customDatePickerData = {
        "20231001": 5920360,
        "20231002": 5920360,
        "20231003": 5920360,
        "20231004": 5941280,
        "20231005": 5920360,
        "20231006": 5920360,
        "20231007": 5920360,
        "20231008": 5941280,
        "20231009": 0,
        "20231010": 203030378.2,
        "20231011": 5920360,
        "20231012": 32453714,
        "20231013": 35985720,
        "20231014": 29342320,
        "20231015": 49822720,
        "20231016": 23248120,
        "20231017": 37049520,
        "20231018": 477835490.2,
        "20231019": 740848323.8,
        "20231020": 168360,
        "20231021": 159280,
        "20231022": 169960,
        "20231023": 14413760,
        "20231024": 14705280,
        "20231025": 287880,
        "20231026": 30342680,
        "20231027": 8178880,
        "20231028": 422400,
        "20231029": 28487040,
        "20231030": 9168480,
        "20231031": 29014320
    }
    

效果

  • 月度数据
    在这里插入图片描述

  • 年度数据
    在这里插入图片描述

  • 年统计:
    注意:目前年度总数据暂未统计展示,不过可以根据自己的需求进行修改。
    在这里插入图片描述

最后

将上面的组件引入应该是开箱即用,如果有问题请评论区多多留言。

如果对大家有所帮助,请咚咚大家的【发财黄金手指:点赞收藏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

完全二叉数的全值

分析&#xff1a;我们主要是对数组分割&#xff0c;将每一类累加起来&#xff0c;按顺序存储在另一个数组里面&#xff0c;在对那一个数组进行是筛选&#xff0c;选出最大的那一个下标&#xff0c;在的打印那一个下标。 #include <stdio.h> int main(){int m,n,j,i,t1,s…

IO接口 IPC两个文件对话

实现AB进程对话。 1. A进程发送一-句话后&#xff0c; B进程接收到打印。然后B进程发送一句话&#xff0c;A进程接收后打印 2.重复上述步骤。直到AB接收或者发送完quit后&#xff0c; 结束AB进程 A文件 #include <func.h> #include <stdio.h> #include <errno…

面试必考精华版Leetcode1137. 第 N 个泰波那契数

题目&#xff1a; 代码&#xff08;首刷看解析&#xff09;&#xff1a; class Solution { public:int tribonacci(int n) {// 1.初始化if(n0) return 0;else if(n1) return 1;else if(n2) return 1;int p0,q1,r1;int s0;// 2.遍历方向 左 → 右for(int i 3; i < n ; i)…

openwrt docker nginx 站点搭建

应为家里一直是 openwrt 软路由&#xff0c;这样以来也不用 重新买服务器了&#xff0c;就直接在 openwrt 上面跑个 nginx就行了。把自己的一些东西就可以放上面了。资源再利用哈哈&#xff1b; 先 ssh 连接上 openwrt &#xff1a;我这里的 openwrt 最近刚更新的固件&#xff…

金蝶云星空修改业务对象标识

文章目录 金蝶云星空修改业务对象标识说明解决方案具体操作实操 金蝶云星空修改业务对象标识 说明 一个业务对象的产生&#xff0c;涉及10个表起。 解决方案 还是手工删除重新创建保险。 具体操作 先备份需要删除的元数据&#xff0c;或者扩展&#xff0c;然后重新创建或…

Python给exe添加以管理员运行的属性

需求 有些应用每次启动都需要用管理员权限运行&#xff0c;比如Python注入dll时&#xff0c;编辑器或cmd就需要以管理员权限运行&#xff0c;不然注入就会失败。 这篇文章用编程怎么修改配置实现打开某个软件都是使用管理员运行&#xff0c;就不用每次都右键点击以管理员身份…

Unity SRP 管线【第四讲:URP 阴影】

URP 全文源码解析参照 引入 在UniversalRenderer.cs/ line 505行处 此处已经准备好了所有渲染数据&#xff08;所有数据全部存储在了renderingData中&#xff09; 我们只用renderingData中的数据初设置mainLightShadows bool mainLightShadows m_MainLightShadowCasterPass…

德人合科技 | 防止公司电脑文件数据资料外泄,自动智能透明加密保护系统

【透明加密软件】——防止公司电脑文件数据资料防止外泄&#xff0c;自动智能透明加密保护内部核心文件、文档、图纸、源代码、音视频等资料&#xff01; PC端访问地址&#xff1a; www.drhchina.com &#x1f31f; 核心功能&#xff1a; 透明加密&#xff1a;采用高级加密算…

VR虚拟动漫角色智能化导览丰富体验乐趣

AI数字人助理可以为我们带来哪些帮助? 随着人工智能技术的不断发展&#xff0c;AI数字人助理已经成为了我们日常生活和工作中的得力助手。它们具备智能感知、语音识别、自然语言处理等多种技能&#xff0c;可以为我们带来很多帮助和便利。 一、提高工作效率 AI数字人助理可以帮…

SCC-Tarjan,缩点问题

文章目录 前言引例什么是缩点&#xff1f;缩点的应用一、合并强连通子图为强连通图题目描述输入/输出格式原题链接题目详解 二、集合间偏序关系题目描述输入/输出格式原题链接题目详解 三、最大点权和路径题目描述输入/输出格式原题链接题目详解 其他OJ练习 前言 图论中的缩点问…

【MySQL·8.0·源码】MySQL 语法树基础知识

基础 我们都知道 SQL 语句经过词法分析器时&#xff0c;识别扫描输入的 SQL 语句&#xff0c;将关键词、标识符、常量等分解转换成独立的 tokens&#xff0c;进一步在语法分析阶段根据语法规则检查 tokens 序列的结构并不断 shift 、reduce 构建成 SQL 语法解析树。 在 MySQL…

ubuntu18.04 64 位安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

进入VirtuakBox官网&#xff0c;网址链接&#xff1a;Oracle VM VirtualBoxhttps://www.virtualbox.org/ 网页连接&#xff1a;Ubuntu Virtual Machine Images for VirtualBox and VMwarehttps://www.osboxes.org/ubuntu/ 将下发的ds_db01.sql数据库文件放置mysql中 12、编写S…

19 高速列车场景下3Gpp 5G NR的DMRS设计与评估

文章目录 解决问题设计DMRS仿真参数仿真结果 解决问题 多普勒/扩展影响十分显著&#xff0c;设计用于信道估计时&#xff0c;需要考虑解调参考信号&#xff0c;5G用DMRS结构而不是CRS结构&#xff0c;因此需要为高速UE设计DMRS结构&#xff0c;DMRS设计是为了提高信道估计并减…

jdk多版本切换环境变量管理(jdk1.8和jdk17)

jdk多版本切换环境变量管理&#xff08;jdk1.8和jdk17&#xff09; 看了很多网上的博客&#xff0c;根本都不行&#xff0c;我总结出来规律如下&#xff1a; 首先环境变量要配置成这个样子&#xff1a;这些博客都会教你们配 接着配什么classpath&#xff0c;看其他博客就行 还…

百度地图添加坐标点,并返回坐标信息

1、创建地图容器 在mounted中初始化地图、鼠标绘制工具和添加鼠标监听事件 vue data中添加地图和绘制工具对象 2、添加初始化化地图方法 initMap(longitude, latitude) {let that thisthat.map new BMapGL.Map("container");// 创建地图实例if (longitude null ||…

亿某通电子文档安全管理系统任意文件上传漏洞 CNVD-2023-59471

1.漏洞概述 亿某通电子文档安全管理系统是一款电子文档安全防护软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产。亿赛通电子文档安全管理系统UploadFileFromClientServiceForClient接口处存在任意文件…

大创项目推荐 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

2024年【建筑电工(建筑特殊工种)】报名考试及建筑电工(建筑特殊工种)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年建筑电工(建筑特殊工种)报名考试为正在备考建筑电工(建筑特殊工种)操作证的学员准备的理论考试专题&#xff0c;每个月更新的建筑电工(建筑特殊工种)新版试题祝您顺利通过建筑电工(建筑特殊工种)考试。 1、【单…

内网离线搭建之----nginx高可用

1.系统版本 虚拟机192.168.9.184 虚拟机192.168.9.185 2.nginx以及依赖下载地址 nginx&#xff1a;nginx: download pcre&#xff1a;PCRE - Browse /pcre/8.45 at SourceForge.net zlib&#xff1a;zlib Home Site 基本都在置顶的资源里 3.检查环境安装依赖的依赖&#xf…

RS232转profinet网关扫码枪自由口与1500程序对比

RS232转profinet网关&#xff08;XD-PNR200&#xff09;自由口是一种用于将RS232串口信号转换为profinet协议的设备&#xff0c;它具有自由口的功能。本文以某自动化生产线为例进行案例研究。通过RS232转Profinet网关&#xff08;XD-PNR200&#xff09;&#xff0c;将生产线的多…