- 博客(201)
- 收藏
- 关注
原创 【Solidity】类型
# Value TypeValue Type (值类型) 的变量在赋值或作为函数参数传递时,会复制其数据的值。1. **布尔类型**:```soliditycontract Demo { bool public isActive; // 默认为 false}```布尔值可以进行以下运算:- 逻辑运算:`!` (逻辑非)、`&&` (逻辑与)、`||` (逻辑或)- 比较运算:`==` (等于)、`!=` (不等于)其中,`&&` 和 `||` 是短路运算符
2024-09-10 22:41:22
812
原创 【Solidity】位运算及其应用
# 位运算位运算是一种对二进制数据进行操作的技术。**常用的位运算符**:1. 与运算(AND)`a & b`:对应位都为 1 时,结果为 1,否则为 02. 或运算(OR)`a | b`:对应位只要有一个为 1,结果为 13. 异或运算(XOR)`a ^ b`:对应位不同,结果为 1,相同为 04. 非运算(NOT)`~a`:将每个位取反,0 变 1,1 变 05. 左移运算(Left Shift)`a
2024-08-27 23:41:05
624
原创 【Solidity】创建合约
# assembly create`create` 方法通常在内联汇编中使用,用于动态创建、部署新合约,并获取新合约地址。`create` 方法的语法:`create(v, p, n)`- `v`:要发送的以太数量(以 wei 为单位)- `p`:指向 Creation ByteCode 的内存指针- `n`:Creation ByteCode 的长度注意事项:1. Solidity 中一般用 `msg.value` 获取以太数量,但在内联汇编中要用 `callvalu
2024-08-21 21:03:30
1288
原创 【Solidity】安全与校验
# 信息传输发送方 A:1. 计算消息 message 的哈希值 H:`hash(message) = H`2. 私钥 privateKey ➕ 哈希值 H 🟰 签名 signature:`signature = sign(H, privateKey)`3. 将消息 message 和签名 signature 发送给 B接收方 B:1. 计算消息 message 的哈希值 H1:`hash(message) = H1`2. 公钥 publicKey ➕ 签名 signature
2024-08-21 21:02:14
1234
原创 【Solidity】合约交互
# Delegate Call在当前合约通过 delegatecall 可以借用其他合约的方法,以更新当前合约的状态变量:```soliditycontract Demo { uint public num; uint public value; address public sender; function setVars(uint _num) public payable { num += _num; value += msg
2024-08-21 21:01:12
987
原创 【Solidity】合约交互基础
# 数据的编码与解码1. `abi.encode`:将给定的参数按照 ABI(应用二进制接口)规则编码成字节数组。编码后的数据总是 32 字节的倍数,不足 32 字节的部分会自动填充。适用于合约调用和数据传输。2. `abi.encodePacked`:与 `abi.encode` 类似。不同的是,它生成的字节数组是压缩过的,不会自动填充到 32 字节的倍数。适用于生成紧凑数据和哈希计算。3. `abi.decode`:将 `abi.encode` 返回的字节数组解码成原始数据。需要提供数据的类型信
2024-08-21 21:00:39
1061
原创 【Solidity】支付
# payable 修饰符以下函数需要使用 payable 修饰:① 需要接收以太币的函数;② 需要使用 `msg.value` / `callvalue()` 且可被外部访问的函数。```soliditycontract Demo { // 使用 payable 修饰构造函数, 使合约可以在部署时接收以太币 constructor() payable { require(msg.value > 0, "Must send some Ether"); }
2024-08-21 21:00:07
610
原创 【Solidity】继承
# 继承Solidity 中使用 `is` 关键字实现继承,子合约可以继承父合约的状态变量、函数、事件、装饰器:```soliditycontract Father { // 声明事件 event Log(string message, address sender); // 声明状态变量 uint public a = 10; address public owner = msg.sender; // 声明装饰器 modifier on
2024-08-18 22:56:04
590
原创 【Solidity】修饰符
# 访问修饰符- `private`:表示仅能在合约内部访问;可用于函数、状态变量- `internal`:表示能在合约内部或继承合约内部访问;可用于函数、状态变量- `public`:表示能在任何地方访问;可用于函数、状态变量- `external`:表示仅能在合约外部访问;仅可用于函数(但内部可以通过 `this.f()` 来调用)```soliditycontract Demo { uint private privateVar = 1; uin
2024-08-18 22:55:30
666
原创 【Solidity】函数的使用
# 函数Solidity 函数的定义格式如下:```function函数名(参数类型1 参数名名称1, ...){internal|external|public|private}[pure|view|payable][returns (返回值类型1 [返回值名称1], ...)] { // 函数体}```# 构造函数构造函数仅在合约部署时调用一次,主要用于初始化状态变量。```soliditycontract Demo { addre
2024-08-18 22:54:33
307
原创 【Solidity】复杂类型相关操作
# 操作 Enum```soliditycontract Demo { enum State { PENDING, ACTIVE, INACTIVE } State private state; // 更新 state function updateState(State _state) public { state = _state; } // 重置 state fun
2024-08-18 22:48:21
295
原创 【Solidity】变量 & 单位
# Variable**State Variable** (状态变量):状态变量是在合约内声明的变量,其数据存储在区块链上。```soliditycontract Demo { uint public count; // 声明状态变量 count}```**Local Variable** (本地变量):本地变量是在函数内声明的变量,其数据存储在内存中。函数执行完后,内存会被释放。```soliditycontract Demo { function calcula
2024-08-18 22:47:08
411
原创 【JavaScript】包装类
# 包装类JS 提供了三个主要的包装类:`String`、`Number`、`Boolean`。如果尝试把原始类型(`string`、`number`、`boolean`)数据当成对象使用,JS 会自动将其转换为对应包装类的实例。我们先来看一下 "基本类型数据" 及 "其包装类的实例" 之间的异同:```jsconst strPrimitive = "I am a string";const strObject = new String("I am a string");console.
2024-07-13 16:20:06
444
原创 【Vite】构建完成后自动生成压缩包
有时候我们需要在项目构建完成后自动生成一个压缩包,以便于我们将构建后的文件方便地分享给他人。这时候我们可以使用 vite-plugin-zip-pack 插件来实现这个功能。我们可以这样配置 vite.config.js:```jsimport { defineConfig } from 'vite';import zipPack from 'vite-plugin-zip-pack';import { name as packageName } from '../package.json';
2024-07-10 21:52:26
818
1
原创 【Vite】修改构建后的 index.html 文件名
在 Vite 项目中,默认构建 `index.html` 。但有时候我们需要修改 `index.html` 为其他文件名,比如 `index-{时间戳}.html` 。我们可以这样配置 vite.config.js:```jsimport { defineConfig } from 'vite';import type { PluginOption } from 'vite';// 自定义插件type RenameHtmlPlugin = () => PluginOption;cons
2024-07-10 21:46:40
1831
1
原创 【Vite】控制打包结构
配置 vite.config.json 文件:```tsimport { defineConfig } from 'vite';export default defineConfig({ build: { rollupOptions: { output: { assetFileNames(chunkInfo) { // css 文件 if
2024-06-23 20:33:50
588
4
原创 移动端适配方案
# 移动端适配方案 1:rem + html font-size方案 2:vw# rem + html font-sizerem 是相对于 html 元素的 font-size 来设置的单位,通过在不同屏幕尺寸下动态修改 html 元素的 font-size 可达到适配效果在开发中,我们只需要考虑两个问题:1. 针对不同的屏幕尺寸设置不同的 html font-size2. 将元素尺寸单位转为 rem## 动态设置 html font-siz
2024-04-30 11:26:03
1922
原创 重构文件上传行为
目标:将 [前端 → 后端] 改成 [前端 → 中间层 → 后端]**第一步:自定义上传行为(ElementPlus)**```html
2024-03-25 14:58:59
547
原创 【Network】加密方式
# 对称加密① 客户端生成密钥、② 客户端将密钥发送给服务端、③ 请求:客户端使用密钥加密数据并请求服务端,服务端使用密钥解密数据并处理;响应:服务端使用密钥加密数据并响应,客户端使用密钥解密数据并处理对称加密的问题:在 ② 中,可能会被中间人拦截并获取密钥,即可直接窃取、篡改数据。# 非对称加密① 服务端生成公钥和私钥、② 服务端将公钥发送给客户端、③ 请求:客户端使用公钥加密数据并请求服务端,服务端使用私钥解密数据并处理;响应:服务端使用私钥加密数据并响应,客户端使用
2024-03-03 21:10:04
930
原创 【NodeJS】fs 模块 (2)
# 流式文件写入 & 读取流式文件写入 / 读取适合操作**大文件**## 流式写入**① 创建可写流:`fs.createWriteStream(path[, options])`**1. `path`:文件路径2. `options`:配置对象 - `flags`:文件系统标志,默认值为 `'w'` - `encoding`:数据的编码格式,默认为 `utf8`- 返回值:WriteStream 对象```jsconst fs = requir
2024-02-03 22:59:10
1017
原创 在 EggJS 中实现 Redis 上锁
访问 https://github.com/microsoftarchive/redis/releases 选择版本进行下载 - 勾选 [配置到环境变量] - 无脑下一步并安装查看已安装的 Redis 版本,能成功查看就表示安装成功啦~
2024-01-20 23:30:40
956
原创 【JavaScript】history 对象
# history 对象history 提供与当前窗口的会话历史记录相关的 API。# 常用属性1. `length`:一个整数,表示会话历史的数目。2. `scrollRestoration`:允许 Web 应用程序在历史导航上显式地设置默认滚动恢复行为。 1. `auto`:恢复到用户已滚动到的页面上的位置。 2. `manual`:不恢复位置。3. `state`:一个任意值,表示历史堆栈顶部的状态。这是一种不必等待 popstate 事件而查看状态
2023-12-16 14:33:33
264
原创 【CSS】样式的计算过程
# 标签的 CSS 样式我们先来了解一下浏览器处理文件的标准流程。需要知道的是,下面的步骤是浏览加载网页的简化版本,而且不同的浏览器在处理文件的时候会有不同的方式,但是下面的步骤基本都会出现。1. 浏览器载入 HTML 文件(比如从网络上获取)。2. 将 HTML 文件转化成一个 DOM,DOM 是文件在计算机内存中的表现形式。3. 接下来,浏览器会拉取该 HTML 相关的大部分资源,比如嵌入到页面的图片、视频和 CSS 样式。4. 浏览器拉取到 CSS 之后会进行解析,根据选
2023-11-01 17:54:44
800
原创 【JavaScript】script 标签的使用
# script 标签script 标签之间共享顶层对象。```html var a = 1; console.log(a); // 1```但是全局变量作用域的提升机制在这些边界中不适用:```html foo(); function foo() { console.log('foo'); }
2023-10-31 22:10:32
1084
1
原创 【JavaScript】控制台 API
# console.logconsole.log 会将参数转为字符串 并输出到控制台。它会在参数之间输出空格,并在输出所有参数后重新开始一行。console.debug、console.info、console.warn、console.error 与 console.log 几乎相同。在 Node 中,console.error 将其输出发送到标准错误流,而不是标准输出流。除此之外的其他函数都是 console.log 的别名。在浏览器中,这几个函数生成的输出消息前面可能会带一个图标,表示
2023-08-01 10:55:06
333
原创 【JavaScript】数组方法 (ES6)
# 实例方法## find`arr.find(callback)` 用于获取第 1 个符合要求的元素:1. `callback`:`(item, index, arr) => boolean` `item`-当前值、`index`-当前索引、`arr`-当前数组- 返回值:`callback` 第一次返回 `true` 的对应 `item`;如果没有符合的元素,则返回 `undefined````jsconst arr = [50, 10, 201, 103, 62, 8
2023-07-31 21:17:12
844
原创 【Ajax】Ajax 简介
# Ajax 简介Ajax(Asynchronous JavaScript and XML)是一种用于创建交互式网页应用程序的技术。它通过使用 JavaScript、XML(现在更常用的是 JSON)和异步通信来实现在不重新加载整个页面的情况下与服务器进行数据交换。## Ajax 的优点1. 异步通信:Ajax 使用异步方式与服务器进行通信,不需要刷新整个页面,减少了不必要的数据传输和页面加载时间。2. 用户体验:通过部分更新页面内容,实现动态加载数据和实时更新,提升用户体验和交互
2023-07-28 16:44:52
1078
2
原创 【CSS】margin 的使用
# margin 的使用margin 用于设置元素的外边距。margin 是一个简写属性,包括以下 4 个子属性:- margin-top:上外边距。- margin-right:右外边距。- margin-bottom:下外边距。- margin-left:左外边距。margin 可以设置 1 ~ 4 个属性值:1. 一个属性值:一起设置上下左右。2. 两个属性值:分别设置上下、左右。3. 三个属性值:分别设置上、左右、下。4. 四个
2023-07-10 18:16:54
7487
原创 【CSS】盒模型
# 盒模型box-sizing 用于定义盒模型的计算方式。有以下 2 种取值:1. content-box:默认值。元素的宽度和高度只包含了内容。如果给元素设置了 padding 和 border,那么它们会被加到元素的实际宽高上,导致元素的实际尺寸比设定的尺寸要大。2. border-box:元素的宽度和高度包含了内容、padding 和 border。如果给元素设置了 padding 和 border,那么它们会从元素的内容区域中减去,使得元素的实际尺寸与设定的尺寸相同。
2023-07-10 18:13:56
570
原创 【CSS】CSS 常用单位
# 大小单位- 大小单位:`px`。- 字体相对单位:`em`、`rem`;根据 [font-size] 进行计算。- 视窗相对单位:`vm`、`vh`、`vmax`、`vmin`;根据 [视窗大小] 进行计算。## em、rem- `em`:相对于元素本身的 `font-size` 值。如果元素本身没有设置 `font-size`,会继承父元素的 `font-size`。- `rem`:相对于根元素(`html` 元素)的 `font-size` 值。
2023-07-10 18:02:49
677
原创 图片优化技术
# Data URLData URL 是一种将小型文件嵌入到网页中的方法。Data URL 的格式:```data: [][; base64], ```- `` 是媒体类型,例如图片可以是 `image/png`、`image/jpeg` 等,CSS 可以是 `text/css`,JavaScript 可以是 `application/javascript` 等。如果不指定媒体类型,则默认为 `text/plain`
2023-07-09 22:22:51
582
原创 【CSS】float 的使用
# float 的使用float 用于指定元素应沿其容器的左侧或右侧放置。1. 开启浮后,元素会变成行内块元素,即 `display: inline-block`。2. float 不会解析标签元素之间的空格。```html123``````cssdiv { float: left; /* 开启浮动 */ width: 100px; height: 100px;
2023-07-05 18:02:03
975
原创 【Node】介绍一下 package.json
- package.json 用于记录一些项目信息,比如项目名、版本号、项目描述、依赖包...- package.json 必须是一个合法的 JSON 文件,不能使用注释或者尾逗号等非标准语法- package.json 必须包含 name 和 version 字段,它们组成项目的唯一标识在日常开发中,项目的依赖包会被存放到 node_modules 目录下,因此 node_modules 文件夹的体积会很大,不方便团队之间的传输。通常我们会把 node_modules 目录配置到
2023-06-19 10:58:47
1804
原创 【Vite】对 CSS 处理
Vite 会使用 esbuild 或 PostCSS 来转换 CSS 文件Vite 解析 CSS 文件的过程:① 使用 fs 模块读取 .css 文件的内容② 创建一个 style 标签,将 .css 文件的内容 copy 到 style 标签内③ 将 style 标签插入到 index.html 的 head 标签中④ 将该 .css 文件的内容替换为 Js 脚本,以便于 CSS 模块化 & 热更新# CSS 模块化 (CSS Module)在协同开发时,可能会出现
2023-04-15 19:42:25
2602
原创 【NestJS】资源的上传和下载
# 上传资源multer 是一个基于 Express 的中间件,用于处理 `multipart/form-data` 格式的数据,主要用于上传文件。NestJS 内置了 multer,可以使用 @nestjs/platform-express 包中导出的 `FileInterceptor`、`FilesInterceptor` 等拦截器来使用 multer 的功能。1. **`npm i multer`、`npm i @types/multer -D`**2. **`nest g res use
2023-04-15 16:17:27
2469
2
原创 【Vite】环境变量的配置与使用
# 构建模式`defineConfig` 接收参数 `{ mode }`,这里的 `mode` 就是构建的模式```javascriptimport { defineConfig } from 'vite';export default defineConfig(({ mode }) => { console.log('mode', mode);});"scripts": { "dev": "vite", // 执行 `vite`, mode 为 development
2023-04-08 19:22:46
3024
原创 【NestJS】环境变量的配置与使用
# @nestjs/configNestJS 内置了 dotenv,并将其封装到 @nestjs/config 里面了1. `npm i @nestjs/config`2. 在 .env 文件中编写环境变量:```typescriptTOKEN_SECRET = 'superman'DB = 'mysql'DB_HOST = '127.0.0.1'```3. 在 app.module.ts 文件中全局配置 `ConfigModule`:```typescriptimport
2023-04-08 17:14:35
2563
原创 【NestJS】异常 & 过滤器
# 异常## 基础异常类NestJS 中 `HttpException` 为基础异常类。我们可以在应用程序中通过 `new HttpException(响应体, HTTP 状态码)` 创建该异常并抛出。这里的 `HTTP 状态码` 可以从 NestJS 内置的 `HttpStatus` 枚举中获取。```typescript@Get()findAll() { throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
2023-04-08 16:31:21
1274
原创 【NestJS】JWT 鉴权
[Passport](https://www.passportjs.org/) 是一个 NodeJS 鉴权库JWT 认证的交互流程:浏览器发起请求,服务端对用户名和密码进行验证。如果身份验证通过,服务端会基于用户信息生成 token 字符串,并将其响应给浏览器。浏览器会将 token 字符串存储起来。往后的每次请求,浏览器都会以请求头的形式带上 token 字符串。服务端收到请求后,会解析 token 字符串。如果 token 验证通过,则正常返回数据,否则抛出错误。
2023-02-23 00:14:07
1789
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人