# smart-contract-book-platform **Repository Path**: x6611/smart-contract-book-platform ## Basic Information - **Project Name**: smart-contract-book-platform - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-04 - **Last Updated**: 2025-12-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 校园二手书直售平台 ## 3 合约设计(智能合约设计) ### 3.1 业务需求与角色分析 本系统旨在构建一个基于区块链的校园二手书交易平台,通过智能合约确保交易的安全性和透明性。 **主要角色及其职责:** 1. **卖家(Seller)**: - 注册并连接钱包 - 发布书籍信息(标题、ISBN、价格等) - 修改自己发布的书籍信息 - 设置书籍状态(在售、已售、下架) - 删除自己发布的书籍 2. **买家(Buyer)**: - 浏览平台上所有在售的书籍 - 查看书籍详细信息 - 通过线下方式联系卖家完成交易 **关键业务需求:** - 去中心化:所有书籍信息都存储在区块链上,无需中心化服务器 - 不可篡改:一旦信息发布到区块链,就不能被恶意修改或删除 - 透明可追溯:所有交易记录都可以在区块链上查询 - 低成本:相比传统电商平台,省去中间商费用 ### 3.2 合约功能设计 智能合约需要实现以下核心功能: 表 3-1 合约功能需求示例: | 功能编号 | 功能名称 | 功能描述 | |----------|----------------|------------------------------------------------| | F1 | 书籍创建 | 卖家可以发布新的书籍信息并记录到区块链上 | | F2 | 书籍查询 | 用户可以查询单本或多本书籍的详细信息 | | F3 | 书籍更新 | 卖家可以更新自己发布的书籍信息 | | F4 | 状态变更 | 卖家可以更改书籍的状态(在售、已售、下架) | | F5 | 书籍删除 | 卖家可以从链上删除自己发布的书籍 | | F6 | 用户书籍列表 | 查询特定用户的书籍列表 | ### 3.3 合约数据结构与接口设计 **主要数据结构:** 1. **Book结构体**: ```solidity struct Book { uint256 id; // 唯一标识符,主键 address seller; // 卖家地址,记录图书所有者 string title; // 图书标题 string isbn; // 国际标准书号 uint256 price; // 价格,单位:wei uint8 status; // 状态码,0 在售 1 已售 2 下架 uint256 updateTime; // 最后更新时间戳 } ``` 2. **存储映射**: ```solidity uint256 public nextId = 1; // 自增ID计数器 mapping(uint256 => Book) public books; // 核心存储,通过id查找图书信息 mapping(address => uint256[]) public myList; // 按地址索引的用户图书列表 ``` **关键接口函数:** 1. **createBook**: - 参数:`string memory _title, string memory _isbn, uint256 _price` - 返回值:`uint256`(新创建书籍的ID) - 访问控制:任何已连接钱包的用户 2. **updateBook**: - 参数:`uint256 _id, string memory _title, string memory _isbn, uint256 _price` - 返回值:无 - 访问控制:仅书籍所有者可以修改 3. **setStatus**: - 参数:`uint256 _id, uint8 _status` - 返回值:无 - 访问控制:仅书籍所有者可以修改状态 4. **deleteBook**: - 参数:`uint256 _id` - 返回值:无 - 访问控制:仅书籍所有者可以删除 5. **getBook**: - 参数:`uint256 _id` - 返回值:`Book memory` - 访问控制:公开访问 6. **listBooks**: - 参数:`uint256 _offset, uint256 _limit` - 返回值:`Book[] memory` - 访问控制:公开访问 7. **listMyBooks**: - 参数:`address _owner` - 返回值:`uint256[] memory` - 访问控制:公开访问 **事件定义:** ```solidity event Create(address indexed seller, uint256 indexed id); event Update(address indexed seller, uint256 indexed id); event Delete(address indexed seller, uint256 indexed id); ``` ### 3.4 关键业务流程 **书籍发布流程:** 1. 卖家连接MetaMask钱包 2. 进入"发布书籍"页面,填写书籍信息(标题、ISBN、价格) 3. 提交表单,前端调用智能合约的`createBook`函数 4. 合约验证参数并创建书籍记录 5. 触发`Create`事件,通知前端创建成功 6. 前端显示成功消息,并将新书添加到书籍列表 **书籍查询流程:** 1. 用户进入"书籍列表"页面 2. 前端调用智能合约的`listBooks`函数获取书籍列表 3. 合约返回指定范围内的书籍信息 4. 前端展示书籍列表,包括标题、ISBN、价格、卖家等信息 **书籍更新流程:** 1. 卖家进入自己的书籍详情页面 2. 点击"编辑"按钮,进入编辑页面 3. 修改书籍信息后提交 4. 前端调用智能合约的`updateBook`函数 5. 合约验证调用者是否为书籍所有者 6. 更新书籍信息并触发`Update`事件 7. 前端刷新页面显示更新后的信息 **图 3-1 关键业务流程图(在此处插入流程图图片,占位说明)。** ## 4 系统实现 ### 4.1 系统总体架构 本系统采用前后端分离的架构设计,具体分层如下: 1. **前端层**:基于Vue.js 3构建的单页应用程序,使用Element Plus UI组件库 2. **后端层**:基于Spring Boot构建的RESTful API服务,提供用户认证等功能 3. **区块链/合约层**:部署在以太坊测试网络上的Solidity智能合约 4. **数据库层**:MySQL数据库,用于存储用户信息等非链上数据 **主要技术栈:** - 前端:Vue 3, Element Plus, Web3.js - 后端:Spring Boot, MyBatis, MySQL - 区块链:Solidity, Truffle, Ganache - 钱包集成:MetaMask **图 4-1 系统总体架构图(在此处插入系统架构图,占位说明)。** ### 4.2 系统功能模块实现 **1. 用户认证模块:** - 用户可以通过注册页面创建账户 - 登录后可通过JWT Token进行身份验证 - 集成MetaMask钱包连接功能 **2. 书籍管理模块:** - 书籍列表展示:支持分页和搜索功能 - 书籍详情查看:显示书籍的所有信息 - 书籍发布:用户可以发布新的书籍信息 - 书籍编辑:书籍所有者可以修改书籍信息 - 书籍删除:书籍所有者可以删除书籍 **3. 区块链接口模块:** - 与智能合约交互,执行各种书籍操作 - 处理区块链交易和事件监听 - 价格单位转换(wei与ether之间) ### 4.3 关键技术与实现细节 **1. 区块链交互实现:** 前端通过Web3.js库与智能合约进行交互: ```javascript // 创建书籍 export async function createBook(title, isbn, price) { if (!contract || !currentAccount) throw new Error('合约未初始化或未连接钱包'); try { // 转换价格为wei const priceInWei = formatPriceToWei(price); // 发送交易 const receipt = await contract.methods.createBook(title, isbn, priceInWei).send({ from: currentAccount, gas: 3000000 }); // 处理交易结果 if (receipt.events && receipt.events.Create) { const bookId = receipt.events.Create.returnValues.id; return { receipt, bookId }; } return { receipt }; } catch (error) { throw error; } } ``` **2. 价格处理机制:** 为了处理区块链上的大数运算,系统采用了以下策略: - 前端输入的价格单位为ether - 调用合约前转换为wei(最小单位) - 合约内部统一使用wei进行计算 - 查询时再将wei转换回ether显示给用户 ```javascript // 格式化价格(从ether转换为wei) export function formatPriceToWei(price) { if (!web3) return '0'; try { return web3.utils.toWei(price.toString(), 'ether'); } catch (error) { console.error('价格格式化错误:', error); return '0'; } } ``` **3. 合约事件监听:** 通过监听合约事件,实现实时更新UI: ```javascript // 监听账户变化 export function onAccountChange(callback) { if (window.ethereum) { window.ethereum.on('accountsChanged', (newAccounts) => { if (newAccounts.length > 0) { currentAccount = newAccounts[0]; accounts = newAccounts; callback(currentAccount); } }); } } ``` **4. 后端区块链服务:** 后端也实现了与区块链交互的服务: ```java public class BookCRUDContract extends Contract { public BigInteger createBook(String title, String isbn, BigInteger price) throws Exception { Function function = new Function( "createBook", Arrays.asList( new Utf8String(title), new Utf8String(isbn), new Uint256(price) ), Arrays.asList(new TypeReference() {}) ); try { TransactionReceipt receipt = executeTransactionCustom(function); List response = executeCallCustom(function); return ((Uint256) response.get(0)).getValue(); } catch (IOException | ExecutionException e) { throw new RuntimeException(e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(e); } } } ``` 这些关键技术的结合使得系统能够高效、安全地与区块链进行交互,同时为用户提供流畅的使用体验。