壹牛NFT数藏系统源码拆包:从盲盒到二级市场的完整链路

简介:这是一套面向NFT数字艺术藏品平台开发者与创业团队的数藏系统源码,采用全开源方式交付,适合具备一定前后端基础、希望快速搭建或二次开发数字藏品平台的工程师参考使用。压缩包共2004个文件,约245.13MB,以1286个js脚本、291个html页面、162个vue组件为主,辅以json配置、css样式与sql建表脚本,覆盖前端交互、后台管理与数据库结构等模块。该版本在原有基础上新增用户找回密码、短信实名注册、后台主图添加等功能,并修复了若干运行问题,使系统整体运行更为高效。H5端与APP端完成新UI适配,同时加入宝盒抽奖、多材料合成宝石玩法以及3D模型展示,界面经过全新改版,视觉风格更显高端。目前已有388人学习下载,读者可借此研究数藏平台的完整业务链路、抽奖与合成玩法实现思路,以及前后端目录组织方式,为自建项目或功能扩展提供可复用的代码基础。

1. 壹牛NFT数藏系统源码拆包:从盲盒到二级市场的完整链路

最近群里好几个做后端的朋友在问数字藏品平台怎么搭,说老板突然要搞个“合规的NFT发行系统”,预算卡得死,时间给两周。我第一反应是劝退——光一个链上合约和平台钱包的对接就够喝一壶。但架不住反复问,我就把手里这套壹牛NFT数字艺术藏品数藏系统源码翻出来重新跑了一遍。它是一套全开源的PHP系数字藏品平台,覆盖了从藏品铸造、盲盒发售、抢购秒杀到二级市场寄售、转赠、实名认证的完整业务闭环。说白了,你拿它当底座,改改UI和合约地址,就能跑起一个功能不缺的数藏站。适合谁?中小团队想快速验证数藏业务模型,或者接私活需要一套能交付的完整源码。不适合谁?指望开箱即用、日活百万还不想动代码的——那得自研。

2. 环境部署与依赖安装:把源码跑起来的四步硬操作

2.1 运行环境选型与版本锁定

这套源码基于ThinkPHP 6 + MySQL 5.7 + Redis的经典组合,前端是 uniapp 编译的 H5 和微信小程序双端。我实测下来,PHP 版本必须卡在7.4,上到 8.0 会有一堆each()和create_function()的废弃警告,虽然不影响核心逻辑,但日志刷得你心烦。MySQL 建议 5.7.30 以上,因为盲盒库存扣减用到了SELECT ... FOR UPDATE行锁,低版本在并发下容易出死锁。Redis 是必须的,抢购队列和藏品库存缓存都靠它,没有 Redis 的话秒杀接口直接 500。

常见做法是本地用宝塔面板搭环境,省去编译扩展的麻烦。我一般会先确认三个扩展:redis、bcmath、gmp。bcmath用于链上金额精度计算,gmp用于生成钱包地址时的椭圆曲线运算。缺一个,铸造接口就报Call to undefined function。

提示:源码包里的README.md写的是 PHP 7.2,但实际跑下来 7.4 最稳,别被文档带偏。

2.2 数据库导入与配置文件修改

拿到源码后,根目录有个nft.sql,大概 12MB,用 Navicat 或者命令行导入都行。导入完检查两张关键表:nft_collection(藏品表)和nft_order(订单表)。nft_collection里有个stock字段,默认是int(11),如果你打算发 10 万份以上的藏品,记得改成int(11) unsigned或者bigint,不然库存扣到负数就搞笑了。

配置文件在config/database.php,把数据库名、用户名、密码填进去。Redis 配置在config/cache.php,默认是127.0.0.1:6379,没密码。如果你 Redis 设了密码,这里要加'password' => '你的密码'。

// config/database.php 关键片段 return [ 'type' => 'mysql', 'hostname' => '127.0.0.1', 'database' => 'nft_platform', // 改成你的库名 'username' => 'nft_user', 'password' => 'your_password', 'hostport' => '3306', 'charset' => 'utf8mb4', 'prefix' => 'nft_', // 表前缀,别改,改了要同步改模型 ];

逻辑说明:表前缀nft_在模型里硬编码了,改前缀就得全局替换,不划算。charset必须是utf8mb4,因为藏品名称里可能有 emoji,用utf8会截断。

2.3 链上合约配置与钱包对接

这是最容易翻车的地方。源码里config/blockchain.php是链上配置,默认走的是BSC 测试网,合约地址是作者预部署的。你要用自己的合约,得改三个参数:contract_address、chain_id、rpc_url。

// config/blockchain.php return [ 'chain_id' => 97, // 97 是 BSC 测试网,主网是 56 'rpc_url' => 'https://data-seed-prebsc-1-s1.binance.org:8545/', 'contract_address' => '0x你的合约地址', 'platform_private_key' => '平台热钱包私钥', // 用于代付 gas 'gas_limit' => 200000, 'gas_price' => 5, // 单位 Gwei ];

逻辑说明:platform_private_key是平台热钱包私钥,用户铸造时平台代付 gas,所以这个钱包里必须有点 BNB。gas_price设 5 Gwei 在测试网够用,主网得看实时行情,设低了交易一直 pending。我一般会写个脚本监控热钱包余额,低于 0.1 BNB 就告警。

2.4 队列消费者与定时任务启动

抢购和铸造都是异步的,源码用 ThinkPHP 的think-queue做队列。启动消费者:

# 在项目根目录执行 php think queue:work --queue nft_mint --daemon php think queue:work --queue nft_order --daemon

逻辑说明:--daemon模式常驻内存,别用--once,不然每处理一个任务就重启一次,慢得你想砸键盘。nft_mint队列处理链上铸造,nft_order处理订单状态流转。两个队列分开跑,避免铸造堵了订单。

定时任务用 crontab 加一条:

* * * * * cd /www/wwwroot/nft && php think crontab:run >> /tmp/nft_cron.log 2>&1

这条命令每分钟跑一次,处理超时未支付订单关闭、盲盒定时开奖、二级市场寄售过期下架。日志重定向到/tmp/nft_cron.log,出问题先看这个文件。

3. 盲盒发售与抢购并发:库存扣减和队列削峰怎么落地

3.1 盲盒概率算法与库存预扣

盲盒的核心是概率配置。源码里nft_blind_box表有个probability字段,存的是 JSON,格式是{"藏品ID": 概率值}。概率值不是百分比,是权重,系统会累加所有藏品权重然后随机。比如三个藏品权重分别是 1、2、7,那概率就是 10%、20%、70%。

// app/service/BlindBoxService.php 核心抽奖逻辑 public function draw($boxId, $userId) { $box = Db::name('blind_box')->where('id', $boxId)->find(); $items = json_decode($box['probability'], true); $totalWeight = array_sum($items); $rand = mt_rand(1, $totalWeight); $current = 0; foreach ($items as $collectionId => $weight) { $current += $weight; if ($rand <= $current) { // 预扣库存,用 Redis 原子操作 $redis = Cache::store('redis')->handler(); $stockKey = "blind_box_stock:{$boxId}:{$collectionId}"; $remain = $redis->decr($stockKey); if ($remain < 0) { $redis->incr($stockKey); // 回滚 throw new Exception('库存不足'); } return $collectionId; } } }

逻辑说明:mt_rand比rand快,但都不是密码学安全随机,数藏场景够用。关键是库存预扣用 Redis 的decr,原子操作,并发下不会超卖。如果decr后小于 0,说明扣过头了,立刻incr回滚并抛异常。数据库库存是异步同步的,队列消费者里再UPDATE nft_collection SET stock = stock - 1 WHERE id = ? AND stock > 0,双重保险。

3.2 抢购接口的令牌桶限流

抢购接口/api/seckill/buy如果不限流,数据库直接被打穿。源码里用了 Redis 令牌桶,但默认配置比较宽松。我一般会把桶大小调到 200,速率 50/秒。

// app/middleware/SeckillThrottle.php public function handle($request, \Closure $next) { $redis = Cache::store('redis')->handler(); $key = 'seckill_bucket:' . $request->param('box_id'); $capacity = 200; // 桶容量 $rate = 50; // 每秒补充令牌数 $now = microtime(true); $bucket = $redis->hGetAll($key); if (empty($bucket)) { $redis->hMSet($key, ['tokens' => $capacity, 'last_time' => $now]); $bucket = ['tokens' => $capacity, 'last_time' => $now]; } $tokens = min($capacity, $bucket['tokens'] + ($now - $bucket['last_time']) * $rate); if ($tokens < 1) { return json(['code' => 429, 'msg' => '当前排队人数过多,请稍后再试']); } $redis->hMSet($key, ['tokens' => $tokens - 1, 'last_time' => $now]); return $next($request); }

逻辑说明:capacity是瞬间能扛住的并发峰值,rate是持续处理能力。200 容量 + 50/秒补充,意味着第一秒能放 250 个请求进来,之后每秒 50 个。这个值要根据你服务器配置调,2 核 4G 的机器别超过 100 容量。返回 429 状态码,前端要处理排队提示,别直接弹报错。

3.3 订单超时关闭与库存回滚

用户抢到但没付款,订单不能一直挂着。源码里用延时队列实现,下单时往nft_order队列推一条延时 15 分钟的任务。

// 下单成功后推延时任务 Queue::later(900, 'app\job\CloseOrder', ['order_id' => $orderId], 'nft_order');

逻辑说明:900是秒数,15 分钟。CloseOrder消费者里检查订单状态,如果还是pending,就关单并回滚库存。回滚库存要同时操作 Redis 和 MySQL,顺序是先 Redisincr,再 MySQLUPDATE stock = stock + 1。反过来会导致短暂超卖。

注意:延时队列依赖 Redis 的zset,如果 Redis 重启且没开持久化,延时任务会丢。生产环境务必开 AOF。

4. 二级市场寄售与转赠:链上链下状态一致性怎么保

4.1 寄售挂单与链上授权检测

二级市场寄售的逻辑是:用户把藏品挂出来卖,平台托管。但链上资产还在用户钱包里,所以需要用户先approve平台合约地址,允许平台转移。源码里在寄售接口会先调isApprovedForAll检查授权。

// app/service/MarketService.php public function list($userId, $collectionId, $price) { $user = Db::name('user')->where('id', $userId)->find(); $contract = new Contract($this->rpcUrl, $this->abi); $isApproved = $contract->call('isApprovedForAll', [$user['wallet_address'], $this->platformAddress]); if (!$isApproved) { throw new Exception('请先授权平台合约'); } // 冻结藏品,防止重复挂单 $redis = Cache::store('redis')->handler(); $lockKey = "market_lock:{$collectionId}"; if (!$redis->setnx($lockKey, $userId)) { throw new Exception('该藏品已在寄售中'); } $redis->expire($lockKey, 86400 * 7); // 7天自动解锁 Db::name('market_order')->insert([ 'user_id' => $userId, 'collection_id' => $collectionId, 'price' => $price, 'status' => 'listing', 'create_time' => time(), ]); }

逻辑说明:setnx做分布式锁,防止同一个藏品被多次挂单。锁过期时间 7 天,和寄售最大时长一致。如果用户取消寄售,要手动del这个 key。isApprovedForAll是 ERC721 标准方法,返回布尔值。

4.2 成交后的链上转移与链下结算

买家付款后,平台需要调合约的safeTransferFrom把 NFT 从卖家转给买家。这一步是链上操作,有 gas 消耗和确认延迟。

// app/job/TransferNft.php public function fire(Job $job, $data) { $order = Db::name('market_order')->where('id', $data['order_id'])->find(); $contract = new Contract($this->rpcUrl, $this->abi); $contract->setPrivateKey($this->platformPrivateKey); try { $txHash = $contract->send('safeTransferFrom', [ $order['seller_address'], $order['buyer_address'], $order['token_id'], ]); // 等待链上确认,轮询 receipt $receipt = $this->waitForReceipt($txHash, 60); if ($receipt['status'] == 1) { Db::name('market_order')->where('id', $order['id'])->update(['status' => 'completed', 'tx_hash' => $txHash]); // 给卖家结算,扣手续费 $this->settle($order); } else { throw new Exception('链上交易失败'); } } catch (Exception $e) { // 重试三次,每次间隔 30 秒 if ($job->attempts() < 3) { $job->release(30); } else { Db::name('market_order')->where('id', $order['id'])->update(['status' => 'failed', 'remark' => $e->getMessage()]); } } $job->delete(); }

逻辑说明:waitForReceipt轮询链上回执,最多等 60 秒。BSC 出块 3 秒,一般 15 秒内能确认。settle方法里扣 2.5% 手续费,剩下的打给卖家。如果链上失败,重试三次,还失败就标记failed,人工介入。这里有个坑:safeTransferFrom如果买家地址是合约地址,且合约没实现onERC721Received,会直接 revert。所以买家如果是合约钱包,得先确认兼容性。

4.3 转赠功能的 gas 代付与风控

转赠是零 gas 的,平台代付。源码里转赠接口有频率限制,默认每个用户每天 5 次。我一般会加个风控:新注册用户 24 小时内不能转赠,防止羊毛党。

// app/service/TransferService.php public function transfer($fromUserId, $toUserId, $collectionId) { $fromUser = Db::name('user')->where('id', $fromUserId)->find(); if (time() - $fromUser['create_time'] < 86400) { throw new Exception('注册未满24小时,暂不能转赠'); } $todayCount = Db::name('transfer_log')->where('user_id', $fromUserId)->whereTime('create_time', 'today')->count(); if ($todayCount >= 5) { throw new Exception('今日转赠次数已达上限'); } // 链上转移,平台代付 gas // ... 省略合约调用代码 Db::name('transfer_log')->insert(['user_id' => $fromUserId, 'to_user_id' => $toUserId, 'collection_id' => $collectionId, 'create_time' => time()]); }

逻辑说明:whereTime('create_time', 'today')是 ThinkPHP 的快捷方法,统计当天转赠次数。注册时间判断用create_time字段,单位是秒。转赠日志表transfer_log要加索引(user_id, create_time),不然数据量大了查询慢。

5. 避坑与排查:五个让你少熬三晚的血泪经验

5.1 盲盒开奖后库存对不上

现象:Redis 库存扣了,但 MySQL 库存没减,或者反过来。用户开完盲盒,藏品列表里没有。

原因:队列消费者挂了,或者 Redis 和 MySQL 同步的代码在异常分支里没走到。源码里BlindBoxService的draw方法只扣 Redis,MySQL 扣减在MintJob里,如果MintJob执行失败且没重试,就出现数据不一致。

解决:加一个对账脚本,每 10 分钟跑一次,对比 Redis 库存和 MySQL 库存,差值超过阈值就告警。脚本逻辑:遍历所有盲盒,Redis::get(stockKey)和SELECT stock FROM nft_collection对比,不一致就以 MySQL 为准,强制Redis::set回去。

5.2 抢购时大量 429 但服务器负载很低

现象:压测时 QPS 才 200,但一半请求返回 429,CPU 和内存都不到 30%。

原因:令牌桶的last_time更新有并发问题。多个请求同时读到旧的last_time,算出来的令牌数偏少,导致误限流。

解决:把令牌桶逻辑改成 Lua 脚本,保证原子性。源码里是 PHP 算完再hMSet,中间有时间窗口。Lua 脚本在 Redis 里执行,不会被其他命令打断。

-- seckill_bucket.lua local key = KEYS[1] local capacity = tonumber(ARGV[1]) local rate = tonumber(ARGV[2]) local now = tonumber(ARGV[3]) local bucket = redis.call('hMGet', key, 'tokens', 'last_time') local tokens = tonumber(bucket[1]) or capacity local last_time = tonumber(bucket[2]) or now tokens = math.min(capacity, tokens + (now - last_time) * rate) if tokens < 1 then return 0 end redis.call('hMSet', key, 'tokens', tokens - 1, 'last_time', now) return 1

5.3 链上交易一直 pending 不确认

现象:用户铸造后,订单状态一直是minting,链上查不到交易或者交易 pending 超过 10 分钟。

原因:gas_price设太低,矿工不打包。或者nonce冲突,平台热钱包同时发多笔交易,nonce 重复导致后面的卡住。

解决:第一,gas_price动态获取,调 BSC 的eth_gasPrice接口,然后乘 1.2 倍。第二,平台热钱包发交易要串行化,用 Redis 锁保证同一时间只有一个交易在发。源码里没做 nonce 管理,这是个隐藏坑。我一般会加个nonce管理器,每次发交易前INCR一个 Redis key,作为 nonce。

5.4 二级市场寄售锁没释放导致藏品永久冻结

现象:用户取消寄售,但重新挂单时提示“该藏品已在寄售中”。

原因:取消寄售的接口里忘了delRedis 锁,或者del失败但没重试。源码里MarketService::cancel方法只更新了数据库状态,没删锁。

解决:在cancel方法里加Redis::del($lockKey),并且用try...finally保证异常时也执行。另外,锁的过期时间从 7 天改成 1 小时,即使忘了删,1 小时后自动解锁,不会永久冻结。

5.5 小程序端签名验证失败

现象:H5 端正常,小程序端调接口一直返回“签名错误”。

原因:小程序端wx.request的header里content-type默认是application/json,但源码的签名算法把请求体按key=value拼接,格式不一致导致签名对不上。

解决:统一签名算法,不管content-type是什么,都取原始请求体字符串做 MD5。小程序端在request拦截器里把data转成 JSON 字符串再发。或者更简单:签名只对timestamp、nonce、appid三个参数做,不涉及请求体。源码里是后者,但文档没写清楚,我一开始按前者调,白折腾两小时。

6. 二次开发与压测验证:从能跑到能扛的最后一公里

源码跑通只是第一步,真要上线,得做两件事:改造成自己需要的业务形态,以及压测确认并发上限。我一般会先改三个地方:藏品铸造的元数据存储、支付渠道对接、后台权限管理。

元数据存储默认是存本地public/uploads,但数藏平台通常要把图片和属性存到 IPFS 或者对象存储。源码里app/service/IpfsService.php有个空实现,你填上自己的 IPFS 网关地址和 API Key 就行。我一般用 Pinata 的接口,上传后拿到ipfs://开头的 CID,再拼到合约的tokenURI里。

// app/service/IpfsService.php 补全实现 public function upload($filePath) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'https://api.pinata.cloud/pinning/pinFileToIPFS', CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $this->apiKey], CURLOPT_POSTFIELDS => ['file' => new CURLFile($filePath)], ]); $response = curl_exec($ch); $result = json_decode($response, true); return 'ipfs://' . $result['IpfsHash']; }

支付渠道默认只接了微信支付和支付宝的沙箱,生产环境要换商户号和密钥。在config/payment.php里改。后台权限用的是think-auth,权限节点在auth_rule表里,新增菜单记得同步加节点,不然管理员看不到。

压测我习惯用wrk或者ab,但抢购接口有签名,得先写个脚本生成合法请求。简单点用 Python 的locust,模拟 500 并发用户,每个用户先登录拿 token,再调抢购接口。观察三个指标:接口 P99 延迟、Redis 命中率、MySQL 慢查询数。P99 超过 2 秒就得加机器或者优化 SQL。Redis 命中率低于 90% 说明缓存策略有问题。MySQL 慢查询超过 10 条/分钟,检查nft_order表的索引,user_id和create_time要建联合索引。

最后说个我自己的习惯:每次改完代码,不管多小的改动,都强制走一遍「下单 → 支付 → 铸造 → 寄售 → 转赠」的完整流程。有一次只改了个 CSS,结果不小心把MintJob的队列名写错了,用户付款后藏品一直不到账,被老板骂了半小时。从那以后我每次部署前都跑一遍全链路,用测试网合约,花不了几分钟,但能省掉半夜被电话叫醒的后悔药。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

成都厨房收纳避坑指南:防潮、动线与调料架实战方案

成都厨房收纳避坑指南:防潮、动线与调料架实战方案

成都的厨房&#xff0c;和网上那些“日系收纳”照片里的厨房完全是两个物种先说结论&#xff1a;在成都住了这么久&#xff0c;厨房收纳是我在整个家里花心思最多、也最值的一块。川菜的重油重辣、随手就要用的豆瓣酱、花椒、干辣椒&#xff0c;老房子那点可怜巴巴的台面&#…

2026/10/20 8:32:01 阅读更多 →
AI智能客服系统落地实战:从意图识别到人机协同的全流程解析

AI智能客服系统落地实战:从意图识别到人机协同的全流程解析

去年我完整跟进了一个客服系统升级项目&#xff0c;从立项梳理到上线运营&#xff0c;前后折腾了四个多月。项目本身不复杂&#xff0c;真正复杂的是让团队理解一件事&#xff1a;我们要上的不是一套“自动回复工具”&#xff0c;而是要把客服部门从一个整天接电话、回消息、填…

2026/10/20 8:32:01 阅读更多 →
PostgreSQL 14 TID Range Scan:按物理位置范围扫描表实战

PostgreSQL 14 TID Range Scan:按物理位置范围扫描表实战

第一次在 EXPLAIN 里看到 Tid Range Scan 这个节点的时候&#xff0c;我愣了几秒。当时在处理一张订单明细表的迁移&#xff0c;五千多万行&#xff0c;表上没有主键、没有像样的索引&#xff0c;逻辑上只是想“把一部分数据搬出去归档”。常规做法是写个WHERE create_time <…

2026/10/20 8:31:00 阅读更多 →

最新新闻

开源wehcat08算法:增量文本聚类的轻量级方案

开源wehcat08算法:增量文本聚类的轻量级方案

简介&#xff1a;开源wehcat08算法的完整源代码包&#xff0c;面向关注iPad协议及自定义算法实现的研究者与Go开发者。该算法虽非通用标准算法&#xff0c;但包内提供了从核心逻辑到运行环境的全套内容&#xff0c;适合用于学习协议处理、TLS加密通信以及Go项目工程化布局。资源…

2026/10/20 10:06:48 阅读更多 →
自适应密度聚类算法wehcat08:原理、实现与调参避坑指南

自适应密度聚类算法wehcat08:原理、实现与调参避坑指南

简介&#xff1a;开源wehcat08算法包是一份面向网络协议研究与Go开发者的源代码资源&#xff0c;标签指向iPad协议08算法&#xff0c;推测与特定设备通信流程或加密握手相关&#xff0c;适合需要分析私有协议或构建轻量通信服务的工程师。资源共247个文件&#xff0c;压缩包仅6…

2026/10/20 10:06:48 阅读更多 →
基于图规划与抽象语法约束的Verilog自动生成方法解析

基于图规划与抽象语法约束的Verilog自动生成方法解析

最近在梳理体系结构方向的论文精读清单&#xff0c;第111篇正好落到VerilogCoder这个题目上。第一眼看上去像又一个大模型写Verilog的demo&#xff0c;但顺着标题里的“Graph-based Planning”和“Abstract Syntax”往下读&#xff0c;才发现它在“如何让智能体真正懂硬件结构”…

2026/10/20 10:06:48 阅读更多 →
HDR图像重建复现:光学建模+信号处理+深度学习三重校准

HDR图像重建复现:光学建模+信号处理+深度学习三重校准

1. 这不是“调个参跑个模型”——HDR重建复现的本质是光学物理信号处理深度学习的三重校准你搜到这篇CVPR21论文标题时&#xff0c;大概率正卡在某个环节&#xff1a;PyTorch加载预训练权重报错、合成数据集亮度分布对不上、重建结果发灰发雾、PSNR数值比原文低3dB以上却找不到…

2026/10/20 10:06:48 阅读更多 →
迷茫的本质与破局:用自我认知、小步实验和反馈校准建立方向

迷茫的本质与破局:用自我认知、小步实验和反馈校准建立方向

迷茫这事儿&#xff0c;本质上不是“不知道怎么办”&#xff0c;而是“还没建立起属于自己的判断坐标系”。我见过太多人——包括我自己——在某个阶段被四面八方的声音裹挟&#xff1a;身边人在考研、在转码、在考公、在创业&#xff0c;好像每条路都有人走通&#xff0c;但放…

2026/10/20 10:06:48 阅读更多 →
UDS协议栈从入门到精通:状态机、安全访问与踩坑实战全解析

UDS协议栈从入门到精通:状态机、安全访问与踩坑实战全解析

UDS&#xff08;Unified Diagnostic Services&#xff0c;统一诊断服务&#xff09;这个缩写&#xff0c;在车载电子圈里几乎每天都会碰到。做ECU开发的人要跟诊断仪打交道&#xff0c;做测试的人要对着诊断报文调参数&#xff0c;做车联网的人要解析诊断数据——但真正能把UDS…

2026/10/20 10:05:47 阅读更多 →

日新闻

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实现详解

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →