ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

区块链存证+Spring Boot:校园二手交易系统设计与实现指南

区块链存证+Spring Boot:校园二手交易系统设计与实现指南 最近刚把“基于区块链的校园集市二手物品交易管理系统的设计与实现”这套项目完整跑通从代码编写、LW文档整理到远程运行部署每一步都踩了不少坑也总结了一套比较顺手的落地路径。这套系统一句话概括就是用区块链记录校园二手交易里的关键存证数据用传统管理系统处理用户、商品、订单这些日常业务两者配合形成一套功能完整、有技术亮点、还能远程演示给导师看的项目。如果你正在做或者准备做类似的毕设、课设这篇文章会把选题拆解、技术选型、核心代码逻辑、远程部署、文档编写这些关键环节一次讲透照着做能少走很多弯路。1. 项目拆解校园二手集市为什么需要区块链这条链1.1 校园二手交易场景里的真实痛点先说说业务场景。校园里的二手交易需求量其实很大教材、考研资料、数码配件、宿舍小电器、自行车这些东西每年毕业季都会集中流转一次。但线下交易效率低线上用普通电商系统又存在几个说不清的问题。第一是信息不对称。卖方说九成新买方拿到手发现磨损严重这种事太常见了。平台如果不做存证双方各执一词谁也说不清。第二是记录容易被改。传统管理系统的后台数据库掌握在管理员手里理论上记录可以被动过手脚交易纠纷一出现举证非常困难。第三是流程碎片化。很多校园二手交易还是靠微信群、QQ群聊完就散没有沉淀下任何可信的交易凭证。这些问题的共同点是业务本身不难难的是让交易过程中的关键记录变得可信、可追溯、不可篡改。这正好是区块链这个技术擅长的事情。1.2 区块链到底解决什么问题不解决什么问题区块链在这里不是噱头它的核心价值就两个账本公开和记录不可篡改。你可以把它理解成一本所有人共同记账的账本每页纸上盖了前一页的印章任何人想改其中一页后面的印章就对不上了。具体到本项目里把商品上架信息、成交记录、确认收货记录这些关键事件做哈希存证打包成一个一个区块再通过哈希链串联起来就能形成一条完整的交易证据链。但也要说清楚区块链在这个项目里不负责什么。它不负责存商品图片不负责存用户密码不负责高频查询。这些数据量大、涉及隐私、需要频繁读写的内容还是要老老实实放在传统数据库里。区块链只负责“存证”不负责“存储一切”。这个边界先想明白后面架构就顺了。1.3 从毕设视角看这个题目的定位如果你是在准备毕业设计这个题目的定位非常合适。它有明确的业务场景有完整的管理系统功能可以做需求分析和数据库设计又有区块链这个技术亮点可以展开讲原理、讲设计、讲实现。“设计与实现”这个表述也意味着不需要你去搭公链不需要真的跑一套PoW挖矿共识重点是展示你理解区块链的核心思想并且能在系统里把“上链、查链、验证链”这条链路完整跑通。这就是答辩时最值钱的部分。2. 系统总体设计与技术选型思路2.1 技术栈选择与理由先给一套我最终敲定的组合也是比较稳妥的毕业设计组合后端用Spring Boot前端用Vue3配合Element Plus数据库用MySQL区块链模块用自研的简化哈希链项目采用前后端分离结构。这里重点说一下区块链模块的选型。网上很多教程一上来就推荐Hyperledger Fabric或者以太坊智能合约但我实测下来这两个方案对毕业设计并不友好。Fabric部署要装Docker、拉起一堆Peer节点和Orderer节点环境稍微一复杂就崩溃演示的时候非常容易翻车。以太坊测试网络则需要处理钱包、Gas费、MetaMask这一堆概念把课题重心带偏了。我的建议是自研一个轻量级哈希链模块实现区块结构、哈希计算、链校验、交易打包这几个核心流程。这样做的技术含量一点不低反而能把区块链的底层原理吃透答辩的时候老师问共识机制、问哈希链怎么防篡改你能从代码层面讲清楚比单纯调Fabric的接口强得多。2.2 混合架构链上链下的职责边界整个系统采用的不是“所有数据都上链”的方案而是链上链下分离的混合架构。这个决定很关键。MySQL负责存储完整的业务数据包括用户账号、商品详情、订单状态、评价内容。区块链负责存证关键事件的哈希摘要具体来说有三类数据要上链商品上架存证、订单成交存证、交易完成确认。每一类都对应一次不可篡改的“盖戳”动作。为什么这么分因为区块链根本不适合存业务全量数据。商品描述带HTML图片是二进制大文件这些东西如果塞进区块链会迅速膨胀查询效率也低。而用户手机号、密码这类隐私数据更不能上链一旦上链就撤不回来了。正确的做法是业务数据存MySQL生成一个摘要值哈希上链将来需要验证时把业务数据重新计算哈希和链上的哈希比对对得上就说明数据没被改过。这个思路是区块链存证的通用玩法放在论文里写也很有层次感。2.3 核心数据结构设计先看MySQL这边的核心表设计不用太复杂保证业务闭环就行。t_user表用户ID、用户名、密码加盐哈希存储、头像、校区、联系方式、创建时间。 t_goods表商品ID、卖家ID、商品标题、描述、价格、图片路径、交易状态在售/已售/下架、上架时间。 t_order表订单ID、商品ID、卖家ID、买家ID、成交价格、订单状态待确认/已完成/已取消、创建时间。 t_evaluation表评价ID、订单ID、评价人ID、评分、内容、评价时间。再看区块链这边的数据结构。区块包含区块头和区块体区块头里有区块索引、时间戳、前一个区块的哈希、当前区块哈希区块体里装着这一批打包进去的交易存证记录。交易对象则有交易ID、商品ID、交易类型上架/成交/确认、业务数据哈希、时间戳。MySQL里还放两张表辅助页面展示t_block表存区块维度的同步数据t_transaction表存交易存证。区块链模块内部用文件或内存维护真正的链MySQL里的数据只用于前端列表展示和审查时比对。这个折中方案在演示时很好用因为直接查MySQL给页面渲染速度比遍历链快得多。3. 核心代码实现与关键逻辑3.1 区块结构与哈希链校验实现区块链模块是整个项目的亮点也是代码里最值得反复打磨的部分。先看区块结构的简化定义public class Block { private int index; private String timestamp; private String prevHash; private String hash; private ListTransaction transactions; public String calculateHash() { String data index timestamp prevHash transactions.toString(); return DigestUtils.sha256Hex(data); } }这里每新增一个区块都要拿到前一个区块的哈希拼接当前区块自己所有的交易数据做一次SHA-256得到当前区块的哈希。链式结构由此形成。再给链的校验逻辑public boolean isChainValid() { for (int i 1; i chain.size(); i) { Block current chain.get(i); Block previous chain.get(i - 1); if (!current.getHash().equals(current.calculateHash())) { return false; } if (!current.getPrevHash().equals(previous.getHash())) { return false; } } return true; }这段逻辑就是防篡改的根基。任何人都没办法只修改某个区块里的交易数据而不被发现因为你只要改了数据当前区块的哈希就变了那下一个区块里存的“前哈希”就对不上了整条链的校验就会失败。相当于你在作业本上涂改了某一页但下一页写着上一页的摘要一旦对不上老师立刻知道这页被动过。3.2 交易上链的核心流程系统里最核心的业务动作是“交易确认后上链”代码逻辑按这个顺序走用户在前端确认收货后端先更新MySQL里的订单状态为已成交同时生成一条交易存证记录。这笔存证不会立刻变成一个新区块而是先进入一个待打包队列。等队列攒到一定数量或者到了定时任务的时间窗口再统一打包成一个新区块挂到链上。public String createTransactionAndPutOnChain(Order order) { String data order.getOrderId() order.getGoodsId() order.getSellerId() order.getBuyerId() order.getPrice(); String txHash DigestUtils.sha256Hex(data); Transaction tx new Transaction(txHash, order); pendingTransactions.add(tx); return txHash; }这个异步打包的设计是我实际项目中比较满意的一点。如果每笔交易都立刻生成区块链上的区块会又小又多而且界面刷新一闪一个块演示效果并不好。定时打包能让交易“批量出块”看起来更有区块链的味道也方便在界面上设计成“最新区块”“交易数量”这样的展示卡片。要注意的是记录必须持久化系统重启后pending列表不能丢否则那几笔存证就消失了。我用了一个简单的本地文件做持久化重启后自动恢复够用。3.3 溯源展示与链上查询接口为了让区块链的存在感不止停留在后端前端必须有一个页面能直观看到链上数据。我设计了两个查询接口一个是查询整条链的区块列表返回每个区块的索引、时间戳、哈希和交易数量另一个是根据交易哈希查询某条存证记录的详细信息。前端对应做一个“链上存证”页面展示一条时间线。每一笔交易有一个独立的存证编号哈希点击展开可以查看完整的商品信息和买卖双方ID再往下还能看到这条存证在哪一个区块里。这个页面的视觉效果在答辩时特别好用因为老师一眼能看到区块链模块的体量。页面顶部的统计卡片显示总区块数、总存证数、链状态是否完好下面就是区块列表和交易流水。链状态校验调的就是上面讲的isChainValid方法返回true就显示绿色正常一旦有人模拟篡改数据立刻变成红色异常。这个功能演示冲击力很强建议保留。4. 远程运行与LW文档整理的实操记录4.1 远程运行一台云服务器搞定远程演示毕设的验收环节通常需要远程演示也就是说导师不一定坐在你旁边而是通过浏览器访问你的系统。这个环节不少同学容易栽跟头其实是部署流程没走顺。我给你一套亲测可行的方案。服务器选阿里云或腾讯云的轻量应用服务器2核4G的配置足够。系统装Ubuntu或者CentOS都行然后按顺序装这些环境JDK 1.8或11、MySQL 5.7、Nginx 1.18。后端打包直接用Maven命令mvn clean package -Dmaven.test.skiptrue打完包得到一个jar包用nohup放到后台运行nohup java -jar campus-market-0.0.1.jar --spring.profiles.activeprod market.log 21 前端进入项目目录执行依赖安装和编译npm install npm run build编译产物在dist目录里把这个目录配置到Nginx的静态资源路径下。Nginx的server配置大致如下server { listen 80; server_name your_server_ip; location / { root /opt/campus-market/dist; index index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这个配置把前端静态页面和后端接口请求都统一到了80端口导师输入服务器IP就能打开系统不用记8080这种额外端口。装好之后记得在云控制台的安全组里放行80端口这一步漏了你会发现自己本机访问没问题外网怎么都打不开。4.2 LW文档的写作框架与重点章节LW文档是这个项目交付物里很重要的部分内容上要做到“每一步设计都有依据”。我的建议是严格按这个框架走绪论部分重点写校园二手交易的背景和当前管理方式的问题引出区块链存证的必要性。相关技术介绍里除了Spring Boot和Vue这些常规技术区块链的部分一定要有自己的理解不要照抄概念要写清楚哈希函数、哈希链、防篡改原理这些和你后面的代码一一对应的内容。需求分析章节用用例图描述五种角色动作游客浏览、用户注册登录、卖家发布商品、买家下单、双方确认交易再补充管理员审核商品这类后台功能。系统设计章节是重头戏架构上画出前后端分离和区块链模块的位置数据库设计列出所有表结构并说明为什么有的字段放MySQL有的放链上。系统实现章节贴核心代码配页面截图。区块链模块的代码在论文里要有专门的小节内容包括区块定义、交易打包、链校验。系统测试章节用表格列出测试用例覆盖正常流程、异常输入、链篡改检测这几个维度每一项都要有实测结果。4.3 常见问题与排查实录下面这些问题的排查经验都是实操中踩过的整理成速查表按顺序排查基本都能解决。现象可能原因解决办法远程访问显示拒绝连接云安全组没有放行80/8080端口登录云控制台在安全组入方向添加规则放行对应端口页面打了接口返回404Nginx的proxy_pass路径和Spring Boot的context-path不匹配检查/api/前缀转发到后端时是否丢了路径前缀重启服务后存证记录少了pendingTransactions没有持久化待打包交易落盘启动时从文件加载恢复前端接口报跨域错误前后端端口不同且后端没有处理跨域用Nginx同源代理解决不要靠后端CORS硬扛区块链校验返回false有节点或缓存数据被改动或区块哈希计算使用了可变字段确认没有手工改库检查哈希计算用的字段是否全部不可变数据库连接失败导致接口500application-prod.yml里数据库密码或IP配置错误在服务器上执行mysql -u root -p测试连接再核对配置文件还有一个容易被忽略的点区块的哈希计算字段必须固定。如果你在哈希里用了Java对象默认的toString顺序稍有变化哈希就变链的稳定性会受影响。我最终把所有哈希计算的输入统一拼成一个固定格式的字符串杜绝了这个隐患。结语一点经验之谈把整个项目走下来我个人比较深的体会是毕业设计不是功能堆得越多越好而是要把一条主链路的每个环节打磨通。这套系统的主链路就是“用户登录→发布商品→下单→确认收货→自动上链→链上可查验”看起来简简单单但每一个环节都做到稳定不出错演示效果比你堆七八个鸡肋功能强得多。尤其是“远程运行”这件事提前部署、提前用手机流量访问测试比答辩前一天临时抱佛脚靠谱太多。区块链模块是这套系统的灵魂把哈希链的代码吃透、把链校验的演示做好是拿高分最关键的一步。希望这篇分享能帮你把这个项目顺利拿下。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进