当前位置: 首页 > article >正文

redux_旧版本

reduxjs/toolkit(RTK)是 Redux 官方团队推出的一个工具集,旨在简化 Redux 的使用和配置。它于 2019 年 10 月 正式发布,此文章记录一下redux的旧版本如何使用,以及引入等等。
在这里插入图片描述

在这里插入图片描述
文件目录如下:
在这里插入图片描述

步骤

  1. 安装依赖

    npm install redux react-redux redux-thunk
    
  2. 设置 Redux Store
    创建 store.js 文件并配置 createStore
    使用 combineReducers 合并多个 reducer。
    使用 applyMiddleware 添加 thunk 中间件。

  3. 创建 Actions
    定义 action 类型和 action 创建函数。

  4. 创建 Reducers
    根据 action 类型更新 state。

  5. 连接 React 组件到 Redux Store
    使用 Provider 组件将 store 提供给整个应用。
    使用 connect 函数将组件连接到 Redux store,并映射 state 和 dispatch 方法到组件的 props。

  6. 使用 Redux DevTools
    配置 Redux DevTools 以方便调试。

1. 安装必要的依赖

安装 reduxreact-reduxredux-thunk(用于处理异步操作)。

npx create-react-app redux-test
cd redux-test
npm install redux react-redux redux-thunk

2. 设置 Redux Store

创建一个 store.js 文件来配置 Redux store
applyMiddleware 用于在 Redux store 中应用中间件,中间件在 Redux 的 action 被分发到 reducer 之前拦截这些 action,可以扩展 Redux 的功能,实现诸如异步操作(使用 redux-thunk 或 redux-saga)、路由控制、日志记录等。

applyMiddleware工作原理
1.Action 分发:
当一个 action 被分发时,它首先会被传递给中间件。
2.中间件链:
中间件按照应用的顺序形成一个链,每个中间件可以处理 action 并决定是否继续传递给下一个中间件或 reducer。
3.处理逻辑:
每个中间件可以执行自定义逻辑,例如记录日志、处理异步操作等。
4.传递 Action:
最终,action 会被传递给 reducer 进行状态更新

src/redux/store.js

/**
* 该文件专门用于暴露一个store对象,整个应用只有一个store对象
* */
// 引入createStore,专门用于创建redux中最为核心的 store
import { createStore,applyMiddleware } from 'redux'
// 引入总的Reducers
import Reducers from './reducers/index'// 引入redux-thunk插件,用于支持异步action
// redux-thunk 允许你返回一个函数而不是一个普通的 action 对象。 ==>体现在action的返回值上,主要处理异步action
import { thunk } from 'redux-thunk'
// 引入redux-devtools-extension插件,用于支持redux调试工具
import { composeWithDevTools } from "redux-devtools-extension"
// 暴露store
export default createStore(Reducers,composeWithDevTools(applyMiddleware(thunk)))

src/redux/reducers/index.js

combineReducers 汇总所有的reducer变为一个总的reducer

/*** 该文件用于汇总所有的reducer为一个总的reducer**/
// 引入combineReducers
import { combineReducers } from "redux";
// 引入为Count组件服务的reducer
import count from "./count";
// 引入Person组件服务的的reducer
import persons from "./person";
// 汇总所有的reducer变成一个总的reducer
export default combineReducers({count,persons
})
// export default 全局暴露的对象,可以自定义暴露对象的名称

3. 创建 Actions

src/common/common.js

// 该模块仅用于定义常量,其他模块导入该常量即可
export const INCREMENT = 'INCREMENT'
export const DECREMENT = 'DECREMENT'
export const ADD_INFO = 'personInfo'

src/redux/actions/count.js

import {INCREMENT,DECREMENT} from "../../common/common";
// import store from "./store";
/*** 该文件专门为Count组件生成action对象*
**/
/**
* 同步action:action的值为Object类型的一般对象
* */
export const increment = (data)=>({type: INCREMENT, data})
export const decrement = (data)=>({type: DECREMENT, data})
/*** 异步action:action的值为函数类型,异步action中可以调用同步action,也可以自己写异步代码**/
export const incrementAsync = (data,time)=>{// createStore(countReducer,applyMiddleware(thunk))// applyMiddleware中可以传入多个中间件,中间件是一个函数,该函数的参数是store,所以此处无需传入storereturn (dispatch)=>{// console.log(dispatch);setTimeout(()=>{// store.dispatch(incrementAction(data))dispatch(increment(data))},time)}
}

src/redux/actions/person.js

import { ADD_INFO } from "../../common/common";
export const addPerson = (personObj)=>({type:ADD_INFO,personObj})

4. 创建 Reducers

创建 countReducer.jspersonReducer.js 文件来处理 actions 并更新 state。
src/redux/reducers/count.js

/*** 1.该文件适用于创建一个为Count组件服务的redux模块中的reducer,reducer的本质是一个函数* 2.reducer函数会接到两个参数,分别为:之前的状态(preState),动作对象(action)* **/
import {INCREMENT,DECREMENT} from "../../common/common";let initialState = 0; // 数据初始化
export default function countReducer(preState =initialState, action) {// 从action对象中获取:type,datalet { type, data } = action// console.log(preState,action); // 初次获取0,"@@redux/INITx.1.n.3.n.9"// 根据type决定如何加工数据switch (type){case INCREMENT:// console.log(preState);return preState + data*1;case DECREMENT:return preState - data*1;default:return preState;// 初始化数据·}
}

src/redux/reducers/person.js

Redux 的 reducer 必须是纯函数,这意味着它不能修改传入的参数(即 preState),而是必须返回一个新的状态对象。

纯函数的定义:

  • 不能改变传递过来的参数的原始值
  • 只能通过返回值返回结果
  • 状态不可变性
// 数据参数
import { ADD_INFO } from "../../common/common"
const initPersonInfo =[] // 初始化列表数据
const personReducer = (preState=initPersonInfo,action)=>{let {type,personObj} = action // 此处解构switch (type){case ADD_INFO: // 若是添加数据// preState.unshift(personObj) // 修改的原数组,导致preState参数被改写了,       // personReducer就不是纯函数;且preState的指向地址没有发生变化,所以不会引起界面更新// return preState // vue中也是浅拷贝,但是vue中会进行深拷贝,所以界面更新// react 不会引起界面更新,因为指向地址并没有发生变化;--浅拷贝--修改引用指针return [personObj,...preState] // 浅拷贝,此时preState指向新的地址,界面更新 // 界面的更新比较的是两个对象的存储位置,浅比较default:return preState}
}
// 纯函数的定义:1.不能改变 传递过来的参数 的原始值 2.只能通过返回值返回结果
// 不管调用多少次,都只会返回一个结果
export  default personReducer
// export default 语句的语法不允许直接在 export default 后面使用 const 或 let 声明变量。
// export default 语句可以直接导出一个表达式或一个函数,但不能直接导出一个带有 const 或 let 声明的变量。

export default 语句可以直接导出一个表达式或一个函数,但不能直接导出一个带有 const 或 let 声明的变量。

5. 连接 React 组件到 Redux Store

src/App.jsx

import React, {Component} from 'react';
// 引入容器组件
import Count from './container/Count/index'
import Person from './container/Person/index'
// 引入store;传递给容器组件
class App extends Component {render() {return (<div><Count/><Person/></div>);}
}
export default App;

src/index.js

// 引入核心库
import React from 'react';
// 创建根节点
import { createRoot } from 'react-dom/client';
import store from "./redux/store";
// 使用Provider组件, 将store传递给APP组件,全局状态管理
import { Provider } from "react-redux"
// 引入文件
import App from './App';
// 创建容器
const container = document.getElementById('root'); // 外壳
const root = createRoot(container); // 创建根节点
root.render(/* 此处需要Provider包裹App,让App所有的后代容器组件都能接收到store */<Provider store={store}><App /></Provider>
);

src/container/Count/index.jsx
connect 作用:

  1. 连接组件到 Redux Store:
    connect 函数将 React 组件与 Redux store 连接起来,使得组件能够访问 store 中的状态和分发 actions。
  2. 传递状态到组件:
    通过 mapStateToProps 函数,将 Redux store 中的状态映射到组件的 props。
  3. 传递 dispatch 方法到组件:
    通过 mapDispatchToProps 函数,将 dispatch 方法映射到组件的 props,使得组件能够分发 actions。
  4. 优化渲染性能:
    connect 会自动处理组件的订阅和取消订阅,确保组件只在相关状态变化时重新渲染。

mapStateToProps

  1. mapStateToProps函数 返回的是一个对象;
  2. 返回的对象中的key就作为UI组件props的key,value就作为传递UI组件props的value
  3. mapStateToProps用于传递状态

mapStateToDispatch

  1. mapStateToDispatch函数 返回的是一个对象;
  2. 返回的对象中的key就作为UI组件props的key,value就作为传递UI组件props的value
  3. mapStateToDispatch用于传递操作状态的方法
// connect()(CountUI) ==> 容器container
// 使用connect()()创建并暴露一个Count的容器组件
export default connect(mapStateToProps, mapDispatchToProps)(CountUI);
import React,{Component} from "react";
/*** 引入react-redux中connect函数,连接 UI组件和redyx(store)**/
import { connect } from "react-redux";
// store通过Provider传递引入
// 引入action
import {increment,decrement,incrementAsync} from "../../redux/actions/count"
// 容器通过 store 获取状态数据 ,传递给UI组件,UI组件通过props获取
class Count extends Component{incrementNum = ()=>{// 函数let { value } = this.selectNumthis.props.increment(value)}decrementNum = ()=>{// 函数let { value } = this.selectNumthis.props.decrement(value)}// 奇数时加incrementOddNum = ()=>{// 函数let { value } = this.selectNumlet  count  = this.props.countif(count % 2 !== 0){this.props.increment(value)}}incrementAsync = ()=>{// 函数let { value } = this.selectNum // 字符串形式需要转换,否则默认会字符串拼接this.props.incrementAsync(value,500)}render(){return(<div><h2>我是Count组件</h2><h1>求和的数值:{this.props.count}</h1><select ref={(c) => {this.selectNum = c}}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button onClick={this.incrementNum}>+</button><button onClick={this.decrementNum}>-</button><button onClick={this.incrementOddNum}>求和为基数时再加+</button><button onClick={this.incrementAsync}>异步再加+</button></div>)}
}export default connect(state=>{// Uncaught Error: Objects are not valid as a React child (found: object with keys {countNum}). If you meant to render a collection of children, use an array instead.return { count:state.count} // 映射到UI组件的props,返回的数值必须是一个对象且需要取准确的对象,store 统一管理数据},{increment, decrement, incrementAsync}
)(Count)

src/container/Person/index.jsx

import React, {Component} from 'react';
import {addPerson} from '../../redux/actions/person'
import {connect} from 'react-redux'
// 使用nanoid 生成唯一id
import {nanoid} from "nanoid";
class Person extends Component {// 在类组件中,方法默认不会自动绑定 this。// 在构造函数中手动绑定 this// constructor(props) {//     super(props);//     this.addUserInfo = this.addUserInfo.bind(this); // 手动绑定this// }// addUserInfo  (){//     console.log(this.nameNode.value,this.ageNode.value,6665)// }// 使用箭头函数来自动绑定 this。addUserInfo = ()=>{let name = this.nameNode.valuelet age = this.ageNode.valuelet id = nanoid()this.props.addPerson({id,name,age}) // 传递参数this.nameNode.value = ''this.ageNode.value = ''console.log(this.props)}render() {return (<div><h2>我是person组件</h2><input ref={c=>this.nameNode = c} type="text" placeholder="请输入姓名" /><input ref={c=>this.ageNode = c} type="text" placeholder="请输入年龄" /><button onClick={this.addUserInfo}>添加个人信息</button><ul>{ // 需要花括号遍历数组this.props.persons.map((item)=>{return <li key={item.id}>id:{nanoid()}-姓名:{item.name} - 年龄:{item.age}</li>})}</ul></div>);}
}
export default connect(state=>({ persons:state.persons}),{addPerson})(Person)

6. 使用 Redux DevTools

参考链接:https://blog.csdn.net/pikaqiu_komorebi/article/details/145908046

自用

同步action,是指action的值为Object类型的一般对象。

异步action,是指action的值为函数 =⇒主要是因为函数能开启异步任务。

const a = b⇒({data:b})

求和案例_redux精简版
  1. 去除Count组件自身的状态

  2. src下建
    -redux ( -store.js -count_reducer.js )

  3. store.js:
    1)reducer本质就是一个函数,接受:preState,action,返回加工后的状态
    2)reducer有两个作用:初始化状态,加工状态
    3)reducer被第一次调用时,是store自动触发的,传递prestate是undefined

  4. count_reducer.js

     1)reducer本质就是一个函数,接受:preState,action,返回加工后的状态2)reducer有两个作用:初始化状态,加工状态3)reducer被第一次调用时,是store自动触发的,传递prestate是undefined
    
  5. index.js中检测store中状态的改变,一旦发生改变重新渲染

// 监听redux中状态的改变,如redux的状态发生了改变,重新渲染App组件store.subscribe(()=>{root.render(<App />); // 渲染应用})

备注:redux只负责管理状态,至于状态的改变驱动着页面的展示,需要自己去写

求和案例_redux异步action 版
  1. 明确:延迟的动作不想交给组件的自身,交给action ⇒ 异步动作

  2. 何时需要异步action:想要对状态进行操作,但是具体的数据靠异步任务返回(非必须)

  3. 具体编码:

    1)yarn add redux-thunk,并配置在store中;使用redux的中间件 applyMiddleware ,用于添加中间件redux-thunk功能。2)创建action 的函数不再返回一般对象,而是一个函数,该函数中写异步任务3)异步任务有结果后,分发一个同步的action 去真正操作数据
    
  4. 备注:异步action不是必须要写的,完全可以自己等待异步任务的结果再去分发同步action

求和案例_react-redux基本使用
  1. 明确两个概念

    1)UI组件:不能使用任何redux的api,只负责页面的呈现、交互等2)容器组件:负责和redux通信,并将结果交给UI组件
    
  2. 如何创建一个容器组件 — — — 靠react-redux的connect函数

    connect( mapStateToProps,mapDispatchToProps )( UI组件 )- mapStateToProps:映射状态,返回值是一个对象- mapStateToProps:映射操作状态的方法,返回值是一个对象UI组件通过props获取数据和方法;容器组件通过mapStateToProps,mapDispatchToProps传递
    
  3. 备注1:容器组件中的store是靠APP的props传进去的,而不是在容器中直接引入

  4. 备注2:mapDispatchToProps,也可以是一个对象,redux-redux内部调用分发action

  5. 备注3:容器组件能够自动检测store数据的变化,可去除store.subscribe(()⇒{})方法

  6. Provider能够给APP中所有的容器传递store,无需手动对容器组件传递store对象

  7. 合并文件,将容器组件和UI组件放到一起

求和案例_react-redux优化
  1. 容器组件和UI组件混成一个文件
  2. 无需手动给容器组件传递store,在index.js中给包裹一个即可。
// 引入核心库
import React from 'react';
// 创建根节点
import { createRoot } from 'react-dom/client';
import store from "./redux/store";
import { Provider } from "react-redux"
// 引入文件
import App from './App';
// 创建容器
const container = document.getElementById('root'); // 外壳
const root = createRoot(container); // 创建根节点root.render(<Provider store={store}><App /></Provider>
); 
  1. 使用了react-redux后不用自己监测redux中状态的改变,容器组件可自动监测
  2. mapStateToDispatch也可以简单的写成一个action对象,redux-redux可内部调用分发action
  3. 一个组件要和redux “打交道” 要经过哪几步
    1)定义好UI组件——不暴露
    2)引入connect生成容器组件,并暴露,写法如下
    3)在UI组件中通过this.props.xxxx读取状态和操作方法
connect(state⇒({key:value}), // 映射状态;value数值要根据总的Reducers取值(key:xxxAction) // 映射操作状态的方法 
)(UI组件)
求和案例_react-redux数据共享版
  1. 定义一个Person组件,和Count组件通过redux共享数据;
  2. 为Person组件编写:reducer、action、配置common常量
  3. 重点:Person的Reducer和Count的Reducer要使用combineReducers进行合并,合并后的总状态是一个对象
// 引入createStore,专门用于创建redux中最为核心的 store
import { createStore,applyMiddleware,combineReducers } from 'redux'
// 引入为Count组件服务的reducer
import countReducer from "./reducers/count"
import personReducer from "./reducers/person"
// 引入redux-thunk插件,用于支持异步action
import { thunk } from 'redux-thunk'
// combineReducers汇总所有的reducer变为一个总的reducer
const allReducers = combineReducers({countNum:countReducer,addPerson:personReducer
})
// 暴露store
export default createStore(allReducers,applyMiddleware(thunk))
  1. 交给store的是总reducer,最后注意在组件中取出状态的时候,取到位
求和案例_react-redux最终版
  1. 所有变量名称尽量触发对象的简写形式
  2. reducers文件夹中,编写index.js专门用于汇总并暴露所有的reducer

相关文章:

redux_旧版本

reduxjs/toolkit&#xff08;RTK&#xff09;是 Redux 官方团队推出的一个工具集&#xff0c;旨在简化 Redux 的使用和配置。它于 2019 年 10 月 正式发布&#xff0c;此文章记录一下redux的旧版本如何使用&#xff0c;以及引入等等。 文件目录如下&#xff1a; 步骤 安装依…...

⭐算法OJ⭐经典题目分类索引(持续更新)

在编程竞赛和算法学习中&#xff0c;Online Judge&#xff08;OJ&#xff09;平台是程序员们磨练技能的重要工具。OJ平台上的题目种类繁多&#xff0c;涵盖了从基础数据结构到复杂算法的各个方面。为了更好地理解和掌握这些题目&#xff0c;对其进行分类是非常有必要的。这篇索…...

python之使用scapy扫描本机局域网主机,输出IP/MAC表

安装scapy库 pip install scapy -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple扫描本机局域网的所有主机&#xff0c;输出IP/MAC对于表 # -*- coding: UTF-8 -*- import netifaces from scapy.all import srp from scapy.layers.l2 import ARP, Ether import ipa…...

Spring Boot中@Valid 与 @Validated 注解的详解

Spring Boot中Valid 与 Validated 注解的详解 引言 在Spring Boot应用中&#xff0c;参数校验是确保数据完整性和一致性的重要手段。Valid和Validated注解是Spring Boot中用于参数校验的两个核心注解。本文将详细介绍这两个注解的用法、区别以及代码样例。 Valid注解 功能介…...

18、TCP连接三次握手的过程,为什么是三次,可以是两次或者更多吗【高频】

三次握手的过程&#xff1a; 第一次握手&#xff1a;客户端 向 服务器 发送一个 SYN&#xff08;也就是同步序列编号报文&#xff09;&#xff0c;请求建立连接。随后&#xff0c;客户端 进入 SYN_SENT 状态&#xff1b;服务器收到 SYN 之后&#xff0c;由 LISTEN 状态变为 SYN…...

Ceph(2):Ceph简介

1 Ceph简介 Ceph使用C语言开发&#xff0c;遵循LGPL协议开源。Sage Weil(Ceph论文发表者)于2011年创立了以Inktank公司主导Ceph的开发和社区维护。2014年Redhat收购inktank公司&#xff0c;并发布Inktank Ceph企业版&#xff08;ICE&#xff09;软件&#xff0c;业务场景聚焦云…...

第二篇:CTF常见题型解析:密码学、逆向工程、漏洞利用、Web安全

# 零基础小白入门CTF解题到成为CTF大佬系列文章 ## 第二篇&#xff1a;CTF常见题型解析&#xff1a;密码学、逆向工程、漏洞利用、Web安全 ### 引言 在CTF比赛中&#xff0c;题目类型多种多样&#xff0c;涵盖了网络安全领域的多个方向。掌握这些题型的解题方法&#xff0c;…...

《Python基础教程》附录B笔记:Python参考手册

《Python基础教程》第1章笔记&#x1f449;https://blog.csdn.net/holeer/article/details/143052930 附录B Python参考手册 Python标准文档是完整的参考手册。本附录只是一个便利的速查表&#xff0c;当你开始使用Python进行编程后&#xff0c;它可帮助你唤醒记忆。 B.1 表…...

linux学习(十三)(shell编程(文字,变量,循环,条件,调试))

Shell 编程 Shell 编程&#xff0c;也称为 shell 脚本&#xff0c;是 Linux作系统不可或缺的一部分。shell 脚本实质上是系统 shell 执行的程序。虽然它可能不如 C 或 C 等编译语言强大&#xff0c;但 shell 编程对于管理级任务、自动执行重复性任务和系统监控非常有效。 大多…...

大模型微调中warmup(学习率预热)是什么

大模型微调中warmup(学习率预热)是什么 在大模型微调中,添加warmup(学习率预热)是指在训练初期逐步增加学习率,避免直接使用高学习率导致参数震荡。 🔧 为什么需要warmup? 大模型参数敏感:预训练模型的参数已接近最优,初期用大学习率可能剧烈扰动参数(如“急刹车…...

wireshark 如何关闭混杂模式 wireshark操作

Fiddler和Wireshark都是进行抓包的工具&#xff1a;所谓抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&#xff0c;也用来检查网络安全。抓包也经常被用来进行数据截取等。黑客常常会用抓包软件获取你非加密的上网数据&#xff0c;然后通过分析&#…...

ChatGPT4.5详细介绍和API调用详细教程

OpenAI在2月27日发布GPT-4.5的研究预览版——这是迄今为止OpenAI最强大、最出色的聊天模型。GPT-4.5在扩大预训练和微调规模方面迈出了重要的一步。通过扩大无监督学习的规模&#xff0c;GPT-4.5提升了识别内容中的模式、建立内容关联和生成对于内容的见解的能力&#xff0c;但…...

centos linux安装mysql8 重置密码 远程连接

1. 下载并安装 MySQL Yum 仓库 从 MySQL 官方网站下载并安装 Yum 仓库配置文件。 # 下载MySQL 8.0的Yum仓库包 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm # 安装Yum仓库包 sudo rpm -ivh mysql80-community-release-el7-5.noarch.rpm2. 启…...

AWS 如何导入内部SSL 证书

SSL 证书的很重要的功能就是 HTTP- > HTTPS, 下面就说明一下怎么导入ssl 证书,然后绑定证书到ALB. 以下示例说明如何使用 AWS Management Console 导入证书。 从以下位置打开 ACM 控制台:https://console.aws.amazon.com/acm/home。如果您是首次使用 ACM,请查找 AWS Cer…...

Unity DOTS从入门到精通之 自定义Authoring类

文章目录 前言安装 DOTS 包什么是Authoring1. 实体组件2. Authoring类 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世…...

一键换肤的Qt-Advanced-Stylesheets

项目简介 能在软件运行时对 CSS 样式表主题&#xff08;包括 SVG 资源和 SVG 图标&#xff09;进行实时颜色切换的Qt项目。 项目预览&#xff1a; 项目地址 地址&#xff1a;Qt-Advanced-Stylesheets 本地编译环境 Win11 家庭中文版 Qt5.15.2 (MSVC2019) Qt Creator1…...

golang 静态库 Undefined symbol: __mingw_vfprintf

正常用golang编译一个静态库给 其他语言 调用&#xff0c;编译时报错 Error: Undefined symbol: __mingw_vfprintf 很是奇怪&#xff0c;之前用用golang写静态库成功过&#xff0c;编译也没问题&#xff0c;结果却是截然不同。 试了很多次&#xff0c;发现唯一的差别就是在 …...

宝塔的ssl文件验证域名后,会在域名解析列表中留下记录吗?

在使用宝塔面板进行SSL证书验证域名后&#xff0c;通常不会在域名解析列表中留下记录。验证过程中添加的TXT记录仅用于验证域名的所有权&#xff0c;一旦验证完成&#xff0c;就可以安全地删除这些记录&#xff0c;不会影响SSL证书的正常使用。根据搜索结果&#xff0c;DNS验证…...

Linux 网络:skb 数据管理

文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. skb 数据管理 数…...

wireguard搭配udp2raw部署内网

前言 上一篇写了使用 wireguard 可以非常轻松的进行组网部署&#xff0c;但是如果服务器厂商屏蔽了 udp 端口&#xff0c;那就没法了 针对 udp 被服务器厂商屏蔽的情况&#xff0c;需要使用一款 udp2raw 或 socat 类似的工具&#xff0c;来将 udp 打包成 tcp 进行通信 这里以…...

Qwen/QwQ-32B 基础模型上构建agent实现ppt自动生成

关心Qwen/QwQ-32B 性能测试结果可以参考下 https://zhuanlan.zhihu.com/p/28600079208https://zhuanlan.zhihu.com/p/28600079208 官方宣传上是该模型性能比肩满血版 DeepSeek-R1&#xff08;671B&#xff09;&#xff01; 我们实现一个 使用Qwen/QwQ-32B 自动生成 PowerPoi…...

【Linux】使用问题汇总

#1 ssh连接的时候报Key exchange failed 原因&#xff1a;服务端版本高&#xff0c;抛弃了一些不安全的交换密钥算法&#xff0c;且客户端版本比较旧&#xff0c;不支持安全性较高的密钥交换算法。 解决方案&#xff1a; 如果是内网应用&#xff0c;安全要求不这么高&#xf…...

PostgreSQL17(最新版)安装部署

PostgreSQL 17已与2024年9月26日正式发布&#xff01;&#xff01;&#xff01; 一、Postgres概述 官网地址&#xff1a;PostgreSQL: The world’s most advanced open source database Postgres作为最先进的开源数据库&#xff08; the latest version of the world’s most…...

【AI大模型智能应用】Deepseek生成测试用例

在软件开发过程中&#xff0c;测试用例的设计和编写是确保软件质量的关键。 然而&#xff0c;软件系统的复杂性不断增加&#xff0c;手动编写测试用例的工作量变得异常庞大&#xff0c;且容易出错。 DeepSeek基于人工智能和机器学习&#xff0c;它能够依据软件的需求和设计文…...

【高级篇】大疆Pocket 3加ENC编码器实现无线RTMP转HDMI进导播台

【高级篇】大疆Pocket 3加ENC编码器实现无线RTMP转HDMI进导播台 文章目录 准备工作连接设备RTMP概念ENCSHV2推流地址设置大疆Pocket 3直播设置总结 老铁们好&#xff01; 很久没写软文了&#xff0c;今天给大家带了一个干货&#xff0c;如上图&#xff0c;大疆Pocket 3加ENC编…...

机器人交互系统 部署构建

环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境&#xff08;如未安装&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…...

Android Telephony 四大服务和数据网络控制面数据面介绍

在移动通信和Android系统中,涉及的关键概念和服务以及场景案例说明如下: 一、概念 (一)Android Telephony 的四大服务 介绍Telephony Data 与 Android Data 的四大服务在Android系统中,与电话(Telephony)和移动数据(Data)相关的核心服务主要包括以下四类: 1. Tele…...

创建模式-工厂方法模式(Factory Method Pattern)

江城子乙卯正月二十日夜记梦 目的动机简单工厂示例代码 目的 定义一个创建对象的接口&#xff0c;该接口的子类具体负责创建具体的对象。工厂方法模式将对象的实例化延迟到子类。简单工厂是直接在创建方法中负责所有的产品的生成&#xff0c;造成该方法臃肿&#xff0c;并且当…...

文心一言:中国大模型时代的破局者与探路者

2023年&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的浪潮席卷全球&#xff0c;而百度推出的“文心一言”&#xff08;ERNIE Bot&#xff09;作为中国AI领域的代表性产品&#xff0c;迅速成为行业焦点。这款基于百度自主研发的“文心大模型”打造的对话式AI工具&am…...

【eNSP实战】交换机配置端口隔离

交换机端口隔离可以实现在同一个VLAN内对端口进行逻辑隔离&#xff0c;端口隔离分为L2层隔离和L3层隔离&#xff0c;这里只进行L2层隔离演示。 拓扑图 路由器AR1配置GE 0/0/1配置IP&#xff0c;其余PC主机各自配置IP和网关。 现将PC1到PC4四个主机全部进行L2层隔离&#xff0c…...