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

Fisco Bcos学习 - 开发第一个区块链应用

文章目录

    • 一、前言
    • 二、业务场景分析:简易资产管理系统
    • 三、智能合约设计与实现
      • 3.1 存储结构设计
      • 3.2 接口设计
      • 3.3 完整合约代码
    • 四、合约编译与Java接口生成
    • 五、SDK配置与项目搭建
      • 5.1 获取Java工程项目
      • 5.2 项目目录结构
      • 5.3 引入Web3SDK
      • 5.4 证书与配置文件
    • 六、业务开发:Java客户端实现
      • 6.1 核心类设计:AssetClient
        • 6.1.1 初始化
        • 6.1.2 合约对象创建
        • 6.1.3 接口调用
    • 七、项目运行与功能验证
      • 7.1 编译项目
      • 7.2 部署合约
      • 7.3 注册资产
      • 7.4 查询资产
      • 7.5 资产转移
    • 八、参考资料

一、前言

在区块链技术快速发展的今天,如何将其应用于实际业务场景成为开发者关注的重点。FISCO BCOS作为国产优秀的联盟链平台,为企业级区块链应用开发提供了强大支持。本文将跟随官方教程,详细记录基于FISCO BCOS构建第一个区块链应用的全过程,涵盖从业务分析到最终实现的完整流程。

二、业务场景分析:简易资产管理系统

区块链技术因其防篡改、可追溯的特性,在金融领域有着天然优势。本次实践选择开发一个简易的资产管理系统,主要实现以下核心功能:

  • 资产注册:在区块链上登记资产账户及初始金额
  • 资产转账:实现不同账户间的资产转移
  • 资产查询:查询指定账户的资产余额

这个场景虽然简单,但涵盖了区块链应用开发的核心流程,非常适合作为入门案例。

三、智能合约设计与实现

3.1 存储结构设计

FISCO BCOS提供了合约CRUD接口开发模式,允许通过合约创建表结构并进行数据操作。针对资产管理需求,设计了名为t_asset的表:

  • account:资产账户,作为主键(string类型)
  • asset_value:资产金额(uint256类型)

该表结构示例如下:

accountasset_value
Alice10000
Bob20000

3.2 接口设计

根据业务目标,定义了三个核心接口:

  • select(string account):查询资产金额
  • register(string account, uint256 amount):资产注册
  • transfer(string from_asset_account, string to_asset_account, uint256 amount):资产转移

3.3 完整合约代码

pragma solidity ^0.4.24;
import "./Table.sol";contract Asset {// 事件定义,用于记录关键操作event RegisterEvent(int256 ret, string account, uint256 asset_value);event TransferEvent(int256 ret, string from_account, string to_account, uint256 amount);constructor() public {// 构造函数中创建表createTable();}function createTable() private {TableFactory tf = TableFactory(0x1001);// 创建t_asset表,指定主键和字段tf.createTable("t_asset", "account", "asset_value");}function openTable() private returns (Table) {TableFactory tf = TableFactory(0x1001);Table table = tf.openTable("t_asset");return table;}// 查询资产金额function select(string account) public constant returns (int256, uint256) {Table table = openTable();Entries entries = table.select(account, table.newCondition());uint256 asset_value = 0;if (0 == uint256(entries.size())) {return (-1, asset_value);} else {Entry entry = entries.get(0);return (0, uint256(entry.getInt("asset_value")));}}// 资产注册function register(string account, uint256 asset_value) public returns (int256) {int256 ret_code = 0;int256 ret = 0;uint256 temp_asset_value = 0;(ret, temp_asset_value) = select(account);if (ret != 0) {Table table = openTable();Entry entry = table.newEntry();entry.set("account", account);entry.set("asset_value", int256(asset_value));int count = table.insert(account, entry);if (count == 1) {ret_code = 0;} else {ret_code = -2;}} else {ret_code = -1;}emit RegisterEvent(ret_code, account, asset_value);return ret_code;}// 资产转移function transfer(string from_account, string to_account, uint256 amount) public returns (int256) {int ret_code = 0;int256 ret = 0;uint256 from_asset_value = 0;uint256 to_asset_value = 0;// 检查转出账户是否存在(ret, from_asset_value) = select(from_account);if (ret != 0) {ret_code = -1;emit TransferEvent(ret_code, from_account, to_account, amount);return ret_code;}// 检查转入账户是否存在(ret, to_asset_value) = select(to_account);if (ret != 0) {ret_code = -2;emit TransferEvent(ret_code, from_account, to_account, amount);return ret_code;}// 检查余额是否充足if (from_asset_value < amount) {ret_code = -3;emit TransferEvent(ret_code, from_account, to_account, amount);return ret_code;}// 检查金额是否溢出if (to_asset_value + amount < to_asset_value) {ret_code = -4;emit TransferEvent(ret_code, from_account, to_account, amount);return ret_code;}Table table = openTable();Entry entry0 = table.newEntry();entry0.set("account", from_account);entry0.set("asset_value", int256(from_asset_value - amount));int count = table.update(from_account, entry0, table.newCondition());if (count != 1) {ret_code = -5;emit TransferEvent(ret_code, from_account, to_account, amount);return ret_code;}Entry entry1 = table.newEntry();entry1.set("account", to_account);entry1.set("asset_value", int256(to_asset_value + amount));table.update(to_account, entry1, table.newCondition());emit TransferEvent(ret_code, from_account, to_account, amount);return ret_code;}
}

注意:该合约依赖FISCO BCOS提供的系统合约Table.sol,实现对表的CRUD操作

四、合约编译与Java接口生成

Solidity合约无法被Java程序直接调用,需要通过控制台工具将其编译为Java类。具体步骤如下:

  1. Asset.solTable.sol放在console/contracts/solidity目录
  2. 执行编译脚本:
# 切换到console目录
cd ~/fisco/console/
# 编译合约,指定Java包名
./sol2java.sh org.fisco.bcos.asset.contract

编译成功后会在console/contracts/sdk目录生成:

  • abi目录:存放合约ABI文件
  • bin目录:存放合约字节码文件
  • java目录:存放生成的Java合约类

生成的Asset.java包含了与Solidity合约对应的Java接口:

package org.fisco.bcos.asset.contract;
public class Asset extends Contract {// 转账接口public RemoteCall<TransactionReceipt> transfer(String from_account, String to_account, BigInteger amount);// 注册接口public RemoteCall<TransactionReceipt> register(String account, BigInteger asset_value);// 查询接口public RemoteCall<Tuple2<BigInteger, BigInteger>> select(String account);// 加载合约public static Asset load(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider);// 部署合约public static RemoteCall<Asset> deploy(Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider);
}

五、SDK配置与项目搭建

5.1 获取Java工程项目

# 下载项目压缩包
cd ~
curl -LO https://github.com/FISCO-BCOS/LargeFiles/raw/master/tools/asset-app.tar.gz
# 解压项目
tar -zxf asset-app.tar.gz

5.2 项目目录结构

asset-app/
├── build.gradle          # Gradle配置文件
├── gradle/
│   ├── wrapper/
│   │   ├── gradle-wrapper.jar
│   │   └── gradle-wrapper.properties
├── gradlew               # Linux执行脚本
├── gradlew.bat           # Windows执行脚本
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── org/
│   │   │       └── fisco/
│   │   │           └── bcos/
│   │   │               └── asset/
│   │   │                   ├── client/      # 客户端调用类
│   │   │                   │   └── AssetClient.java
│   │   │                   └── contract/    # 合约Java类
│   │   │                       └── Asset.java
│   │   └── resources/
│   │       ├── applicationContext.xml       # 项目配置文件
│   │       ├── contract.properties          # 合约地址配置
│   │       ├── log4j.properties             # 日志配置
│   │       └── contract/
│   │           ├── Asset.sol                # Solidity合约
│   │           └── Table.sol
├── tool/
│   └── asset_run.sh     # 运行脚本

5.3 引入Web3SDK

项目已在build.gradle中配置好Web3SDK依赖:

repositories {maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }maven { url "https://dl.bintray.com/ethereum/maven/" }mavenCentral ()
}dependencies {compile('org.fisco-bcos:web3sdk:2.1.0')
}

5.4 证书与配置文件

拷贝区块链节点的SDK证书到项目资源目录:

cp fisco/nodes/127.0.0.1/sdk/* asset-app/src/test/resources/

六、业务开发:Java客户端实现

6.1 核心类设计:AssetClient

AssetClient.java是业务逻辑的核心,负责合约的部署与调用,主要包含以下功能模块:

6.1.1 初始化
// 初始化Web3j和Credentials对象
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
Service service = context.getBean(Service.class);
service.run();ChannelEthereumService channelEthereumService = new ChannelEthereumService();
channelEthereumService.setChannelService(service);
Web3j web3j = Web3j.build(channelEthereumService, 1);Credentials credentials = Credentials.create(Keys.createEcKeyPair());
6.1.2 合约对象创建
// 部署合约
Asset asset = Asset.deploy(web3j, credentials, new StaticGasProvider(gasPrice, gasLimit)).send();// 加载已部署合约
Asset asset = Asset.load(contractAddress, web3j, credentials, new StaticGasProvider(gasPrice, gasLimit));
6.1.3 接口调用
// 查询资产
Tuple2<BigInteger, BigInteger> result = asset.select(assetAccount).send();// 注册资产
TransactionReceipt registerReceipt = asset.register(assetAccount, amount).send();// 资产转账
TransactionReceipt transferReceipt = asset.transfer(fromAccount, toAccount, amount).send();

七、项目运行与功能验证

7.1 编译项目

# 切换到项目目录
cd ~/asset-app
# 编译项目
./gradlew build

编译成功后在dist目录生成运行脚本。

7.2 部署合约

cd dist
bash asset_run.sh deploy
# 输出示例:Deploy Asset successfully, contract address is 0xd09ad04220e40bb8666e885730c8c460091a4775

7.3 注册资产

bash asset_run.sh register Alice 100000
# 输出:Register account successfully => account: Alice, value: 100000bash asset_run.sh register Bob 100000
# 输出:Register account successfully => account: Bob, value: 100000

7.4 查询资产

bash asset_run.sh query Alice
# 输出:account Alice, value 100000bash asset_run.sh query Bob
# 输出:account Bob, value 100000

7.5 资产转移

bash asset_run.sh transfer Alice Bob 50000
# 输出:Transfer successfully => from_account: Alice, to_account: Bob, amount: 50000bash asset_run.sh query Alice
# 输出:account Alice, value 50000bash asset_run.sh query Bob
# 输出:account Bob, value 150000

八、参考资料

  • FISCO BCOS文档:https://www.bookstack.cn/read/fisco-bcos-2.4-zh

相关文章:

Fisco Bcos学习 - 开发第一个区块链应用

文章目录 一、前言二、业务场景分析&#xff1a;简易资产管理系统三、智能合约设计与实现3.1 存储结构设计3.2 接口设计3.3 完整合约代码 四、合约编译与Java接口生成五、SDK配置与项目搭建5.1 获取Java工程项目5.2 项目目录结构5.3 引入Web3SDK5.4 证书与配置文件 六、业务开发…...

黑马python(十六)

目录&#xff1a; 1.JSON数据格式的转换 2.pyecharts模块简介 3.pyecharts入门使用 4.数据准备 5.生成折线图 1.JSON数据格式的转换 2.pyecharts模块简介 官方网站&#xff1a; 画廊网站:有更多的图标形式 测试是否安装 3.pyecharts入门使用 运行会生成一个html的文件&a…...

完成国产化替代!昆明卷烟厂用时序数据库 TDengine 重塑工业时序数据平台

小T导读&#xff1a;昆明卷烟厂作为红云红河烟草&#xff08;集团&#xff09;有限责任公司的重要组成部分&#xff0c;是集团卷烟生产的核心工厂。早期在建设制造执行系统&#xff08;MES&#xff09;时&#xff0c;其采用了 Wonderware 平台的时序数据存储功能模块&#xff0…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | BackgroundSlider(背景滑块)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— BackgroundSlider组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> …...

Wpf的Binding

前言 wpf的Binding就像一个桥梁&#xff0c;它的作用就是连接逻辑层与界面层&#xff0c;既能够把逻辑层的数据搬到界面层展示&#xff0c;又能将界面层的数据更改后传递到逻辑层&#xff0c;Binding的数据来源就是Binding的源&#xff0c;数据展示的地方就是Binding的目标。 …...

Redis—持久化

持久化 在mysql当中&#xff0c;有4个比较关心的特性&#xff0c;分别是原子性、一致性、隔离性和持久性。这里的持久性和持久化是一回事。我们该如何判断是否具有持久性呢&#xff1f;答案就是看重启进程或者主机之后&#xff0c;数据是否存在。当我们把数据存储在硬盘上是就…...

Spring Boot中日志管理与异常处理

以下是Spring Boot中日志管理与异常处理的系统化实践指南&#xff0c;结合最佳实践与核心配置&#xff0c;确保应用健壮性与可维护性。 &#x1f4ca; 一、日志管理核心配置 默认框架与级别控制 Logback 是Spring Boot默认日志框架&#xff0c;通过application.yml快速配置&…...

基于MATLAB的BP神经网络的心电图分类方法应用

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 心电图&#xff08;ECG&#xff09;是临床诊断心血管疾病的重要工具&#xff0c;能够反映心脏电活动的周期性变化。…...

【笔记】Docker 配置阿里云镜像加速(公共地址即开即用,无需手动创建实例)

2025年06月25日记 【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记&#xff08;附 异常处理&#xff09;-CSDN博客 【笔记】解决 WSL 迁移后 Docker 出现 “starting services: initializing Docker API Proxy: setting up docker ap” 问题…...

Java 中LinkedList 总结

406.根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高…...

微信小程序 / UNIAPP --- 阻止小程序返回(顶部导航栏返回、左 / 右滑手势、安卓物理返回键和调用 navigateBack 接口)

目录 理解page-container的原理 设置禁止点击遮盖层关闭&#xff1f; 阻止左滑返回 理解page-container的原理 page-container组件的所有属性&#xff0c;最重要的是show值。在页面上引入这个组件后&#xff0c;若show值为true&#xff0c;页面上所有各种方式触发的返回操作…...

Linux基本指令篇 —— mv指令

在Windows中我们经常使用CtrlX和CtrlV将一个地方的文件或目录移动到另一个地方&#xff0c;我们若是要在Linux当中完成此操作&#xff0c;则需要使用mv指令。mv 是 Linux 系统中用于移动或重命名文件和目录的基本命令之一&#xff0c;是 "move" 的缩写。下面将详细介…...

基于STM32的智能节能风扇的设计

基于STM32的智能节能风扇的设计 内容:1.摘要 本设计旨在解决传统风扇能耗高、功能单一的问题&#xff0c;提出一种基于STM32的智能节能风扇。通过结合温度传感器、人体红外传感器等多种传感器&#xff0c;利用STM32微控制器实现对风扇的智能控制。经过实际测试&#xff0c;该智…...

HCIA-IP路由基础

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 ​ 本篇笔记是根据B站上的视频教程整理而成&#xff0c;感谢UP主的精彩讲解&#xff01;如果需要了解更多细节&#xff0c;可以参考以下视频&#xf…...

Linux 内存管理之page cache

文章目录 一、page cache1.1 File-backed pages和Anonymous pages1.2 page cache/slab cache1.3 读/写路径1.4 脏页回写1.5 drop_caches1.6 时间局部性与空间局部性1.7 Page Cache 的两种类型1.8 关键数据结构 二、Page Cache 的产生2.1 Buffered I/O&#xff08;标准 I/O&…...

uniApp实战四:网络请求封装

文章目录 1.最终效果预览2.请求封装3.创建config配置文件4.创建api请求5.页面调用 说明&#xff1a;当前笔记基于Vue3开发&#xff0c;HbuilderX版本4.66 1.最终效果预览 2.请求封装 在util/request.js下创建js文件&#xff0c;代码如下 import config from /configconst tim…...

sentinel 自定义 dashboard 用户名密码

默认情况下&#xff0c;sentinel dashboard 用户名密码为 sentinel / sentinel &#xff0c;这里我使用重写 镜像的方式&#xff1a; // 定义 Dockerfile $ cat Dockerfile # 基于现有 Sentinel Dashboard 镜像 FROM bladex/sentinel-dashboard:1.8.4# 重新定义 ENTRYPOINT&…...

Fisco Bcos学习 - 搭建星形拓扑组网

文章目录 一、前言二、环境准备与依赖安装2.1 系统要求2.2 依赖安装 三、星形拓扑设计与节点规划四、使用build_chain.sh构建星形拓扑4.1 创建操作目录并获取脚本4.2 生成星形拓扑配置文件4.3 执行构建命令4.4 查看生成的节点文件 五、启动节点与共识验证5.1 启动所有节点5.2 查…...

深度学习入门--(二)感知机

一.感知机是什么 简单的输入和输出&#xff0c;感觉&#xff08;输入&#xff09;&#xff0c;知道&#xff08;输出&#xff0c;作出反应&#xff09; 二.简单逻辑电路 2.1与门 import numpy as np #AND def AND(X1,X2):w1,w2,thera0.5,0.5,0.7tmpX1*w1X2*w2if tmp>the…...

LeetCode 3298.统计重新排列后包含另一个字符串的子字符串数目2

给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新排列后&#xff0c;word2 是重排字符串的 前缀 &#xff0c;那么我们称字符串 x 是 合法的 。 请你返回 word1 中 合法 子字符串 的数目。 注意 &#xff0c;这个问题中的内存限制比其他题目要 小 &#xff0c;所以你…...

【nRF52832】【环境搭建 1】【ubuntu下搭建nRF52832开发环境】

本文讲述如何在 ubuntu 22.04 下开发 nRF52832. host 环境说明: $ uname -a Linux leo 6.8.0-60-generic #63~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 22 19:00:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux1. 安装软件 sudo apt install gcc-arm-none-eabisudo apt-get i…...

Django

1. Django 和 Tornado 的关系 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。Django 遵循 MVC&#xff08;模型-视图-控制器&#xff09;设计模式的一个变种&#xff0c;称为 MTV&#xff08;模型-模板-视图&#xff09;。Django 框架提供…...

51c嵌入式~CAN~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/14016935 一、CAN总线常见信号干扰问题 定位干扰原因 当总线有干扰时&#xff0c;有经验的工程师能够迅速定位&#xff0c;但是对于新手来说却很麻烦。 造成总线干扰的原因有很多&#xff0c;比如通过电磁辐射耦合到通…...

【iOS】iOS崩溃总结

【iOS】iOS崩溃总结 一、前言 之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》&#xff0c;浏览量、收藏率和点赞量还挺高&#xff0c;还被收录了&#xff0c;就想着总结一下iOS崩溃&#xff0c;这个也是在iOS面试中经常被问到的。 在 iOS 开发过程中&#xff0c;导致…...

npm 报错:“无法加载文件 ...npm.ps1,因为在此系统上禁止运行脚本” 解决方案(附执行策略说明)

在使用 npm 命令时&#xff0c;部分 Windows 用户可能会遇到如下错误&#xff1a; npm : 无法加载文件 D:\nvm4w\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https://go.microsoft.com/fwlink/?LinkID135170 中的 about_Executi…...

AES加密:为你的PDF文档加上一道钢铁防线

在数字化时代&#xff0c;确保敏感数据的安全性至关重要。加密技术在保护信息免受未经授权访问方面起着关键作用。而在众多加密标准中&#xff0c;AES&#xff08;高级加密标准&#xff09;因其强大的安全性和广泛的应用而脱颖而出。那么&#xff0c;AES加密如何应用到PDF文档中…...

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(一)

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷&#xff08;一&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书DCRS:DCFW:DCWS:WAF: 第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响…...

1688商品发布API:自动化上架与信息同步

一、1688商品发布API的核心功能与技术架构 1.1 API功能全景 1688商品发布API是1688开放平台的核心组件之一&#xff0c;支持商品信息的自动化发布、编辑、上下架及库存同步。其核心功能包括&#xff1a; 商品信息管理&#xff1a;支持商品标题、描述、价格、库存、SKU&#…...

鸿蒙ArkUI---基础组件Tabs(Tabbar)

基础页面组件 Tabs 作用&#xff1a; 快速创建Tabbar 个人理解&#xff1a; 快速的创建Tabar。 效果图&#xff1a; 代码&#xff1a;interface TabItem {icon: Resource; //未选中activeIcon: Resource; //选中name: string; //文字 }Entry Component struct Index {// st…...

50. Pow(x, n)快速幂算法

实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。此函数应将 x 作为浮点数&#xff08;意味着它可以是十进制数&#xff09;和 n 作为整数&#xff08;可以是正数、负数或零&#xff09;一起使用。 快速幂&#xff08;Expo…...

Python函数

三.函数进阶 0.定义 函数三要素&#xff1a;函数名&#xff0c;参数&#xff0c;返回值&#xff0c;其中只有函数名是必须要的&#xff0c;参数&#xff0c;返回值可以没有 语法&#xff1a; def 函数名&#xff08;参数&#xff09;&#xff1a; 函数体 return 返回值 1.…...

7.Spring框架

# spring框架Spring3.0开启了纯注解开发模式&#xff0c;使用Java类替代配置文件&#xff0c;开启了Spring快速开发赛道## 为什么要使用 **Spring** 框架&#xff1f;​ Spring 是一个轻量级应用框架&#xff0c;它提供了 IoC 和 AOP 这两个核心的功能。它的核心目的是为了…...

计算机网络-----详解HTTP协议

✏️1. 什么是HTTP HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的应⽤层协议&#xff08;所谓 “超⽂本” 的含义, 就是传输的内容不仅仅是⽂本(⽐如 html, css 这个就是⽂本), 还可以是⼀些其他的资源, ⽐如图⽚, 视频, ⾳频等⼆进制的数据&#xff09;。 HTTP 诞⽣…...

解决npm安装依赖报错ERESOLVE unable to resolve dependency tree

在使用 npm 安装项目依赖时&#xff0c;有时会遇到错误信息 “npm ERR! code ERESOLVE”&#xff0c;该错误通常发生在依赖版本冲突或者依赖解析问题时。本文将详细介绍出现这个错误的原因&#xff0c;并提供解决方法&#xff0c;确保正确安装项目依赖并避免该错误的发生。 一…...

微信小程序安卓手机输入框文字飘出输入框

最近在开发微信小程序遇到一个问题&#xff0c;安卓手机输入框文字飘出输入框&#xff0c;但是ios系统的手机则正常。 使用情景&#xff1a;做了一个弹窗&#xff0c;弹窗内是表单&#xff0c;需要填写一些信息&#xff0c;但是在填写信息时光标不显示&#xff0c;输入的内容飘…...

python网络自动化-数据格式与数据建模语言

数据格式 在Python网络运维自动化最基本是JSON、YAML和XML这3种数据格式。除了这3种常用的数据格式&#xff0c;还有一种深受网络工程师喜爱且在网络运维自动化中常用的数据承载方式——表格 需要注意的是JSON的键必须用双引号包裹&#xff0c;JSON的对象数据键值对的值和数组…...

C++ 中的 atan2 函数:深入解析与应用

在 C 编程中&#xff0c;数学计算是许多应用场景的核心&#xff0c;例如几何问题、物理模拟和游戏开发等。atan2 函数作为数学库中的一个重要工具&#xff0c;提供了比普通反正切函数更强大的功能。本文将深入解析 atan2 函数的原理、使用方法以及实际应用场景&#xff0c;并通…...

云计算-Azure Functions :构建事件驱动的云原生应用报告

云计算导论 课程研究报告 Azure Functions &#xff1a;构建事件驱动的云原生应用 摘要&#xff1a; Azure Functions 是一种无服务器解决方案&#xff0c;是由微软 Azure 平台提供的&#xff0c;可以使用户专注于业务逻辑&#xff0c;减少代码的编写&#xff0c;减少需要维护…...

【笔记——李沐动手学深度学习】2.3 线性代数

2.3.1 标量 标量由只有一个元素的张量表示。 下面的代码将实例化两个标量&#xff0c;并执行一些熟悉的算术运算&#xff0c;即加法、减、乘法、除法和指数。 2.3.2 向量 人们通过一维张量表示向量。一般来说&#xff0c;张量可以具有任意长度&#xff0c;取决于机器的内存限…...

多个 Job 并发运行时共享配置文件导致上下文污染,固化 Jenkins Job 上下文

基于 context.py 固化 Jenkins Job 上下文的完整方案&#xff0c;适用于你当前的工作流&#xff08;Python Jenkins Pipeline&#xff09;&#xff0c;解决&#xff1a; 多个 Job 并发运行时共享配置文件导致上下文污染&#xff1b;读取环境变量或 JSON 文件时被其他 Job 修改…...

github 上的php项目

github 上的php项目 项目的网址 &#xff08;Loong1996/LikeGirlSite: 情侣网站、情侣网页、恋爱记录网站&#xff09; # 修改 # admin/Config_DB.php//localhost 为数据库地址 一般使用默认的即可 或&#xff08;127.0.0.1&#xff09; $db_address "mysql_php";/…...

防火墙快速管理软件,66K超小巧

软件介绍 今天为大家推荐一款轻量级的Windows防火墙管理工具&#xff0c;这款工具能帮助用户快速开启或关闭系统防火墙功能&#xff0c;操作比系统原生设置更加便捷高效。 软件优势 相比通过系统设置层层点击的操作方式&#xff0c;这款仅66KB大小的微型工具只需单击按钮…...

入门级STM32F103C8T6无人机遥控(原理图)

一、STM32主控电路 一、STM32 主控电路 把 STM32 想象成 “机器人的大脑”&#xff0c;核心电路是 “大脑的基础保障”&#xff1a;让大脑有电、有心跳&#xff08;时钟 &#xff09;、能复活&#xff08;复位 &#xff09;。 1. 电源引脚&#xff08;VDD、VDDA、VSS 等 &#…...

无人机灯光驱动模块技术解析

一、运行方式 1. 核心流程&#xff1a; 指令接收&#xff1a;灯光控制模块通过无线通信链路&#xff08;如WiFi, 数传电台&#xff0c;或专用的表演控制链路&#xff09;接收来自地面站或中央控制系统的灯光指令。指令包含&#xff1a;颜色&#xff08;RGB/RGBW值&#xff0…...

React + Umi(Umijs/Max) 搭建项目及配置

文章标题 01 环境准备02 快速构建2.1 参数选项2.2 umix 还是 umijs/max2.3 使用 pnpm &#xff08;推荐&#xff09;2.4 使用 npm 和 yarn2.5 启动项目2.6 启用 Prettier&#xff08;可选&#xff09;2.7 打包部署发布 03 Tailwind CSS 插件&#xff08;可选&#xff09;3.1 安…...

React 第六十四节Router中HashRouter的使用详细介绍及案例分析

前言 HashRouter 是 React Router 提供的一种路由实现方案&#xff0c;它使用 URL 的 hash 部分&#xff08;# 后面的内容&#xff09;来实现客户端路由功能。 一、HashRouter 的核心用途 客户端路由&#xff1a;在不刷新页面的情况下管理应用导航兼容性&#xff1a;支持不支…...

Linux RDMA网络配置手册

一、配置前准备工作 在进行 RDMA 网络配置之前&#xff0c;请确保以下准备工作已完成&#xff1a; 硬件环境 确保服务器支持 RDMA 功能&#xff0c;例如支持 InfiniBand 或 RoCE&#xff08;RDMA over Converged Ethernet&#xff09;的网卡。确保网络交换设备支持 RDMA 协议…...

sentinel与seata组件在微服务中的基本作用

微服务基础内容&#xff1a; 在微服务中&#xff0c;首先学习了微服务的横向拆分与纵向拆分&#xff0c;纵向拆分指按照功能拆分模块&#xff0c;横向拆分指将高复用的模块单独拆分&#xff0c;使纵向拆分的模块去调用这部分内容。 学习了基本拆分后&#xff0c;需要知道微服…...

Springboot 集成多数据源pgSql+mysql,启动报错

一.错误信息&#xff1a; 2025-06-25 20:25:50.870 ERROR [ai-manage-center,,] --- [ruid-ConnectionPool-Create-1057240219] DruidDataSource : create connection SQLException, url: jdbc:postgresql://10.10.60.227:5432/ai_dify1?sslmodedisable&currentSchemapub…...

南宫28NG相信品牌力量/Vue 3 中的组合式 API(Composition API)进阶实战

南宫28NG相信品牌力量【罔丨止&#xff1a;MGTY.PW】 点击此处复制到浏览器打开 随着 Vue 3 的普及&#xff0c;Composition API 已成为现代 Vue 开发的主流。本节我们将深入掌握组合式 API 的进阶用法&#xff0c;涵盖响应式工具、生命周期钩子封装、自定义逻辑抽离等关键技术…...