【Web开发】Node实现Web图表功能(ECharts.js,React)

news2024/11/18 11:42:30

在这里插入图片描述

🎈🎈🎈Python实现Web图表功能系列:🎈🎈🎈
1🎈【Web开发】Python实现Web图表功能(D-Tale入门)🎈
2🎈【Web开发】Python实现Web图表功能(D-Tale编译)🎈
3🎈【Web开发】Python实现Web图表功能(pyecharts,Flask)🎈
4🎈【Web开发】Python实现Web图表功能(ECharts.js,Flask)🎈
5🎈【Web开发】Node实现Web图表功能(ECharts.js,Vue)🎈
6🎈【Web开发】Node实现Web图表功能(ECharts.js,React)🎈
7🎈【Web开发】Python实现Web图表功能(Grafana入门)🎈

文章目录

  • 1、简介
    • 1.1 Node
    • 1.2 ECharts
    • 1.3 React
  • 2、安装
    • 2.1 安装node
    • 2.2 安装echarts
    • 2.3 安装React
      • 2.3.1 CDN库方式
      • 2.3.2 npm方式
  • 3、测试(React)
    • 3.1 修改App.js(hello world)
    • 3.2 修改index.js(hello world)
    • 3.3 修改index.js(定时器)
    • 3.4 修改index.js(按钮button)
    • 3.5 修改index.js(请求AJAX)
    • 3.6 修改index.js(请求fetch)
    • 3.7 修改index.js(Markdown 库)
  • 4、测试(React+Echarts)
    • 4.1 修改App.js(Echarts例子: 柱状图)
    • 4.2 修改App.js(ECharts例子:折线图)
    • 4.3 修改App.js(ECharts例子:饼状图)
    • 4.4 修改App.js(ECharts例子:玫瑰图)
    • 4.5 修改App.js(ECharts例子:面积图)
  • 结语

1、简介

1.1 Node

Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具!
Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使得 Node.js 的性能非常好。
在这里插入图片描述

1.2 ECharts

ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。
在这里插入图片描述

ECharts,缩写来自 Enterprise Charts,商业级数据图表,是百度的一个开源的数据可视化工具,一个纯 Javascript 的图表库,能够在 PC 端和移动设备上流畅运行,兼容当前绝大部分浏览器(IE6/7/8/9/10/11,chrome,firefox,Safari等),底层依赖轻量级的 Canvas 库 ZRender,ECharts 提供直观,生动,可交互,可高度个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

1.3 React

https://reactjs.org/
https://create-react-app.bootcss.com/

React 是一个用于构建用户界面的 JAVASCRIPT 库。
React 主要用于构建 UI,很多人认为 React 是 MVC 中的 V(视图)。
React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。
React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。
在这里插入图片描述
React 在设计之初就可以被渐进式适配,并且你可以根据需要选择性地使用 React。可能你只想在现有页面中“局部地添加交互性”。使用 React 组件是一种不错的方式。
在这里插入图片描述

通过仅仅几行代码并且无需使用构建工具,试试在你的网站的一小部分中使用 React。然后,你可以逐步扩展它的存在,或只将其涵盖在少数动态部件中。
在这里插入图片描述

2、安装

2.1 安装node

下载地址:
https://nodejs.org/en/
在这里插入图片描述
输入一下命令,检测node安装是否成功:

node -v

在这里插入图片描述

2.2 安装echarts

mkdir test_echarts
cd test_echarts
npm init -y
npm install echarts --save

在这里插入图片描述

2.3 安装React

在这里插入图片描述

2.3.1 CDN库方式

可以直接使用 Staticfile CDN 的 React CDN 库,地址如下:

<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>

官方提供的 CDN 地址:

<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<!-- 生产环境中不建议使用 -->
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>

测试网页如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
 
<div id="example"></div>
<script type="text/babel">
ReactDOM.render(
    <h1>Hello world, React!</h1>,
    document.getElementById('example')
);
</script>
 
</body>
</html>

在这里插入图片描述
引入了三个库: react.development.min.js 、react-dom.development.min.js 和 babel.min.js:

react.min.js - React 的核心库
react-dom.min.js - 提供与 DOM 相关的功能
babel.min.js - Babel 可以将 ES6 代码转为 ES5 代码,这样我们就能在目前不支持 ES6 浏览器上执行 React 代码。Babel 内嵌了对 JSX 的支持。通过将 Babel 和 babel-sublime 包(package)一同使用可以让源码的语法渲染上升到一个全新的水平。

2.3.2 npm方式

# 使用淘宝定制的 cnpm
npm install -g cnpm --registry=https://registry.npmmirror.com
npm config set registry https://registry.npmmirror.com

# create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境。
# create-react-app 自动创建的项目是基于 Webpack + ES6 。
cnpm install -g create-react-app
create-react-app my-app   #create-react-app my-app --template typescript
cd my-app/
npm start

命令行执行命令:
在这里插入图片描述
自动创建的react工程的文件夹:
在这里插入图片描述
浏览器显示react默认页面:
在这里插入图片描述
如果在原生的JS应用或者jQuery项目中,我们常用的方式就是直接去官网下载其核心js文件并导入我们的项目中使用。但是在React项目中,就不需要。由于React项目开发基于webpack做了二次封装,而webpack又是基于 Node.js的前端项目部署打包工。

3、测试(React)

3.1 修改App.js(hello world)

为了修改上面网页内容,现修改App.js:
在这里插入图片描述
修改App.js部分代码如下:
在这里插入图片描述
浏览器显示修改后的react页面:
在这里插入图片描述

3.2 修改index.js(hello world)

  • 先来一个例子:为了修改上面网页内容,现修改index.js如下:
    在这里插入图片描述
    修改index.js部分代码如下:
import React from 'react';
import ReactDOM from 'react-dom/client';

class HelloMessage extends React.Component {
  render() {
    return (
      <div>
        Hello {this.props.name}
      </div>
    );
  }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <HelloMessage name="爱看书的小沐" />
);

浏览器显示修改后的react页面:
在这里插入图片描述

  • (2)再来一个例子:
import React from 'react';
import ReactDOM from 'react-dom/client';

function Name(props) {
    return <h1>网站名称:{props.name}</h1>;
}
function Url(props) {
    return <h2>网站地址:{props.url}</h2>;
}
function Nickname(props) {
    return <h3>网站小名:{props.nickname}</h3>;
}
function App() {
    return (
    <div>
        <Name name="爱看书的小沐" />
        <Url url="http://www.baidu.com" />
        <Nickname nickname="tomcat" />
    </div>
    );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <App />
);

浏览器显示修改后的react页面:
在这里插入图片描述

3.3 修改index.js(定时器)

  • 一个时间的例子:
import React from 'react';
import ReactDOM from 'react-dom/client';

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }
 
  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }
 
  componentWillUnmount() {
    clearInterval(this.timerID);
  }
 
  tick() {
    this.setState({
      date: new Date()
    });
  }
 
  render() {
    return (
      <div>
        <h1>Hello world, 爱看书的小沐!</h1>
        <h2>现在是 {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <Clock />
);

浏览器显示修改后的react页面:
在这里插入图片描述

3.4 修改index.js(按钮button)

  • 一个按钮的例子:
import React from 'react';
import ReactDOM from 'react-dom/client';

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};
 
    // 这边绑定是必要的,这样 `this` 才能在回调函数中使用
    this.handleClick = this.handleClick.bind(this);
  }
 
  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }
 
  render() {
    return (
	<div>
	  <p>爱看书的小沐的按钮:</p>
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
	  </div>
    );
  }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <Toggle />
);

浏览器显示修改后的react页面:
在这里插入图片描述

3.5 修改index.js(请求AJAX)

在 React 开发中,你能使用任何你喜欢的 AJAX 库,比如社区比较流行的 Axios,jQuery AJAX,或者是浏览器内置的 window.fetch。

我们推荐你在 componentDidMount 这个生命周期函数中发起 AJAX 请求。这样做你可以拿到 AJAX 请求返回的数据并通过 setState 来更新组件。

安装jquery库:

npm install jquery --save

修改代码如下:

import React from 'react';
import ReactDOM from 'react-dom/client';
import $ from 'jquery';

class UserGist extends React.Component {
  constructor(props) {
      super(props);
      this.state = {username: '', html_url: ''};
  }
 
  componentDidMount() {
    this.serverRequest = $.get(this.props.source, function (result) {
      var lastGist = result[0];
      this.setState({
        username: lastGist.owner.login,
        html_url: lastGist.html_url,
        id: lastGist.id,
        node_id: lastGist.node_id,
        created_at: lastGist.created_at,
        updated_at: lastGist.updated_at,
        description: lastGist.description,
        comments: lastGist.comments,
      });
    }.bind(this));
  }
 
  componentWillUnmount() {
    this.serverRequest.abort();
  }
 
  render() {
    return (
      <div>
        {this.state.username} 用户最新的 Gist 信息:
        <a href={this.state.id}>{this.state.html_url}</a>
		<p>node_id: {this.state.node_id} </p>
		<p>created_at: {this.state.created_at} </p>
		<p>updated_at: {this.state.updated_at} </p>
		<p>description: {this.state.description} </p>
		<p>comments: {this.state.comments} </p>
      </div>
    );
  }
}
 
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <UserGist source="https://api.github.com/users/octocat/gists" />
);

浏览器显示修改后的react页面:
在这里插入图片描述

3.6 修改index.js(请求fetch)

import React from 'react';
import ReactDOM from 'react-dom/client';
import $ from 'jquery';

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      error: null,
      isLoaded: false,
      items: []
    };
  }

  componentDidMount() {
    fetch("https://api.wmdb.tv/api/v1/top?type=Imdb&skip=0&limit=20&lang=Cn")
      .then(res => res.json())
      .then(
        (result) => {
          this.setState({
            isLoaded: true,
            items: result
          });
        },
        // 注意:需要在此处处理错误
        // 而不是使用 catch() 去捕获错误
        // 因为使用 catch 去捕获异常会掩盖掉组件本身可能产生的 bug
        (error) => {
          this.setState({
            isLoaded: true,
            error
          });
        }
      )
  }

  render() {
    const { error, isLoaded, items } = this.state;
    if (error) {
      return <div>Error: {error.message}</div>;
    } else if (!isLoaded) {
      return <div>Loading...</div>;
    } else {
      return (
        <ul>
          {items.map(item => (
            <li key={item.data[0].id}>
              <p>{item.dateReleased} {item.data[0].country}  {item.data[0].name} </p> {item.data[0].description}
            </li>
          ))}
        </ul>
      );
    }
  }
}
 
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <MyComponent />
);

浏览器显示修改后的react页面:
在这里插入图片描述

3.7 修改index.js(Markdown 库)

import React from 'react';
import ReactDOM from 'react-dom/client';

import { Remarkable } from 'remarkable';

class MarkdownEditor extends React.Component {
  constructor(props) {
    super(props);
    this.md = new Remarkable();
    this.handleChange = this.handleChange.bind(this);
    this.state = { value: 'Hello, **world**!' };
  }

  handleChange(e) {
    this.setState({ value: e.target.value });
  }

  getRawMarkup() {
    return { __html: this.md.render(this.state.value) };
  }

  render() {
    return (
      <div className="MarkdownEditor">
        <h3>Input</h3>
        <label htmlFor="markdown-content">
          Enter some markdown
        </label>
        <textarea
          id="markdown-content"
          onChange={this.handleChange}
          defaultValue={this.state.value}
        />
        <h3>Output</h3>
        <div
          className="content"
          dangerouslySetInnerHTML={this.getRawMarkup()}
        />
      </div>
    );
  }
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <MarkdownEditor />
);

浏览器显示修改后的react页面:
在这里插入图片描述

4、测试(React+Echarts)

4.1 修改App.js(Echarts例子: 柱状图)

import React, { PureComponent } from "react";
import * as eCharts from "echarts";

export default class App extends PureComponent {

  eChartsRef: any = React.createRef();

  componentDidMount() {
    const myChart = eCharts.init(this.eChartsRef.current);

    let option = {
      title: {
        text: "ECharts 入门示例(爱看书的小沐)",
      },
      tooltip: {},
      legend: {
        data: ["销量"],
      },
      xAxis: {
        data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
      },
      yAxis: {},
      series: [
        {
          name: "销量",
          type: "bar",
          data: [5, 20, 36, 10, 10, 20],
        },
      ],
    };

    myChart.setOption(option);
  }

  render() {
    return <div ref={this.eChartsRef} style={{
      width: 600,
      height: 400,
      margin: 100
    }}></div>;
  }
}

浏览器显示修改后的react页面:
在这里插入图片描述

4.2 修改App.js(ECharts例子:折线图)

安装库:

#git clone https://github.com/hustcc/echarts-for-react.git
#npm install
#npm start

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

修改App.js代码测试:

import React from 'react';
//import {Card} from 'antd';
//import echartTheme from './../themeLight'
//不是按需加载的话文件太大
//import echarts from 'echarts'
//下面是按需加载
import echarts from 'echarts/lib/echarts'
import 'echarts/lib/chart/line';  //折线图是line,饼图改为pie,柱形图改为bar
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/title';
import 'echarts/lib/component/legend';
import 'echarts/lib/component/markPoint';
import ReactEcharts from 'echarts-for-react';
export default class App extends React.Component{
  getOption =()=> {
    let option = {
      title:{
        text:'用户骑行订单(爱看书的小沐)',
        x:'center'
      },
      tooltip:{
        trigger:'axis',
      },
      xAxis:{
        data:['周一','周二','周三','周四','周五','周六','周日']
      },
      yAxis:{
        type:'value'
      },
      series:[
        {
          name:'OFO订单量',
          type:'line',   //折线图是line,饼图改为pie,柱形图改为bar
          data:[1000,2000,1500,3000,2000,1200,800]
        }
      ]
    }
   return option
  }

  render(){
    return(
      <div>
        <div title="折线图表之一">
            <ReactEcharts option={this.getOption()} theme="Imooc"  style={{height:'400px'}}/>
        </div>

      </div>
    )
  }
}

浏览器显示修改后的react页面:
在这里插入图片描述

4.3 修改App.js(ECharts例子:饼状图)

import React, {
    Component
} from "react";
// 引入ECharts主模块 
import * as echarts from "echarts/lib/echarts";
// 引入饼状图需要的模块 
import "echarts/lib/chart/pie";
import "echarts/lib/component/title";
import "echarts/lib/component/tooltip";
import "echarts/lib/component/legend";
class App extends Component { // 初始化状态 
    state = {
        data: [
            {value: 150, name: '语文'},
            {value: 110, name: '物理'},
            {value: 150, name: '数学'},
            {value: 100, name: '化学'},
            {value: 150, name: '英语'},
            {value: 90, name: '生物'},
        ],
        celldata:['语文', '物理', '数学', '化学', '英语', '生物']
    };
    async componentDidMount() {
        
        var myChart = echarts.init(document.getElementById("main"));
        myChart.setOption(
            {
                title: {
                    text: '高考理科分数占比(爱看书的小沐)',
                    left: 'center'
                },
                tooltip: {
                    trigger: 'item',
                    formatter: '{a} <br/>{b} : {c} ({d}%)'
                },
                legend: {
                    left: 'center',
                    top: 'bottom',
                    data: this.state.celldata
                },
                toolbox: {
                    show: true,
                    feature: {
                        mark: {show: true},
                        dataView: {show: true, readOnly: false},
                        magicType: {
                            show: true,
                            type: ['pie', 'funnel']
                        },
                        restore: {show: true},
                        saveAsImage: {show: true}
                    }
                },
                series: [
                    {
                        name: '分数',
                        type: 'pie',
                        radius: [30, 110],
                        center: ['50%', '50%'],
                        roseType: 'area',
                        data: this.state.data
                    }
                ]
            }            
        );
    }
    render() {
            return <div id = "main" style = { {  width: 1000, height: 400 }}> </div>; 
    }
}
export default App; 

浏览器显示修改后的react页面:
在这里插入图片描述

4.4 修改App.js(ECharts例子:玫瑰图)

import React, { Component} from "react";
// 引入ECharts主模块 
import * as echarts from "echarts/lib/echarts";
// 引入折线图需要的模块 
import "echarts/lib/chart/line";
import "echarts/lib/component/title";
import "echarts/lib/component/tooltip";
import "echarts/lib/component/legend";
import 'echarts/lib/component/polar';
class App extends Component { 
    state = {
        sourceData: [],
    };
    async componentDidMount() {
        let data = [];
        for (let i = 0; i <= 100; i++) {
            let theta = i / 100 * 360;
            let r = 5 * (1 + Math.sin(theta / 180 * Math.PI));
            data.push([r, theta]);
        }
        this.setState(() => {
            return {
                sourceData: data
            };
        });
        let myChart = echarts.init(document.getElementById("main"));
        myChart.setOption({
                title: {
                    text: '极坐标双数值轴(爱看书的小沐)'
                },
                legend: {
                    data: ['line']
                },
                polar: {},
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'cross'
                    }
                },
                angleAxis: {
                    type: 'value',
                    startAngle: 0
                },
                radiusAxis: {
                },
                series: [{
                    coordinateSystem: 'polar',
                    name: 'line',
                    type: 'line',
                    data: data 
                }]
            }
        );
    }
    render() {
        return <div id = "main" style = { {  width: 1000, height: 600 }}> </div>; 
    }
}
export default App; 

浏览器显示修改后的react页面:
在这里插入图片描述

4.5 修改App.js(ECharts例子:面积图)

  • (1)在App.js代码修改如下:
import React from "react";
import './App.css';
import BaseRouter from './component/test-echarts.js'

function App() {
  return (
    <div>
      hello world
      <BaseRouter/>
    </div>
  );
}
export default App;
  • (2)在APP.js同层级的component下新建test-echarts.js
    在这里插入图片描述
    在这里插入图片描述
import React from 'react'
import * as echarts from 'echarts';
// console.log(echarts)

class TestChart extends React.Component {
  componentDidMount () {
     // 初始化图表效果
    let mychart = echarts.init(document.getElementById('main'))
    let option ={
      xAxis: {
          type: 'category',
          boundaryGap: false,
          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
      },
      yAxis: {
          type: 'value'
      },
      series: [{
          data: [820, 932, 901, 934, 1290, 1330, 1320],
          type: 'line',
          areaStyle: {}
      }]
  }

  // 必须调用setOption设置图表的配置
        mychart.setOption(option)
  }
  render () {
    let styles = {
      height: '300px',
      width: '300px'
    }
    return (
      <div>
        <div>测试图表echarts</div>
        {/*图表显示位置*/}
        <div id="main" style={styles}></div>
      </div>
    )
  }
} 

export default TestChart

在这里插入图片描述


结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

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

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

相关文章

整理了一份github上比较热门的ChatGPT项目,值得收藏

ChatGPT已经火了一段时间了&#xff0c;但是&#xff0c;热度依旧是各大自媒体的热榜。由于&#xff0c;国内不能直接访问ChatGPT,国内的开发者依托OpenAI的接口&#xff0c;开发出一些ChatGPT的应用。今天就整理一下github上最热门的ChatGPT项目。 lencx/ChatGPT 该项目是Cha…

java线程的状态

文章目录 1. 线程的状态2. 验证NEW、RUNNALE和TERMINATED状态3. 验证TIMED_WAITING状态4. 验证BLOCKED状态5. 验证BLOCKED状态 1. 线程的状态 线程在不同的运行时期存在不同的状态&#xff0c;状态信息存在于State枚举类中&#xff0c;如下图&#xff1a; 调用线程有关的方法是…

文心一言 VS 讯飞星火 VS chatgpt (18)-- 算法导论4.1 5题

五、使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始&#xff0c;由左至右处理&#xff0c;记录到目前为止已经处理过的最大子数组。若已知 A[1…j]门的最大子数组&#xff0c;基于如下性质将解扩展为 A[1…j1]的最大子数组:A[1…j1]的最大…

Squid 代理服务器

Squid概述 Squid 主要提供缓存加速、应用层过滤控制的功能。 代理的工作机制 1&#xff0e;代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。 2&#xff0e;将获得的网页数据&#xff08;静态 Web 元素&#xff09;保存到缓存中并发送给客户机&#xff0…

Windows安装Ubuntu双系统

Windows安装Ubuntu双系统 1.下载Ubuntu 16.04&#xff0c;地址https://releases.ubuntu.com/16.04/ 2.下载Rufus&#xff0c;地址https://rufus.ie/zh/ 3.准备U盘&#xff0c;烧录系统 4.磁盘分区 5.重启&#xff0c;按住shift键 本人电脑是联想小新 Windows11系统&#xff0…

QT上位机串口+STM32单片机项目

第一个自己的上位机小项目&#xff0c;嘿嘿&#xff0c;还是有些成绩感的。 目录 1.先看QT上位机部分 1.首先写一个页面 2.mainwindow.cpp主要函数。 2.form.cpp主要函数 3.STM32部分 1.main函数 3.QT完整代码 1.shangwei.pro 2.form.h 3.mainwindow.h 4.form.cpp …

从零入门激光SLAM(十一)——如何求解SLAM问题

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。随着知识的越来越多&#xff0c;越来越细&#xff0c;我准备整理一个自己的激光SLAM学习笔记专栏&#xff0c;从0带大家快速上手激…

(转载)从0开始学matlab(第9天)—第一阶段总结

1.编程实例 下面的例子将向大家介绍如何用 MATLAB 解决问题。 例1 温度转换程序 问题&#xff1a; 设计一个 MATLAB 程序&#xff0c;读取一个华氏温度的输入&#xff0c;输出开尔文温度。 答案&#xff1a; 华氏温度和开尔文温度的转换关系式可在物理学课本中找到。其关系式…

HCIP-RIP双向重发布综合实验

拓扑结构&#xff1a; 要求&#xff1a; 1、两个协议间进行多点双向重发布 2、R7的环回没有宣告在OSPF协议中&#xff0c;而是在后期重发布进入的 3、解决环路&#xff0c;所有路径选择最优&#xff0c;且存在备份 4、R2的环回要在RIP中宣告&#xff0c;R3的环回要在OSPF中宣…

如何优雅的写C#,使用Visual studio

免责声明 本人接触C#,.Net一年时间&#xff0c;本文内容基于我平时对于C#语法的积累&#xff0c;如有问题请多包涵。以下内容除了C#之外&#xff0c;还有Visual studio编译器相关的内容。 在使用C#的一年多里面&#xff0c;我发现C#的语法糖真的很不错&#xff0c;Visual Stu…

SaaS系统用户权限设计

SaaS系统用户权限设计 学习目标&#xff1a; 理解RBAC模型的基本概念及设计思路 了解SAAS-HRM中权限控制的需求及表结构分析完成组织机构的基本CRUD操作 完成用户管理的基本CRUD操作完成角色管理的基本CRUD操作 组织机构管理 需求分析 需求分析 实现企业组织结构管理&#xff0…

PCB 基础~典型的PCB设计流程,典型的PCB制造流程

典型的PCB设计流程 典型的PCB制造流程 • 从客户手中拿到Gerber&#xff0c; Drill以及其它PCB相关文件 • 准备PCB基片和薄片 – 铜箔的底片会被粘合在基材上 • 内层图像蚀刻 – 抗腐蚀的化学药水会涂在需要保留的铜箔上&#xff08;例如走线和过孔&#xff09; – 其他药水…

如何封装React无限滚动加载列表组件【含源码】

前言 由于需要考虑后端接口的性能问题&#xff0c;我们在请求业务数据列表的时候并不能直接请求全量数据。所以我们在请求数据时常见的方式是做分页查询。 对于前端交互而言&#xff0c;我们需要考虑如何优雅的让用户触发请求下一页数据的接口。常用的方法有两种&#xff1a;…

i春秋春季赛2023

只有两道逆向和一道misc&#xff0c;其他的有时间再写 wordle 不断筛有什么和没什么字母猜就行了 [6x] Guess a 5-letter word : first first [5x] Guess a 5-letter word : ideas Please enter a real English word that exists. [5x] Guess a 5-letter word : icily first…

View的基础与滑动

View的基础与滑动 1.View的基础知识 1.1View是什么 View是一种界面层的控件的一种抽象 ,我们知道的大多数控件都是直接或间接继承自View 如EditText,TextView等等 注意: EditText在compose中并没有相关控件,而是通过TextField来进行组合 Android中View本身就可以是单个控…

rt-thread启动流程(最详细教程)

资料下载 RT-Thread Simulator 例程 操作流程 将上面的仿真例程下载并解压&#xff0c;通过MDK打开&#xff0c;编译&#xff0c;调试&#xff0c;并打开串口点击运行&#xff0c;就可以看到如下输出了&#xff1a; 添加自己的 thread&#xff1a;在main()函数中添加即可&am…

【5.19】四、性能测试—流程

4.4 性能测试的流程 性能测试也遵循测试需求分析→测试计划制订→测试用例设计→测试执行→编写测试报告的基本过程&#xff0c;但在实现细节上&#xff0c;性能测试有单独一套流程&#xff1a; 1. 分析性能测试需求 在性能测试需求分析阶段&#xff0c;测试人员需要收集有关…

【AI Earth试玩】权限配置与openAPI调用工具库

前言 AI earth是阿里达摩院出的遥感云计算平台&#xff0c;我简单体验下来感觉像是GEE的python版本遥感深度学习计算平台&#xff0c;整体体验还是挺不错的&#xff0c;尤其是多分类的结果还是挺惊艳的。 平台提供工具箱和notebook两种模式&#xff0c;工具箱整个交互简单易用…

DJ 5-4 以太网 Ethernet

目录 一、以太网的物理拓扑结构 二、以太网物理层标准 1、以太网技术&#xff1a;10Base-T 和 100Base-T 2、以太网技术&#xff1a;1000Base 系列 3、曼彻斯特编码* 4、差分曼彻斯特编码机制* 三、以太网链路层控制技术 四、以太网的帧结构 1、前同步码 2、MAC 地址…

Spring Boot 项目【前后端分离】之后端实现加 LambdaQueryWrapper实现源码分析和手动模拟

目录 Spring Boot 项目【前后端分离】 之架子搭建 技术栈 实现功能03-创建Spring Boot 后端项目 需求分析/图解 思路分析 代码实现 1. 创建springboot_furn 项目 2. 修改pom.xml , 引入mybatis-plus 等相关依赖 3. 创建application.yml 配置port & 配置DB 连接信息…