p2p、分布式,区块链笔记(OrbitDB.ControlCenter 001): 在浏览器中运行 OrbitDB Control Center App.js

已知文件名取文件所在目录                                                                           何志丹已知文件名,如何取文件所在目录?最简单的方法是从后向前找"//".但有时,文件名中没有"//",这时要先转化一下.具体代码如下:CString GetPathName(const CString strPathFileName){ //取 阅读详情

项目简介

启动:npm start

  "scripts": {
    "start": "react-scripts --openssl-legacy-provider start",
    "build": "react-scripts --openssl-legacy-provider build",
    "test": "react-scripts test --env=./jestEnv.js",
    "eject": "react-scripts eject"
  },

index.js

  • src\index.js通过ReactDOM.render代码渲染组件的 DOM 节点root,将React Router包裹的APP组件渲染到root节点:
import React from 'react'
import ReactDOM from 'react-dom'
import { HashRouter as Router } from 'react-router-dom'

import './index.css'

import App from './App'
import * as serviceWorker from './serviceWorker'

ReactDOM.render(
  <Router>  // Router为React Router 提供的组件,用于处理应用中的路由。它包裹着 App 组件,确保在 App 内部的组件能够访问路由功能
    <App />
  </Router>,
  document.getElementById('root') // root页面可通过 npm i create-react-app ,npm create-react-app react-basic 创建 
)

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
//serviceWorker.unregister()

App.js

  • App.js 进行全局状态管理、路由管理、并根据路由进行总体界面结构渲染
function App () {
  const initialState = {
    user: null,
    loginDialogOpen: false,
    createDBDialogOpen: false,
    addDBDialogOpen: false,
    programs: [],
    program: false,
    db: null,
    entries: [],
    orbitdbStatus: 'Starting',
    ipfsStatus: 'Starting',
    loading: {
      programs: false
    }
  }
  
  // 用于状态管理部分的状态更新
  // 接收当前的 state 和一个 action,并根据 action 的类型返回新的状态
  const reducer = (state, action) => {
    switch (action.type) {
      case actions.SYSTEMS.SET_ORBITDB:
        return {
          ...state,
          orbitdbStatus: action.orbitdbStatus
        }
     …………
        return state
    }
  }

  return (
    <StateProvider initialState={initialState} reducer={reducer}>
     …………
    </StateProvider>
  )
}

export default App

界面部分

<StateProvider initialState={initialState} reducer={reducer}>
	<Pane background='tint1' height='100%'> // 创建一个背景为'tint1'且高度为100%的容器
	  <Header /> // 渲染页面的头部组件
	  <Systems /> // 渲染系统相关的组件
	  <Switch> // 用于在不同的路由之间进行切换
	    <Route path='/search'> // 定义'/search'路径的路由
	      <SearchResultsView /> // 渲染搜索结果视图组件
	    </Route>
	    <Route path='/orbitdb/:programName/:dbName'> // 定义包含参数的路径
	      <DatabaseView /> // 渲染数据库视图组件
	    </Route>
	    <Route path='/'> // 定义根路径的路由
	      <DatabasesView /> // 渲染数据库列表视图组件
	    </Route>
	  </Switch>
	</Pane>
</StateProvider>

Header

  • <Header /> 主要用于渲染页面的头部组件和处理搜索输入。
    在这里插入图片描述

Systems

  • Systems组件用于管理和显示 IPFS 和 OrbitDB 的状态,包含useEffect部分和渲染部分部分。

  • useEffect 部分:

    • 在组件挂载时,设置加载状态为 true。
    • 调用 initIPFS 初始化 IPFS,成功后更新状态为 IPFS 启动。
    • 接着调用 initOrbitDB 初始化 OrbitDB,成功后更新状态为 OrbitDB 启动。
    • 使用 getAllDatabases 获取所有数据库,反转其顺序后更新状态,并设置加载状态为 false。
    • React.useEffect 是一个副作用钩子,异步函数,用于在组件渲染后执行特定的代码。它接受两个参数:第一个是一个函数,该函数包含需要执行的副作用(如数据获取、订阅或手动更改 DOM);第二个是一个依赖数组,指定哪些变量变化时需要重新运行该副作用。下边为一个例子,当加载Welcome组件时,如果props.name发生变换,则进行document.title的修改:
import React, { useEffect } from 'react';
function Welcome(props) {
  useEffect(() => {
    document.title = `Hello, ${props.name}`;
  }, [props.name]);
  return <h1>Hello, {props.name}</h1>;
}
  • 渲染部分 部分:
    • 如果 IPFS 启动,则显示绿色的状态指示器,否则显示黄色的状态指示器。
    • 对于 OrbitDB,根据状态显示不同的指示器。
    • 渲染一个连接钱包的按钮ConnectToWalletButton标签。

在这里插入图片描述

import React from 'react' // 导入 React 库
import {
  majorScale, // 导入用于定义大尺寸的函数
  minorScale, // 导入用于定义小尺寸的函数
  Pane, // 导入用于创建容器的组件
  Text, // 导入用于显示文本的组件
  StatusIndicator // 导入状态指示器组件
} from 'evergreen-ui' // 从 evergreen-ui 库中导入以上组件

import { initIPFS, initOrbitDB, getAllDatabases } from '../database' // 导入数据库初始化和数据获取的函数
import { actions, useStateValue } from '../state' // 导入状态管理的 actions 和状态钩子

import ConnectToWalletButton from './ConnectToWalletButton' // 导入连接钱包按钮组件

function Systems () { // 定义 Systems 组件
  const [appState, dispatch] = useStateValue() // 使用状态钩子获取应用状态和 dispatch 函数

  React.useEffect(() => { // 使用副作用钩子
    dispatch({ type: actions.PROGRAMS.SET_PROGRAMS_LOADING, loading: true }) // 设置程序加载状态为 true

    initIPFS().then(async (ipfs) => { // 初始化 IPFS
      dispatch({ type: actions.SYSTEMS.SET_IPFS, ipfsStatus: 'Started' }) // 设置 IPFS 状态为 "Started"

      initOrbitDB(ipfs).then(async (databases) => { // 初始化 OrbitDB
        dispatch({ type: actions.SYSTEMS.SET_ORBITDB, orbitdbStatus: 'Started' }) // 设置 OrbitDB 状态为 "Started"

        const programs = await getAllDatabases() // 获取所有数据库
        dispatch({ type: actions.PROGRAMS.SET_PROGRAMS, programs: programs.reverse() }) // 设置程序列表,并反转顺序
        dispatch({ type: actions.PROGRAMS.SET_PROGRAMS_LOADING, loading: false }) // 设置程序加载状态为 false
      })
    })
  }, [dispatch]) // 依赖项为 dispatch,确保在其改变时重新运行副作用

  return ( // 渲染组件
    <Pane background='white' elevation={1}> {/* 白色背景的面板 */}
      <Pane
        display='flex' // 使用 flexbox 布局
        flexDirection='row' // 主轴方向为行
        alignItems='left' // 子项左对齐
        paddingX={majorScale(6)} // 左右内边距
        paddingY={majorScale(1)} // 上下内边距
      >
        <Pane display='flex' flexDirection='row' width='100%'> {/* 包含状态指示器和按钮的面板 */}
          <Text
            display='flex' // 使用 flexbox 布局
            alignItems='center' // 子项垂直居中对齐
            fontWeight='600' // 字体加粗
            marginRight={minorScale(1)} // 右外边距
          >
            Systems:
          </Text>
          {
            appState.ipfsStatus === 'Started' // 根据 IPFS 状态渲染相应的状态指示器
              ? <StatusIndicator color='success'>IPFS</StatusIndicator> // IPFS 状态为 "Started" 时显示成功状态
              : <StatusIndicator color='warning'>IPFS</StatusIndicator> // 否则显示警告状态
          }
          {
            appState.orbitdbStatus === 'Started' // 根据 OrbitDB 状态渲染相应的状态指示器
              ? <StatusIndicator color='success'>OrbitDB</StatusIndicator> // OrbitDB 状态为 "Started" 时显示成功状态
              : <StatusIndicator color='warning'>OrbitDB</StatusIndicator> // 否则显示警告状态
          }
          <ConnectToWalletButton style={{ marginLeft: 'auto' }} /> {/* 渲染连接钱包按钮,自动左侧外边距 */}
        </Pane>
      </Pane>
    </Pane>
  )
}

export default Systems // 导出 Systems 组件

状态管理

ArcMap新手必看:5分钟搞定面要素的四至信息提取(附字段重命名技巧) 本文为ArcMap新手提供了快速提取面要素四至信息的详细教程,包括数据准备、坐标系选择、批量处理技巧及字段重命名优化方案。通过实战步骤和Python脚本示例,帮助用户高效完成GIS数据处理任务,特别适合行政区划数据分析和报告生成。 阅读详情

相关推荐

各种逻辑漏洞

注册:短信轰炸验证码安全问题密码爆破邮箱轰炸用户任意注册、批量注册用户名枚举XSS(有框的地方就可以尝试插XSS)登录:短信轰炸、验证码安全问题、密码爆破、邮箱轰炸SQL注入撞库抓包把password字段修改为空值发送认证凭证替换、比如返回的数据包中包含账号,修改账号就能登录到其他账号Cookie仿冒修改返回包的相关数据,可能会登陆到其他的用户找回密码:短信邮箱轰炸、短信邮箱劫持重置任意用户账户密码、验证码手机用户未统一验证直接跳过验证步骤。

shirlly_的博客 2093

p2p、分布式,区块链笔记(OrbitDB.ControlCenter 002) : OrbitDB Control Center的状态管理 StateProvider

useContext基本用法 1. 创建 Context: 首先,你需要创建一个 Context 对象。 2. 提供 Context: 在组件树的某一层使用 来提供上下文值。 3. 消费 Context: 在子组件中,使用 来获取上下文的值。 Control Center的状态管理对象StateProvider 1. 创建 Context: 2. 提供 Context: 通过Context对象的Provider函数提供状态值 此代码通过Reducer 进行状态管理,状态值value通过函数获取

ResumeProject的博客 516

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

Time_1023的博客 1872

p2p、分布式,区块链笔记(OrbitDB.ControlCenter 004): 在浏览器中运行 OrbitDB Control Center 默认界面:src\views\Databases.js

handleRemoveDatabase会调用database的。组件,用于显示加载状态。

ResumeProject的博客 379

SAP PP未清生产订单关闭物料退料、新工单发料批量处理

( werks = '1001' lgort = 'A004' lgobe = '组装-成品组装' )( werks = '1002' lgort = 'C006' lgobe = '组装-二车间' )( werks = '1002' lgort = 'C007' lgobe = '组装-二车间' )( werks = '1001' lgort = 'A007' lgobe = '组装-MS' )( werks = '1001' lgort = 'A008' lgobe = '组装-GW' )

dingqing86的专栏 1192

大数据面试 逻辑题

逻辑题大致分为比较逻辑题、分析逻辑题、综合逻辑题、抽象逻辑题、概括逻辑题、推理逻辑题、论证逻辑题等,由于这类题比较考验综合素质,因此也一直是各大企业笔试、面试时经常喜欢考察的题目类型之一。很多童鞋认为逻辑题很难,其实不然。多做练习,打开思路,这类题还是可以轻易化解的。 下面为大家整理了网络上最全的75道逻辑判断测试题。在每道题目下方有答案,是用白色显示的,反选就可以看到啦~ 【1】假设有一个池...

zzq_0916s的博客 4421

iframe中链接新窗口打开

对于iframe不能在新窗口打开 <iframe id="myiframe" src="http://localhost:8080/Login.aspx" scrolling="no"></iframe> 1.添加 target="_blank" <a href="http://localhost:8080/HTMLPage.htm" target="_blank">This Page Link</a> 2.javascript window.locati

ResumeProject的博客 7546

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

泊松分布的矩母函数与特征函数

多媒体播放除HTML自带的 还有很多其他的第三方库如:video.js <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <

ResumeProject的博客 6902

基于相位检测与锁相环的DIY超声波风速仪设计与实现

相位检测是信号处理中的一项基础技术,它通过测量两个周期信号之间的相位差来获取信息。其核心原理在于,当信号在介质中传播时,外部因素(如风速)会改变其传播速度,从而导致接收端信号的相位发生偏移。锁相环(PLL)是实现高精度相位检测的关键电路,它能动态调整本地振荡器的频率,以跟踪并锁定输入信号的相位,从而将微小的相位变化转换为易于测量的电压信号。这项技术的工程价值在于其对电路精度要求相对较低,鲁棒性好,非常适合低成本、高灵敏度的测量应用。在气象监测、工业传感和消费电子等领域,相位检测技术被广泛用于风速风向测量、位

weixin_29540599的博客 387

服务部署之配置WSUS更新服务(基于Windows配置 Server 2022)

服务部署之配置WSUS更新服务(基于Windows配置 Server 2022)

2301_77192876的博客 2213

uniapp通过uni.request给this中的变量赋值

onLoad() { var that = this; uni.request({ url:'*****', data:{}, header:{'Content-Type':'application/x-www-form-urlencoded'}, success:(res)=>{ console.log(res) var data = res.data;

ResumeProject的博客 3058

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

【代码】DeepSeek R1-32B医疗大模型的完整微调实战指南(全码版)

AllenLV的博客 5101

p2p、分布式,区块链笔记: Libp2p分散打孔 2022 IEEE 第 42 届分布式计算系统国际会议研讨会 (ICDCSW)

我们提出了一种内置于对等网络库 libp2p [1] 中的去中心化打洞机制。打洞对于对等网络至关重要,它使每个参与者能够直接与任何其他参与者通信,尽管被防火墙和 NAT 隔开。去中心化的 libp2p 打洞协议利用了类似于 STUN(RFC 8489 [2])、TURN(RFC 8566 [3])和 ICE(RFC 8445 [4])的协议,而无需任何中心化基础设施。具体而言,它不需要任何有关网络参与者的先前知识,除了至少一个(任意)节点来引导对等发现。关键见解是,用于打洞的协议(即地址发现和中继协议)可以

ResumeProject的博客 2577

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【p2p、分布式,区块链笔记 MESH】 论文阅读 Thread/OpenThread Low-Power Wireless Multihop Net

【p2p、分布式,区块链笔记 MESH】 论文阅读 Thread/OpenThread Low-Power Wireless Multihop Net

ResumeProject的博客 2529

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

uni-app云打包失败

在清单中去掉权限配置:

ResumeProject的博客 2430

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

前端网站隐形水印的实现+zero-width-detection

1.将字符串转成二进制 函数: // 每个字符转为二进制,用空格分隔 const textToBinary = username => ( username .split('') // charCodeAt 将字符转成相应的 Unicode 码值 .map(char => char.charCodeAt(0).toString(2)) .join(' ') ); textToBinary(“教师节快乐”) 2.将0,

ResumeProject的博客 2295

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信拓扑与操作 BR/EDR(经典蓝牙)和 BLE

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信拓扑与操作 BR/EDR(经典蓝牙)和 BLE

ResumeProject的博客 2162

android html解析

html解析 package com.example.wangyebiancheng2; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import java.io.IOException; import java.net.MalformedURLException; import

ResumeProject的博客 2055

js : uniapp 同步

JavaScript Promise 对象 var myFirstPromise = new Promise(function(resolve, reject){ //当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...) //在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法. setTimeout(function(){ resolve("成

ResumeProject的博客 1898

JSmind在节点添加table

添加链接描述

ResumeProject的博客 1883

【GO学习笔记 go基础】编译器下载&安装+Go设置代理加速+项目调试+基础语法+go.mod项目配置+接口(interface)

关键字声明变量,也可以使用短变量声明。每个Go程序都必须属于某个包,通常是。用于定义自定义数据类型。包括条件语句和循环。

ResumeProject的博客 1760

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 & 定向转发机制

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 & 定向转发机制

ResumeProject的博客 1743

python http模块快速搭建“简单”服务器笔记 python -m http.sever

做了以上的启动之后就得到了一个文件服务器。我主要复制教你如何用几行Python代码编写出一个简易Web服务器的代码。在当前目录下创建C:\Users\admin\Desktop\http\cgi-bin文件夹,CGI-bin 是一个用于存放脚本的文件夹,这些脚本将与 Web 浏览器交互以提供网页或网站的功能。通用网关接口 (CGI) 是一种资源,用于在 Web 设计中使用脚本。当脚本从服务器发送到 Web 浏览器时,通常在 url 中引用 CGI-bin。,用于实现类似jsp的功能。但是大多数的博客都

ResumeProject的博客 1574

SIP广播,没有SIP服务器,一台手机APP的P2P广播会议方案。

开源项目ovmeet实现SIP协议下轻量级会议广播,无需传统服务器。通过P2P直连技术,手机可作为移动MCU/SFU节点,支持终端间点对点互呼、分组广播、分区音乐与应急对讲,兼容华为、宝利通等主流SIP设备。内网P2P+公网SIP双模组网,部署简单,开箱即用,适用于临时会议、应急指挥等场景,真正实现“免服务器、轻量组网、快速广播”。

fangji999的专栏 252

[Web3] 基础第5篇: 共识算法与 P2P 通信协议

CometBFT 采用Tentmint 共识,一种易于理解、基本异步的 BFT 共识算法。该算法遵循一个简单的状态机,如下所示:上图展示了 Tendermint BFT 共识流程,描述了一个区块从提议(Propose)到最终提交(Commit)的完整过程。Tendermint 共识采用三阶段投票机制(Prevote、Precommit、Commit) 来确保区块最终性。三阶段投票机制(Prevote → Precommit → Commit)需要 2/3 以上的投票支持 才能进入下一阶段。

OxYGC 139
上一篇: nodejs 014: React.FC 与 Evergreen(常青树) React UI 框架的的Dialog组件
下一篇: p2p、分布式,区块链笔记(OrbitDB.ControlCenter 002) : OrbitDB Control Center的状态管理 StateProvider
FakeOccupational
博客等级 码龄6年 2万+粉丝 1727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值