
一、项目背景与意义随着全民阅读意识的提升和高校教材、专业书籍的快速迭代二手书交易需求日益旺盛。传统的线下二手书交易存在信息不对称、交易效率低、流通范围有限等问题。本项目旨在设计并实现一个基于Spring Boot的二手书交易网站为买卖双方提供一个便捷、安全、高效的在线交易平台。项目意义资源循环利用促进图书资源的二次流通减少浪费践行绿色环保理念。降低购书成本为学生及广大读者提供高性价比的购书渠道。便捷交易体验线上发布、搜索、沟通、支付一体化打破时空限制。技术实践价值综合运用Spring Boot、MyBatis、MySQL、Redis、Vue.js等主流技术栈是一个典型且完整的全栈Web项目实践。二、技术栈选型本项目采用前后端分离架构后端基于Spring Boot构建前端使用Vue.js以下是详细的技术栈层次技术/框架版本/说明后端Spring Boot2.7.x (主流稳定版)Spring MVCWeb MVC框架Spring Security认证与授权MyBatis-Plus数据持久层简化CRUDMySQL8.0主数据库Redis7.x缓存与Session存储JWT (jjwt)生成访问令牌Lombok简化实体类代码Hibernate Validator参数校验Swagger / Knife4jAPI文档生成前端Vue.js3.x (Composition API)Vue Router前端路由Pinia / Vuex状态管理Element Plus / Ant Design VueUI组件库AxiosHTTP客户端开发与部署Maven项目构建与依赖管理Git版本控制Docker容器化部署可选Nginx反向代理与静态资源服务三、核心功能模块设计系统主要分为以下几个核心模块用户模块注册、登录含手机号/邮箱验证、个人信息管理、收货地址管理。书籍商品模块书籍信息发布标题、作者、ISBN、封面图、新旧程度、价格等、书籍分类管理、书籍上架/下架、书籍信息编辑。搜索与推荐模块支持按书名、作者、分类、ISBN等多维度搜索基于用户浏览/购买历史进行简单推荐。交易模块购物车、订单创建支持在线支付集成、订单状态管理待付款、待发货、待收货、已完成、已取消、订单评价。即时通讯模块买卖双方就书籍详情、价格等进行在线沟通可基于WebSocket简单实现。后台管理模块用户管理、书籍审核、订单管理、数据统计、系统配置。四、数据库核心表设计以下是几个核心实体表的结构概览-- 用户表 CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, username varchar(50) NOT NULL COMMENT 用户名, password varchar(255) NOT NULL COMMENT 加密后的密码, phone varchar(20) DEFAULT NULL COMMENT 手机号, email varchar(100) DEFAULT NULL COMMENT 邮箱, avatar varchar(500) DEFAULT NULL COMMENT 头像URL, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username), UNIQUE KEY uk_phone (phone), UNIQUE KEY uk_email (email) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; -- 书籍商品表 CREATE TABLE book ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, seller_id bigint NOT NULL COMMENT 卖家ID, title varchar(200) NOT NULL COMMENT 书名, author varchar(100) DEFAULT NULL COMMENT 作者, isbn varchar(20) DEFAULT NULL COMMENT ISBN, category_id bigint DEFAULT NULL COMMENT 分类ID, cover_image varchar(500) DEFAULT NULL COMMENT 封面图URL, description text COMMENT 书籍描述, original_price decimal(10,2) DEFAULT NULL COMMENT 原价, selling_price decimal(10,2) NOT NULL COMMENT 售价, condition tinyint DEFAULT 1 COMMENT 新旧程度1-全新2-九五新3-九成新4-八五新5-八新及以下, status tinyint DEFAULT 1 COMMENT 状态1-上架中2-已下架3-已售出, view_count int DEFAULT 0 COMMENT 浏览量, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 上架时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), KEY idx_seller_id (seller_id), KEY idx_category_id (category_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT书籍商品表; -- 订单表 CREATE TABLE order ( id bigint NOT NULL AUTO_INCREMENT COMMENT 订单ID, order_no varchar(32) NOT NULL COMMENT 订单号, buyer_id bigint NOT NULL COMMENT 买家ID, seller_id bigint NOT NULL COMMENT 卖家ID, book_id bigint NOT NULL COMMENT 书籍ID, total_amount decimal(10,2) NOT NULL COMMENT 订单总金额, status tinyint NOT NULL DEFAULT 1 COMMENT 状态1-待付款2-待发货3-待收货4-已完成5-已取消, payment_time datetime DEFAULT NULL COMMENT 支付时间, delivery_time datetime DEFAULT NULL COMMENT 发货时间, receive_time datetime DEFAULT NULL COMMENT 收货时间, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_buyer_id (buyer_id), KEY idx_seller_id (seller_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单表;五、Spring Boot后端核心代码示例1. 用户登录与JWT生成import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import java.util.Date; Service public class AuthService { Value(${jwt.secret}) private String jwtSecret; Value(${jwt.expiration}) private Long jwtExpiration; private final BCryptPasswordEncoder passwordEncoder new BCryptPasswordEncoder(); /** 用户登录验证并生成JWT */ public String login(String username, String rawPassword) { // 1. 查询用户 (伪代码) User user userRepository.findByUsername(username); if (user null) { throw new RuntimeException(用户不存在); } // 2. 密码校验 if (!passwordEncoder.matches(rawPassword, user.getPassword())) { throw new RuntimeException(密码错误); } // 3. 生成JWT return Jwts.builder() .setSubject(user.getId().toString()) // 通常存用户ID .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() jwtExpiration)) .signWith(SignatureAlgorithm.HS512, jwtSecret) .compact(); } }2. 书籍分页查询接口import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; RestController RequestMapping(/api/book) public class BookController { Autowired private BookService bookService; GetMapping(/list) public Resultlt;IPagelt;BookVOgt;gt; listBooks( RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, RequestParam(required false) String keyword, RequestParam(required false) Long categoryId) { // 构建查询条件 LambdaQueryWrapperlt;Bookgt; queryWrapper new LambdaQueryWrapperlt;gt;(); queryWrapper.eq(Book::getStatus, 1); // 只查询上架中的书籍 if (StringUtils.isNotBlank(keyword)) { queryWrapper.like(Book::getTitle, keyword) .or().like(Book::getAuthor, keyword); } if (categoryId ! null) { queryWrapper.eq(Book::getCategoryId, categoryId); } queryWrapper.orderByDesc(Book::getCreateTime); // 按上架时间倒序 // 执行分页查询 IPageamp;lt;Bookamp;gt; page new Pageamp;lt;amp;gt;(pageNum, pageSize); IPageamp;lt;Bookamp;gt; bookPage bookService.page(page, queryWrapper); // 转换为VO并返回 IPageamp;lt;BookVOamp;gt; voPage bookPage.convert(BookVO::fromEntity); return Result.success(voPage); } }3. 下单业务核心逻辑import org.springframework.transaction.annotation.Transactional; Service public class OrderService { Autowired private BookService bookService; Autowired private OrderMapper orderMapper; Transactional(rollbackFor Exception.class) public Order createOrder(Long buyerId, Long bookId) { // 1. 校验书籍状态 Book book bookService.getById(bookId); if (book null || book.getStatus() ! 1) { throw new RuntimeException(书籍不存在或已下架); } if (book.getSellerId().equals(buyerId)) { throw new RuntimeException(不能购买自己发布的书籍); } // 2. 生成订单号 (示例时间戳随机数) String orderNo ORD System.currentTimeMillis() String.format(%04d, (int)(Math.random() * 10000)); // 3. 创建订单实体 Order order new Order(); order.setOrderNo(orderNo); order.setBuyerId(buyerId); order.setSellerId(book.getSellerId()); order.setBookId(bookId); order.setTotalAmount(book.getSellingPrice()); order.setStatus(1); // 待付款 // 4. 保存订单 orderMapper.insert(order); // 5. 更新书籍状态为“已售出”或锁定状态根据业务设计 book.setStatus(3); bookService.updateById(book); return order; } }六、总结与展望本文详细阐述了一个基于Spring Boot的二手书交易网站的设计与实现涵盖了项目背景、技术栈选型、核心功能、数据库设计以及关键业务代码示例。该项目技术栈主流、架构清晰具备良好的可扩展性和可维护性可作为学习Spring Boot全栈开发的优秀实践案例。后续可扩展方向支付集成接入支付宝、微信支付等第三方支付平台。消息队列使用RabbitMQ或Kafka处理订单超时取消、库存同步等异步任务。搜索引擎集成Elasticsearch提升书籍搜索的准确性和性能。微服务化将用户服务、商品服务、订单服务拆分为独立微服务。移动端开发配套的微信小程序或App覆盖更多用户场景。