react-redux
React-Redux是一个用于在React应用中管理状态的第三方库。
它是基于Redux架构的,通过将Redux的核心概念和React组件相结合,提供一种在React应用中高效管理状态的方式。
React-Redux为React应用的状态管理提供了一种优雅的解决方案。
React-Redux在使用React-Redux时,通常会将组件的state抽离到一个全局的store进行管理。
这个store包含了应用的所有状态以及处理这种状态变化的方法。
1234567891011121314151617import React from 'react';import { createStore } from 'redux';import { Provider } from 'react-redux';import Reducers from './reducers';import App from './App';function AppContaine ...
页面权限控制
所谓的权限控制是什么?一般后台管理系统的权限涉及到两种:
资源权限
数据权限
资源权限一般指菜单、页面、按钮等的可见权限。
数据权限一般指对于不同用户,同一页面上看到的数据不同。
本文主要是来探讨一下资源权限,也就是前端权限控制。这又分为了两部分:
侧边栏菜单
路由权限
在很多人的理解中,前端权限控制就是左侧菜单的可见与否,其实这是不对的。举一个例子,假设用户guest没有路由/setting的访问权限,但是他知道/setting的完整路径,直接通过输入路径的方式访问,此时仍然是可以访问的。这显然是不合理的。这部分其实就属于路由层面的权限控制。
权限控制核心需要控制前端页面显示权限,后台Api的访问、操作权限。
通过auth server控制scope
Frontend通过scope确实页面显示
Backend api统一需要通过token校验,该判断由Nginx进行过滤
Backend api通过method和url比对,确认是否有操作权限
Login通过登录接口,判断用户的角色,响应对应的权限给到前端
https://localhost/api/token
参数
123 ...
华硕Z170提示cpu over voitage error错误
最近台式机开机时,提示错误信息,无法启动。错误信息如下
1234power supply surges detected during the previous power onASUS Anti-surge was triggered to protect system from uunstable power supply unitcpu over voitage errorpress F1 to Run setup
排查了很久,才解决了问题,特记录整个排查过程。
主板是华硕Z170-pro-gaming。使用华硕Z170芯片组。可以直接搜索z170的解决方法。
问题一次重新插拔了台式电脑电源后,就出现如下异常。
1234power supply surges detected during the previous power onASUS Anti-surge was triggered to protect system from uunstable power supply unitcpu over voitage errorpress F1 to Run s ...
Go设置跨域访问
在 Go 中,监听 0.0.0.0 IP 地址表示监听所有可用的网络接口,允许从任何 IP 地址访问服务。这意味着您的服务将接受来自本地主机以及其他网络上的任何 IP 地址的请求。
以下是一个简单的示例,展示如何在 Go 中监听 0.0.0.0 IP 地址:
1234567891011121314151617package mainimport ( "fmt" "net/http")func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, World!") }) err := http.ListenAndServe("0.0.0.0:8080", nil) if err != nil { fmt.Println("Failed to start server:", err) ...
React实现大文件分片上传
在本篇博客中,我们将介绍如何使用 React 实现大文件分块上传功能。我们将使用 axios 库来发送 HTTP 请求,以及使用 HTML5 中的 File API 来处理文件操作。
上一篇文章大文件分片上传,我们已经使用python实现了后台功能。现在我们使用React实现前段示例。
背景在 Web 开发中,当需要上传大型文件时,直接将整个文件一次性上传可能会导致性能问题,特别是在网络连接较慢或不稳定的情况下。为了解决这个问题,我们可以将大文件切分成多个小块(分片),分别上传每个小块,然后在服务器端将这些小块合并成完整的文件。
原理
用户选择要上传的文件。
前端根据分片大小将文件切分成多个小块。
逐个上传每个小块到服务器端。
服务器端接收并保存每个小块。
在服务器端,根据上传的小块将它们合并成完整的文件。
实现首先,我们需要安装 axios 库,它将用于发送 HTTP 请求。在项目的根目录下执行以下命令:
12Copy codenpm install axios
接下来,我们创建一个名为 FileUploader.js 的组件,其中包含了分块上传的逻辑。
下面是完整示例
12 ...
大文件分片上传
当处理大文件上传时,分块上传是一种常见的技术。它允许将大文件分成较小的块,并逐个上传这些块,以降低上传过程中的网络负载和内存占用。在本篇博客中,我们将使用Python来实现大文件分块上传的示例。
背景在传统的文件上传过程中,将整个大文件一次性上传可能会导致网络传输较慢和内存占用过高的问题。而使用分块上传可以将大文件划分为多个较小的块,分别上传,从而提高上传效率和系统性能。
原理大文件分块上传的原理是将大文件划分为多个固定大小的块,通常每个块的大小为几兆字节。然后,逐个上传每个块,并在服务器端将这些块合并成一个完整的文件。这种分块上传的方法允许在上传过程中进行断点续传、并行上传等操作。
以下是大文件分块上传的基本流程:
客户端将大文件切分为固定大小的块。
客户端逐个上传每个块到服务器端。
服务器端接收每个块并保存到临时存储位置。
当所有块都上传完成后,服务器端将这些块合并成一个完整的文件。
示例下面是一个使用Python实现大文件分块上传的示例代码:
第一步,确认文件名。/api/upload/init:用于初始化上传会话,返回一个文件 ID。
第二步,上传分片文件。/api/ ...
WebRTC视频通话
WebRTC提供了一套标准API,使Web应用可以直接提供实时音视频通信功能。大部分浏览器及操作系统都支持WebRTC,直接可以在浏览器端发起实时音视频通话,本文以WebRTC初学者的视角去完成一个1V1网页版实时音视频通话。
完成音视频通话需要了解四个模块:
音视频采集、
STUN/TURN 服务器、
信令服务器、
端与端之间P2P连接。
使用WebRTC的API完成音视频采集,配合信令服务器和WebRTC的RTCPeerConnection方法能实现1V1通话,简易流程如下图:
接下来依次讲解它们的作用和核心API。
目前这项Web技术支持的浏览器有chrome, firefox和safari。
WebRTC 有三个主要的API
getUserMedia - 采集本地音频和视频流
RTCPeerConnection - 用来创建对端连接并传输音视频的API
RTCDataChannel - 用于传输二进制数据。
WebRTC提供端对端的音视频通讯,不需要媒体服务器转发媒体数据,架构简化图如下,
WebRTC采集和传输音视频数据的过程可以分为三步进行
...
golang中的unsafe包详解
从golang的定义来看,unsafe 是类型安全的操作。顾名思义,它应该非常谨慎地使用; unsafe可能很危险,但也可能非常有用。例如,当使用系统调用和Go结构必须具有与C结构相同的内存布局时,您可能别无选择,只能使用unsafe。关于指针操作,在unsafe包官方定义里有四个描述:
任何类型的指针都可以被转化为Pointer
Pointer可以被转化为任何类型的指针
uintptr可以被转化为Pointer
Pointer可以被转化为uintptr
额外在加上一个规则:指向不同类型数据的指针,是无法直接相互转换的,必须借助unsafe.Pointer(类似于C的 void指针)代理一下再转换也就是利用上述的1,2规则。
举例:
1234567func Float64bits(f float64) uint64 { // 无法直接转换,报错:Connot convert expression of type *float64 to type *uint64 // return *(*uint64)(&f) // 先把*float64 转成 Po ...
go refilect官方文档
介绍计算机中的反射是指程序通过类型检查来检查其自身的结构的能力;这是一种元编程形式。但它也是一个巨大的困扰。
本文试图通过解释Go语言中的反射如何工作来澄清这些问题。每种语言的反射模型都是不同的(许多语言根本不支持反射),但本文是关于Go语言的,因此在本文的剩余部分中,“反射”这个词应该被理解为“Go语言中的反射”。
注:2022年1月增加:本文是在2011年编写的,比Go语言中的参数化多态(即通用类型)发展要早。虽然由于该语言开发中的发展,本文中的重要内容没有变化,但已在一些地方进行了微调,以避免混淆熟悉现代Go语言的人。
类型和接口由于反射是建立在类型系统之上的,让我们从Go语言中类型的基础知识开始。
Go语言是静态类型的。每个变量都有一个静态类型,也就是在编译时已知和固定的一个类型:int、float32、*MyType、[]byte等等。如果我们声明
1234type MyInt intvar i int var j MyInt
那么i的类型为int,j的类型为MyInt。变量i和j具有不同的静态类型,并且尽管它们具有相同的基础类型,但不能在没有转换的情况下互相赋值。
类 ...
go context包官方文档
Go并发模式:Context
在Go服务器中,每个传入的请求都在它自己的goroutine中处理。请求处理程序通常启动附加的goroutine来访问后端,例如数据库和RPC服务。在处理请求的一组goroutine通常需要访问请求特定的值,例如终端用户的身份,授权令牌和请求的截止时间。当请求被取消或超时时,所有正在处理该请求的goroutine应该快速退出,以便系统可以回收它们正在使用的任何资源。
在Google中,我们开发了一个Context包,使得在处理请求的所有涉及的goroutine之间跨API边界传递请求范围的值,取消信号和截止时间变得容易。该包作为context公开可用。本文介绍了如何使用该包并提供一个完整的工作示例。
ContextContext包的核心是Context类型:
1234567891011121314// Context 在 API 边界上携带截止时间、取消信号和请求范围的值。它的方法可以同时被多个 goroutine 安全使用。type Context interface { // Done 返回一个通道,该通道在此上下文被取消或超时时关闭。 ...