基于以太坊的Dapp众筹项目实战:从Solidity合约到Truffle部署与前端交互
简介这是一份基于以太坊的Dapp众筹项目设计与实现完整资料面向计算机相关专业学生、教师及企业开发者可用于毕业设计、课程设计或期末大作业项目经本地编译可运行评审分达95分以上。资料共37个文件以js部署与编译脚本、Solidity智能合约、PDF设计文档和xmind项目地图为主配合json、xml配置及md说明整体压缩包约34.86MB目录结构清晰便于按模块查阅。内容涵盖前端界面设计、智能合约编写、后端服务器搭建及数据库设计并附有系统架构图、代码结构、接口设计和运行说明帮助读者理解众筹项目从合约部署到资金分配、代币发行的完整流程也能在其基础上扩展新功能或用于初期演示。已有56人学习/下载对希望掌握区块链Dapp开发的初学者和研究者都具参考价值。1. 基于以太坊的Dapp众筹项目能编译、能交互、能改造成毕业设计的完整资料基于以太坊的Dapp众筹项目我拿到手第一件事不是翻 PDF而是先跑编译脚本。这份资料并不是那种只能截图交差的静态报告而是从 Solidity 合约到前端页面、再到部署脚本都能本地跑通的完整项目。它解决的是“区块链众筹”从零到一怎么落地的经典问题合约怎么写前端怎么连部署脚本怎么组织文档怎么对照。无论你是拿它做毕业设计、期末大作业还是想在公司内部快速搭一个 Demo 做技术验证这份资料都值得先下载下来跑一遍。2. 众筹业务在以太坊上怎么落地合约资金流与 Truffle 编译部署2.1 众筹合约的资金流募资、锁定、投票与退回四个关键状态传统众筹平台是平台方保管资金、人工审核提现这种模式在透明度和成本上都有明显短板。换成以太坊智能合约之后资金直接锁定在合约地址里规则由代码强制执行。常见的众筹合约会拆成两个角色项目发起人和普通投资者。发起人可以创建一个众筹项目设置募资目标和截止时间投资者往合约地址转 ETH资金会进入合约余额发起人在没有达到目标之前不能动这笔钱。这种资金流在实现上可以归纳成四个关键状态募资中、已达标、已提现、已退回。募资中的时候只允许 donate 操作并且要校验当前时间是否在截止时间之内募资结束后或者截止时间到达后如果累计金额大于等于目标金额发起人可以走 withdraw 把合约里的钱取走如果没达到目标投资者需要走 refund 把自己的那部分拿回来。这里最核心的设计是“资金不经过任何人手”合约本身成为托管方。我在拿到这类资料时通常会先去 contracts 目录下找到 Campaign 合约先看它的构造函数参数。常见写法是把目标金额和截止时间作为构造参数传进去例如contract Campaign { address public manager; uint public targetAmount; uint public deadline; uint public fundedAmount; mapping(address uint) public donors; bool public ended; modifier onlyManager() { require(msg.sender manager, only manager); _; } constructor(uint _targetAmount, uint _deadline) public { manager msg.sender; targetAmount _targetAmount; deadline block.timestamp _deadline; } function donate() external payable { require(block.timestamp deadline, campaign expired); require(!ended, campaign ended); donors[msg.sender] msg.value; fundedAmount msg.value; } function withdraw() external onlyManager { require(block.timestamp deadline, campaign not ended); require(fundedAmount targetAmount, target not reached); ended true; payable(manager).transfer(address(this).balance); } function refund() external { require(block.timestamp deadline, campaign not ended); require(fundedAmount targetAmount, target reached); require(donors[msg.sender] 0, not donor); uint amount donors[msg.sender]; donors[msg.sender] 0; payable(msg.sender).transfer(amount); } }这段代码里的参数要重点讲清楚_targetAmount是目标金额单位是 wei部署时需要用web3.utils.toWei(2, ether)转换_deadline是众筹持续时长单位是秒常见写法是传86400 * 30表示一个月。donors用 mapping 而不是数组是为了避免遍历大量投资人带来的 gas 消耗。ended这个布尔值防止了重复提现和重复退款。这里有一个容易被忽略的细节withdraw和refund都要求当前时间已经超过截止时间。也就是说众筹时间一到无论成功与否系统进入结算状态。有的项目会把“提前提取”也做进去但只要没到截止时间提现就应该被禁止否则项目方可能卷款跑路。你在改这个合约时第一个要动的就是这三个参数目标金额、截止时长、最小捐款额。2.2 用 Truffle 编译部署01-compile.js 与 02-deploy.js 全链路压缩包里有两个非常关键的脚本01-compile.js和02-deploy.js。这类项目大多基于 Truffle 或纯 Node.js 脚本组织编译部署我拿到的这份是典型的“脚本式”流程先用 solc 编译合约再用 web3.js 部署到本地链。很多毕业生只会在truffle migrate里点回车却不知道底层是怎么工作的这两个脚本正好补上这部分知识。先看编译脚本的逻辑它读取contracts目录下所有.sol文件拼成一个 Solidity 编译任务然后调用 solc 编译把生成的 ABI 和 bytecode 写到build目录下。核心代码如下// 01-compile.js const path require(path); const fs require(fs-extra); const solc require(solc); const contractsPath path.resolve(__dirname, contracts); const buildPath path.resolve(__dirname, build); async function compile() { const sources {}; const files fs.readdirSync(contractsPath).filter(f f.endsWith(.sol)); files.forEach(f { sources[f] fs.readFileSync(path.join(contractsPath, f), utf8); }); const input { language: Solidity, sources, settings: { outputSelection: { *: { *: [abi, evm.bytecode] } } } }; const output JSON.parse(solc.compile(JSON.stringify(input))); fs.ensureDirSync(buildPath); for (const file of Object.keys(output.contracts)) { for (const name of Object.keys(output.contracts[file])) { fs.writeJsonSync( path.resolve(buildPath, ${name}.json), output.contracts[file][name] ); } } console.log(Compile success.); } compile().catch(console.error);这里outputSelection里的abi和evm.bytecode是部署合约必须的两样东西ABI 用来给前端提供方法调用接口bytecode 是真正要发布到链上的机器码。如果你发现编译产物里没有build目录大概率是fs-extra没装或者contracts目录下没有 Solidity 文件。还有一点很玄学solc 版本必须和合约文件里pragma solidity的版本范围匹配否则会报一堆你根本看不懂的解析错误。接着是部署脚本。部署的常见做法是用 Ganache 开一个本地链然后通过 Web3 连接到http://localhost:8545从本地链的默认账户里拿一个作为发起人最后把合约发布上去// 02-deploy.js const Web3 require(web3); const fs require(fs-extra); const path require(path); const web3 new Web3(http://localhost:8545); const campaignJson require(../build/Campaign.json); async function deploy() { const accounts await web3.eth.getAccounts(); const targetAmount web3.utils.toWei(2, ether); const duration 86400 * 30; const result await new web3.eth.Contract(campaignJson.abi) .deploy({ data: campaignJson.evm.bytecode.object, arguments: [targetAmount, duration] }) .send({ from: accounts[0], gas: 3000000 }); console.log(Campaign deployed at:, result.options.address); fs.outputJsonSync( path.resolve(__dirname, ../src/config.js), { CampaignAddress: result.options.address } ); } deploy().catch(console.error);这里几个参数要特别注意gas值不能太小众筹合约只包含一个 Campaign 的话3,000,000 通常够用但如果合约里还有工厂合约需要在调用前先查一下预估 gas不要写死。arguments数组的顺序必须和合约构造函数参数顺序完全一致否则会部署成功但状态完全错乱。部署完成后把合约地址写入src/config.js前端才能通过这个地址去实例化合约。2.3 部署完成后的第一轮验证如何判断合约真的能用很多同学跑到deploy成功就以为万事大吉实际上合约部署成功只说明字节码上链了并不代表业务逻辑正确。我一般会在部署后立刻用一个独立脚本做三项检查合约地址是否确实存在、目标金额返回值是否正确、越权调用能不能被拦截。可以临时写一个verify.js来做这件事const Web3 require(web3); const web3 new Web3(http://localhost:8545); const campaignJson require(../build/Campaign.json); const config require(../src/config.js); const contract new web3.eth.Contract(campaignJson.abi, config.CampaignAddress); (async () { const accounts await web3.eth.getAccounts(); const target await contract.methods.targetAmount().call(); const manager await contract.methods.manager().call(); console.log(target:, web3.utils.fromWei(target, ether)); console.log(manager:, manager); // 越权提现测试用非经理账户调用 withdraw try { await contract.methods.withdraw().send({ from: accounts[1], gas: 200000 }); console.log(Oops, should fail.); } catch (e) { console.log(withdraw blocked as expected.); } })();这段脚本实际上是在验证两件事读到的合约状态是否和部署参数一致以及权限控制是否真的生效。很多课堂教学只讲编译部署不讲验证但实际开发中越权测试这一步非常关键。如果这里的withdraw blocked as expected没有打印说明 modifier 写错了后面做前端交互时一定会出大问题。3. 从合约到界面前端 Vue Web3 交互与 Node.js 后端归档3.1 前端交互模型为什么用 Web3.js 实例读取合约状态众筹项目的 Dapp 前端本质上是“网页 浏览器钱包”的组合。用户在页面里点击捐款实际上发起了一笔以太坊交易这笔交易需要用户通过 MetaMask 之类的钱包确认。前端不能直接操控私钥只能通过window.ethereum拿到钱包注入的 provider然后用 Web3.js 包一层合约调用接口。这份资料的前端部分用了 HTML5、CSS3 配合 Vue.js 或 React 来实现。实际使用中 Vue 和 React 差别不大关键是搞清楚合约调用的异步模型。一个典型的读取众筹状态的代码如下// src/main.js import Web3 from web3; import campaignAbi from ../build/Campaign.json; import config from ./config; const web3 new Web3(Web3.givenProvider || http://localhost:8545); const contract new web3.eth.Contract(campaignAbi.abi, config.CampaignAddress); async function loadCampaignInfo() { const accounts await web3.eth.requestAccounts(); const target await contract.methods.targetAmount().call(); const funded await contract.methods.fundedAmount().call(); const deadline await contract.methods.deadline().call(); document.getElementById(target).innerText web3.utils.fromWei(target, ether); document.getElementById(funded).innerText web3.utils.fromWei(funded, ether); document.getElementById(deadline).innerText new Date(deadline * 1000).toLocaleString(); } loadCampaignInfo();这里的核心参数是config.CampaignAddress它来自部署脚本写入的配置文件。如果这一行地址不对页面会一直显示加载失败或者报 “Cannot read properties of undefined”。另外web3.utils.fromWei(target, ether)必须放在call()之后因为链上拿到的值永远是字符串形式的 wei直接显示数字会让人误以为项目金额小到离谱。在捐款操作里前端要把用户输入的 ETH 数量转成 wei再调用合约的donate方法同时监听交易回执async function donate(amount) { const accounts await web3.eth.requestAccounts(); await contract.methods.donate().send({ from: accounts[0], value: web3.utils.toWei(amount, ether), gas: 200000 }); await loadCampaignInfo(); }这段代码里没有写gasPrice在本地测试没问题但在测试网络或主网上容易因为 gas 价格波动而卡住。如果项目想要上真实测试链建议用web3.eth.getGasPrice()动态获取或者直接交给 MetaMask 自动估算。这个细节在很多毕设源码里是缺失的你改进的时候可以补上。3.2 后端 Node.js/Express 到底做什么事件归档与接口缓存很多人会问区块链本身已经是去中心化数据库了为什么还要 Node.js 后端答案是“索引”和“聚合”。链上的数据只能按区块和事件日志查询无法高效地按用户维度、按时间维度做筛选更不适合直接输出给前端渲染成图表。所以这个项目里用 Node.js 和 Express 搭了一个轻量后端主要职责是监听合约事件并缓存到数据库。后端的第一个工作是从链上抓取历史事件。你可以用getPastEvents把某个合约从 0 区块到最新区块的所有Donation事件拉出来然后写入 MySQL 或 MongoDBconst Web3 require(web3); const express require(express); const web3 new Web3(http://localhost:8545); const campaignJson require(../build/Campaign.json); const config require(./config); const app express(); const contract new web3.eth.Contract(campaignJson.abi, config.CampaignAddress); async function archiveEvents() { const events await contract.getPastEvents(Donation, { fromBlock: 0, toBlock: latest }); events.forEach(e { console.log(archived:, e.returnValues.donor, e.returnValues.amount); // 这里可以插入数据库 }); console.log(archive done, total, events.length); } app.get(/api/campaign, async (req, res) { const target await contract.methods.targetAmount().call(); const funded await contract.methods.fundedAmount().call(); res.json({ target: web3.utils.fromWei(target, ether), funded: web3.utils.fromWei(funded, ether) }); }); app.listen(3000, () console.log(backend running));这里有一个很实际的性能问题fromBlock: 0在本地测试链上问题不大但一旦切到真正的测试网络从头扫块可能需要几分钟甚至更久。所以我一般会建议在数据库里记一个lastScannedBlock字段每次只扫描新增的区块。很多资料包里的后端是简化版直接扫全量你可以照着这个思路改。后端的第二个作用是提供 REST 接口给前端调用这样前端不必每次刷新都直接读取链上数据减少节点 RPC 压力。注意这里的返回值都是字符串web3.utils.fromWei转换后可以直接给前端显示。3.3 接口设计与数据库字段一份可移植的 REST 约定如果你要把这个项目作为课程设计或毕业设计二次开发后端的接口设计质量很影响答辩观感。通常这类项目会提供三组核心接口创建众筹、查询众筹列表、查询单笔捐款记录。下面是一个常见的 REST 约定表接口路径方法请求参数返回内容/api/campaignsGET无众筹列表含目标金额、已筹金额、截止时间/api/campaigns/:id/donatePOSTaddress, amount交易哈希、当前已筹金额/api/campaigns/:id/eventsGETfromBlock捐款事件列表/api/campaigns/:id/refundPOSTaddress退款交易哈希数据库表设计可以围绕campaign和donation两张表展开。campaign表存储合约地址、发起人、目标金额、截止时间、状态donation表存储捐款人地址、金额、交易哈希、区块时间。后端在监听事件时更新这两张表前端查询时基本不需要再碰链上数据。这里要提醒一句后端只是个加速层不能成为唯一的真源。如果数据库被清空还可以通过archiveEvents从链上重新拉取历史数据恢复这是区块链应用和传统应用最大的区别。做系统设计时可以把这一点画进架构图评委看到会加不少印象分。4. 本地复现避坑与排查从环境版本到交易卡死的五条记录4.1 坑一Node 版本与 solc 版本不匹配编译直接挂现象运行node 01-compile.js时控制台报出一大串类似ParserError: Source file requires different compiler version的错误或者直接抛出Error: callback not supported之类的异常。原因这个资料包里的合约文件头部有pragma solidity版本约束而package.json中安装的 solc 版本是另一个大版本。Solidity 0.5、0.6、0.8 之间的语法差异很大比如构造函数写法从constructor() public改成了constructor()导致旧版本编译器无法解析新合约或者新版本编译器不认旧语法。解决先打开contracts目录下的.sol文件确认 pragma 声明的版本范围比如pragma solidity ^0.8.0然后安装对应的 solc 版本。常见做法是执行npm install --save-dev solc0.8.x再重新运行编译脚本。如果同时还要用 Truffle记得 Truffle 自带的编译器版本和独立 solc 版本要一致。我个人的习惯是优先看package.json里锁定的版本而不是直接装最新版因为最新版很可能让老资料包直接翻车。4.2 坑二本地链没启动就跑 deployRPC 连接被拒绝现象运行node 02-deploy.js时终端等待很久后输出类似connect ECONNREFUSED 127.0.0.1:8545或Invalid connection。原因部署脚本写死了http://localhost:8545这是 Ganache 默认的 RPC 端口。很多人习惯先启动测试网络或者直接跑合约结果本地链还没起来web3 根本连不上节点。解决先启动 Ganache。最简单的方式是执行ganache-cli -p 8545或者在 Ganache 图形界面里创建一个快速工作区确认端口是 8545。如果你是新手我更建议直接用npx ganache-cli因为输出信息里会直接显示可用账户和私钥方便后面测试。启动后再重新跑部署脚本如果还是连接失败检查一下是否有防火墙拦截 8545 端口或者 8545 是否被其他进程占用。4.3 坑三MetaMask 链 ID 与本地链不一致交易在 pending 里卡死现象页面加载正常但点击捐款后用 MetaMask 弹窗确认交易然后交易一直停在 pending 状态等很久也不进块甚至最终失败。原因MetaMask 默认只配置了以太坊主网和几个常见测试网连接本地 Ganache 时用户手动添加网络如果填错链 ID比如把 1337 写成 5777MetaMask 会一直和本地链协商失败。更隐蔽的情况是浏览器里同时开了多个网络MetaMask 当前选中的网络不是本地 RPC。解决在 MetaMask 里手动添加网络RPC URL 填http://localhost:8545链 ID 填1337货币符号填 ETH。如果还不行可以打开浏览器控制台执行window.ethereum.networkVersion查看当前网络 ID确保和 Ganache 返回的 ID 一致。这里有个血泪经验修改命令里network_id要和本地链完全一致很多资料包里部署脚本用*表示任意网络但 MetaMask 依然会认死链 ID。4.4 坑四wei/ether 单位混淆众筹金额差一位现象前端页面显示已筹金额 0.000000000000000002或者目标金额明明是 2 ETH但合约读出来只有 0.0000002捐款数值对不上。原因Solidity 里所有金额默认以 wei 为单位1 ether 等于 10 的 18 次方 wei。前端在显示时必须用web3.utils.fromWei换算提交时必须用web3.utils.toWei换算。如果漏掉换算把 2 直接作为以太币传给合约或者把2 * 10^18当成普通数字显示都会出现差几位的小数。解决统一在代码里强制做单位转换不要自己写* 10 ** 18。web3.js 的toWei和fromWei接受字符串参数建议传字符串而不是浮点数避免 JavaScript 浮点精度丢失。例如web3.utils.toWei(2, ether)比web3.utils.toWei(2, ether)更安全。另外在合约里可以用msg.value直接拿到 wei 数值返回值记得在接口层转换后再给前端。4.5 坑五README 与实际源码不同步按文档部署翻车现象按照 PDF 或 README 里的步骤执行比如启动命令写的是npm run dev但实际package.json里根本没有这个脚本或者文档说明合约地址由工厂合约生成但源码里只有一个独立 Campaign 合约。原因这类资料包经过多轮整理README 可能来自原作者的开发阶段发布时又加了解压密码说明导致文档和最终源码版本脱节。尤其是压缩包里还有.xmind思维导图和README.md.zbak备份文件容易让人混淆哪个才是最新版本。解决遇到文档和源码不一致以源码为准文档只当辅助参考。先看package.json里的scripts字段确认真实可用的启动命令再看contracts目录下的合约文件核对构造函数参数顺序。我一般会在解压后先跑ls -la和find contracts -name *.sol把当前项目的真实结构摸清然后再对着文档看差异。如果发现文档描述的方法名和源码不一致优先改文档而不是改代码否则答辩时会被问住。5. 把众筹项目扩展成自己的毕设参数调整、主网验证与交付习惯在你跑通整个本地链路之后最值得做的动作是把它改成“你自己的项目”。我见过太多拿这个资料直接交毕设的案例评委随便问一个“如果你要改成按白名单捐款你怎么做”就卡住了。所以哪怕只是做课程设计也建议至少做到三步改造。第一步调整合约参数并增加一个可配置的最小捐款额度。在构造函数里增加uint minimumDonation然后在donate函数开头加一句require(msg.value minimumDonation, donation too small)。这个改动很小但能让评委看到你理解了参数校验的意义。第二步把前端写死的合约地址改成动态读取部署脚本里已经写了src/config.js你可以进一步把地址迁移到后端接口里前端启动时先拉配置再初始化合约实例。第三步给合约增加一个getSummary()函数一次性返回目标金额、已筹金额、截止时间、发起人、已结束状态五个字段前端只调一次接口就能完成页面渲染这样能减少本地测试时的 RPC 请求量。主网验证那一步我强烈建议你在本地用 Ganache 模拟多个账户跑通募资、达标、提现、退款四条路径再用测试网络部署一次把交易哈希截图放进毕设附录。真实测试网会暴露很多本地不会出现的问题比如 gas 估算失败、网络拥堵导致事件回执延迟、以及浏览器钱包的requestAccounts不能被自动触发等。把这些踩坑过程写进报告反而比那些一帆风顺的演示更有说服力。我自己每次拿到这类不熟悉的以太坊工程都会先跑一遍固定的验证清单检查 Node 版本和 solc 版本是否匹配启动本地链并确认端口编译并部署用脚本读取合约状态最后再打开前端页面做一次真实捐款。这一套流程会强制暴露 90% 的环境问题而且比看 README 靠谱得多。从那以后我每次接手别人传的区块链资料包都强制走这一遍“本地部署验证”再把合约地址、版本号、踩坑记录写在笔记开头省下大量重复排错时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

MATLAB CNN图像分类实战包:端到端流程+数据切分+可视化评估

MATLAB CNN图像分类实战包:端到端流程+数据切分+可视化评估

简介:本资源是一套基于MATLAB实现的卷积神经网络(CNN)图像分类完整实践方案,面向深度学习初学者、高校课程设计学生及工程实践者,解决图像分类任务中模型构建、训练、验证与结果可视化等核心问题。压缩包共11个文件&am…

2026/10/19 11:52:17 阅读更多 →
Obsidian dataview插件从安装到排错:让笔记查询动起来

Obsidian dataview插件从安装到排错:让笔记查询动起来

简介:Obsidian Dataview 插件资源包,面向使用 Obsidian 管理个人知识库的用户,以及希望借助查询语言自动化整理笔记的进阶学习者。插件支持基于日期表达式的倒计时提醒、Markdown 表格的动态创建与筛选,以及跨笔记的任务聚合查询&…

2026/10/19 11:51:32 阅读更多 →
SpringBoot实战:从零搭建“衣依”服装销售平台全流程解析

SpringBoot实战:从零搭建“衣依”服装销售平台全流程解析

从零搭一个能用的服装销售平台,这事儿说难不难,但要说省心,那也是骗人的。“衣依”这个项目,是我用 SpringBoot 完整走完的一套服装销售平台,从需求梳理、数据库建模、后端接口,到页面渲染、模拟支付、部署…

2026/10/19 11:50:00 阅读更多 →

最新新闻

基于卷积神经网络的人体动作跟踪研究:从数据到时序建模的实战路径

基于卷积神经网络的人体动作跟踪研究:从数据到时序建模的实战路径

1. 先搞清楚研究对象:动作跟踪比动作识别多了什么如果有人拿着"基于卷积神经网络的人体动作跟踪研究"这个题目来找我聊,我通常第一句话不是问用了哪个网络,而是先反问一句:你这里的"跟踪",到底想跟…

2026/10/20 12:18:10 阅读更多 →
MindSpore FileWriter 深度解析:大规模数据集写入与分片策略

MindSpore FileWriter 深度解析:大规模数据集写入与分片策略

1. 从数据落盘说起:为什么需要关注FileWriter搞过深度学习训练的人大概都有过这种体验:数据集小的时候,直接把图片路径塞进内存里,训练脚本跑得飞起;可一旦数据量上到几十万甚至上百万条,内存就开始报警&am…

2026/10/20 12:18:10 阅读更多 →
端到端自动驾驶的三条主线:从GTC‘26看数据、部署与评测

端到端自动驾驶的三条主线:从GTC‘26看数据、部署与评测

每年GTC这类全球GPU技术大会一开,自动驾驶圈就像过年一样热闹。作为一个常年泡在端到端模型训练里的算法工程师,我这两天基本是白天开多个直播分屏,晚上刷技术博客和社区讨论,GTC‘26的大部分公开议题我都过了一遍。周围不少朋友问…

2026/10/20 12:18:10 阅读更多 →
多目标雷达LFM与CW波脉冲压缩MATLAB仿真:时域频域实现与距离-速度二维处理

多目标雷达LFM与CW波脉冲压缩MATLAB仿真:时域频域实现与距离-速度二维处理

简介:本资源面向雷达信号处理方向的学习者与工程人员,聚焦多目标场景下LFM调频连续波与CW波的脉冲压缩问题,提供一套可直接运行的Matlab仿真程序。程序支持自行设置目标数量,默认配置为2个目标,通过LFM脉冲压缩后每个目…

2026/10/20 12:18:10 阅读更多 →
Flink消费Kafka分区顺序性实战:从原理到Sink配置的端到端避坑指南

Flink消费Kafka分区顺序性实战:从原理到Sink配置的端到端避坑指南

1. 从一个线上告警说起:分区顺序性为什么成了老大难凌晨两点被电话叫醒的滋味,做实时计算的同行应该都懂。那次告警的现象很典型:下游业务方反馈,同一笔订单的状态在结果表里出现了“先终态、后中间态”的诡异回放,也就…

2026/10/20 12:18:10 阅读更多 →
OpenClaw开源智能体框架:让AI从“动口”走向“动手”的任务闭环实践

OpenClaw开源智能体框架:让AI从“动口”走向“动手”的任务闭环实践

2026年刚开年,开源社区就迎来了一条非常陡峭的增长曲线:一个叫OpenClaw的智能体项目,在没有任何付费推广的情况下,Star数一路冲到头部位置。我第一时间把它拉下来跑了一遍,又蹲在社区里看了大半个月的讨论,…

2026/10/20 12:17:10 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →