
简介这是一套面向计算机专业本科生的高分毕业设计级宠物商城管理系统适用于Java Web课程设计、期末大作业及毕设参考解决宠物电商场景下的商品管理、订单处理、用户交互与后台运维等核心问题。资源包共2个文件1个ZIP源码包1个SQL数据库脚本总大小14.06MBZIP中含完整SpringBoot后端、HTML/CSS/JS前端页面及项目配置SQL脚本可一键初始化MySQL 5.7数据库结构与基础数据确保开箱即用。已有58人学习下载项目经导师指导并通过答辩代码结构清晰、模块划分合理含用户中心、商品展示、购物车、订单管理、库存监控等完整业务链配套Navicat建库指引与IDEAMaven部署说明无需额外配置即可运行。1. 项目概述与核心价值最近几年身边不少学弟学妹在做毕业设计时都倾向于选择“宠物商城”这个方向。它听起来接地气功能模块清晰又能很好地串联起前后端的主流技术栈。一个典型的基于SpringBootMySQLHTML的宠物商城管理系统绝不仅仅是一个简单的“增删改查”练习。它实际上是一个微缩的、完整的电商业务模型涵盖了用户管理、商品展示、购物流程、订单处理、后台管理等核心环节。对于计算机相关专业的同学来说这个选题的价值在于它提供了一个从零到一、将理论知识转化为可运行产品的绝佳实践场。你不仅能巩固Java Web开发、数据库设计、前端交互等基本功更能深入理解一个真实业务系统的数据流转、状态管理和安全边界。我当年带毕业设计时就发现很多同学卡在“功能都做了但系统就是跑不起来”或者“数据一多就乱套”的环节。所以这篇内容我会以一个“过来人”兼“项目评审者”的视角帮你拆解这个高分毕业设计的核心要点、技术选型背后的逻辑以及那些教科书上不会写的“踩坑实录”和“加分技巧”。无论你是正在选题、已经开题还是卡在了某个技术环节希望这篇近万字的实操指南能成为你的“项目地图”。2. 系统整体架构与设计思路拆解2.1 为什么是SpringBoot MySQL HTML这个技术组合几乎是当前高校Java Web毕业设计的“黄金标配”其背后有深刻的合理性。首先SpringBoot的核心优势在于“约定大于配置”和快速启动。对于毕业设计这种时间有限、需要快速产出可演示成果的项目来说它极大地简化了传统SSMSpringSpringMVCMyBatis框架繁琐的XML配置。你只需要在pom.xml中引入对应的starter依赖比如spring-boot-starter-web、spring-boot-starter-data-jpa或mybatis-spring-boot-starter再写一个标注了SpringBootApplication的主类一个内嵌了Tomcat的Web应用就启动了。这让你能把精力集中在业务逻辑而非环境搭建上。我见过有同学用纯ServletJSP硬啃结果一半时间都花在了处理请求转发和连接池配置上得不偿失。其次MySQL作为关系型数据库的代表其生态成熟、资料丰富是学习数据库原理和SQL的最佳实践对象。宠物商城涉及的商品、用户、订单、购物车等实体间存在明确的关联关系一对多、多对多非常适合用关系模型来设计。使用MySQL你可以深入实践数据库三大范式、索引优化、事务控制ACID等核心概念。例如确保“用户下单扣减库存”这个操作的事务性是电商系统必须解决的经典问题。最后HTML作为前端展示层结合CSS和JavaScript或jQuery构成了经典的前后端不分离架构。对于毕业设计而言这个架构的优势在于逻辑集中、部署简单。所有页面渲染都在服务器端完成使用Thymeleaf、FreeMarker等模板引擎后端Controller处理好数据直接填充到HTML模板中返回给浏览器。这避免了分离架构中需要额外处理跨域、独立部署前端项目的复杂度。虽然现在Vue、React更流行但在一个以展示后端能力为核心的毕业设计中使用HTML模板引擎能让你更聚焦于后端业务逻辑的完整实现且最终只需打包成一个可执行的JAR文件方便答辩演示。注意这里说的“HTML”是一个泛指实际开发中一定会结合CSS如Bootstrap和JavaScript或jQuery来构建交互界面。选择Bootstrap这类前端框架能极大提升开发效率和界面美观度把时间留给更核心的后端逻辑。2.2 核心业务模块与数据流设计一个高分的宠物商城不能只实现“能买东西”。它需要体现你对业务闭环的理解。系统通常分为前台用户端和后台管理端。前台用户端核心模块用户模块注册、登录含密码加密、个人信息管理、收货地址管理。商品模块商品分类浏览、商品列表分页展示、商品详情页多图展示、规格选择、商品搜索按名称、分类。购物车模块添加商品、修改数量、删除商品、批量结算。这里的一个关键设计是购物车数据在用户登录前如何保存通常采用Cookie或Session存储临时购物车登录后合并到数据库的用户购物车表中。订单模块生成订单计算总价、选择地址、订单列表、订单状态跟踪待付款、待发货、待收货、已完成、在线支付模拟集成支付宝/微信支付沙箱环境是巨大加分项。支付模块模拟调用支付平台沙箱接口处理支付回调更新订单状态。即使不真实收款完整的支付流程模拟也能极大提升项目完整度。后台管理端核心模块仪表盘显示关键数据概览如今日订单数、销售额、用户增长等。商品管理对商品进行CRUD增删改查特别是商品上下架、库存管理。订单管理查看所有订单处理发货、退款等操作。用户管理查看用户列表禁用/启用账户。分类管理维护商品分类树。数据统计简单的销售报表按时间、商品类别统计。数据流设计要点当用户从前台发起一个“提交订单”请求时数据流是这样的请求到达Spring Boot的DispatcherServlet路由到对应的ControllerController调用Service层业务方法Service方法内部会进行一系列业务校验如库存是否充足并利用Transactional注解开启数据库事务然后调用Repository或Mapper与MySQL数据库交互依次插入订单主表、订单明细表并更新商品库存表最后事务提交Controller将结果返回给前端页面渲染。这个过程中任何一个环节的失败都需要有相应的异常处理和事务回滚机制。3. 数据库设计与核心表结构解析数据库设计是系统的基石设计得好后续开发顺风顺水设计得差到处是坑。下面给出一个经过精简和优化的核心表结构并解释设计意图。3.1 核心实体关系图E-R与表结构主要实体包括用户(User)、商品(Product)、商品分类(Category)、购物车(Cart)、订单(Order)、订单明细(OrderItem)、收货地址(Address)。1. 用户表 (t_user)CREATE TABLE t_user ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID, username varchar(50) NOT NULL UNIQUE COMMENT 用户名, password varchar(255) NOT NULL COMMENT 加密后的密码, email varchar(100) DEFAULT NULL COMMENT 邮箱, phone varchar(20) DEFAULT NULL COMMENT 手机号, avatar varchar(500) DEFAULT NULL COMMENT 头像URL, status tinyint(1) DEFAULT 1 COMMENT 状态0-禁用1-启用, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;设计要点password字段必须足够长推荐255因为使用BCrypt等算法加密后的字符串很长。使用utf8mb4字符集支持存储Emoji等特殊字符。status字段用于软删除或禁用账户而不是物理删除记录。create_time和update_time是审计字段便于追踪数据变化。2. 商品分类表 (t_category)CREATE TABLE t_category ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL COMMENT 分类名称, parent_id int(11) DEFAULT NULL COMMENT 父分类IDNULL表示一级分类, sort int(11) DEFAULT 0 COMMENT 排序值, icon varchar(255) DEFAULT NULL COMMENT 分类图标, PRIMARY KEY (id), KEY idx_parent_id (parent_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品分类表;设计要点采用parent_id自关联实现无限级分类。查询子分类时可用递归或一次查询后程序组装树形结构。sort字段用于控制前端展示顺序。为parent_id建立索引(idx_parent_id)提升根据父ID查询子分类的速度。3. 商品表 (t_product)CREATE TABLE t_product ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(200) NOT NULL COMMENT 商品名称, category_id int(11) NOT NULL COMMENT 所属分类ID, price decimal(10,2) NOT NULL COMMENT 商品价格, stock int(11) NOT NULL DEFAULT 0 COMMENT 库存, main_image varchar(500) DEFAULT NULL COMMENT 主图URL, sub_images text COMMENT 子图URL列表JSON格式存储, detail text COMMENT 商品详情富文本HTML, status tinyint(1) DEFAULT 1 COMMENT 状态0-下架1-上架, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_category_id (category_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品表;设计要点price字段使用DECIMAL(10,2)精确存储金额避免浮点数精度问题。stock库存是关键字段在高并发下单场景下需要重点处理。sub_images使用TEXT类型存储JSON字符串如[url1, url2]。这是一种反范式设计避免了单独建商品图片表带来的联表查询开销适合展示需求简单、更新不频繁的场景。如果图片需要独立管理如排序、描述则应拆分为单独的表。为category_id和status建立索引加速按分类和状态筛选商品。4. 购物车表 (t_cart)CREATE TABLE t_cart ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL COMMENT 用户ID, product_id int(11) NOT NULL COMMENT 商品ID, quantity int(11) NOT NULL COMMENT 商品数量, selected tinyint(1) DEFAULT 1 COMMENT 是否选中0-否1-是, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_user_product (user_id,product_id), KEY idx_user_id (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT购物车表;设计要点设置唯一键uk_user_product(user_id,product_id)确保同一个用户的同一个商品在购物车里只有一条记录添加时自动转为更新数量操作。selected字段用于实现购物车商品勾选功能。5. 订单表 (t_order) 与 订单明细表 (t_order_item)这是核心且关联紧密的两张表通常一起设计。订单主表 (t_order)CREATE TABLE t_order ( id varchar(32) NOT NULL COMMENT 订单号非自增使用雪花算法等生成, user_id int(11) NOT NULL COMMENT 用户ID, address_id int(11) NOT NULL COMMENT 收货地址ID, total_amount decimal(10,2) NOT NULL COMMENT 订单总金额, freight_amount decimal(10,2) DEFAULT 0.00 COMMENT 运费, payable_amount decimal(10,2) NOT NULL COMMENT 应付金额总金额运费-优惠, payment_type tinyint(1) DEFAULT NULL COMMENT 支付方式1-支付宝2-微信, status tinyint(1) NOT NULL COMMENT 订单状态0-已取消1-待付款2-待发货3-待收货4-已完成, payment_time datetime DEFAULT NULL COMMENT 支付时间, delivery_time datetime DEFAULT NULL COMMENT 发货时间, receive_time datetime DEFAULT NULL COMMENT 收货时间, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_create_time (create_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单主表;订单明细表 (t_order_item)CREATE TABLE t_order_item ( id int(11) NOT NULL AUTO_INCREMENT, order_id varchar(32) NOT NULL COMMENT 订单号, product_id int(11) NOT NULL COMMENT 商品ID, product_name varchar(200) NOT NULL COMMENT 商品名称快照, product_image varchar(500) DEFAULT NULL COMMENT 商品主图快照, current_price decimal(10,2) NOT NULL COMMENT 下单时的单价, quantity int(11) NOT NULL COMMENT 购买数量, total_price decimal(10,2) NOT NULL COMMENT 当前单价*数量, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_order_id (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单明细表;设计要点订单号不使用自增ID而使用分布式ID生成算法如雪花算法生成字符串ID。好处是无规律、可扩展、长度固定。在Java中可以使用hutool工具包的IdUtil.createSnowflake方法生成。数据快照在t_order_item中存储了product_name,product_image,current_price。这是电商系统的关键设计商品信息名称、价格、图片可能会变但订单记录必须永久保持下单时的原始信息不能随着商品信息的修改而改变。这叫做“订单快照”或“数据固化”。状态流转status字段定义了订单的生命周期。后端业务逻辑必须严格约束状态的变化路径例如不能从“待发货”直接变成“已完成”。索引策略订单主表按user_id和create_time查询非常频繁必须建立索引。3.2 数据库设计避坑指南字段类型选择金额用DECIMAL状态等短整型用TINYINT文本内容根据长度选择VARCHAR或TEXT并统一使用utf8mb4字符集。索引不是越多越好只为高频查询条件WHERE、排序ORDER BY、连接JOIN的字段建索引。像status这种区分度很低的字段建索引效果有限需酌情考虑。更新频繁的表索引过多会影响写入性能。外键约束慎用在互联网应用中为了追求极致性能和便于分库分表通常不在数据库层面建立外键约束而是在应用层通过代码逻辑保证数据一致性。毕业设计项目数据量小为了体现数据库知识的完整性可以加上外键。预留扩展字段可以在关键表中添加一个ext_info字段TEXT类型用于以JSON格式存储一些未来可能增加、又不愿频繁改表的属性。但这只是权宜之计良好的设计应预见主要字段。4. SpringBoot后端核心实现与业务逻辑4.1 项目结构与依赖配置使用Spring Initializrstart.spring.io或IDE直接创建项目。核心依赖包括spring-boot-starter-web: Web开发spring-boot-starter-data-jpa或mybatis-spring-boot-starter: 数据持久化二选一JPA更简单MyBatis更灵活mysql-connector-java: MySQL驱动spring-boot-starter-thymeleaf: 模板引擎如果前后端不分离spring-boot-starter-validation: 参数校验spring-boot-starter-aop: 面向切面编程可用于日志、事务等hutool-all: 国产全能工具库处理ID生成、加密、日期等非常方便lombok: 简化实体类代码可选但强烈推荐目录结构建议src/main/java/com/yourdomain/petstore/ ├── PetStoreApplication.java // 启动类 ├── config/ // 配置类 ├── controller/ // 控制器层 │ ├── front/ // 前台控制器 │ └── admin/ // 后台控制器 ├── service/ // 业务逻辑层 │ └── impl/ // 实现类 ├── repository/ (或 mapper/) // 数据访问层JPA叫repositoryMyBatis叫mapper ├── model/ (或 entity/ domain/) // 实体类 ├── dto/ // 数据传输对象 ├── vo/ // 视图对象 └── util/ // 工具类 src/main/resources/ ├── application.yml // 主配置文件 ├── static/ // 静态资源css, js, images └── templates/ // 模板文件.html4.2 用户模块安全与状态管理用户模块的核心是认证(Authentication)与授权(Authorization)。对于毕业设计实现一个简单的Session-Based认证即可。1. 密码加密存储绝对不能在数据库中明文存储密码使用Spring Security的BCryptPasswordEncoder是行业标准。Service public class UserService { Autowired private PasswordEncoder passwordEncoder; // 需在Config中注入Bean public void register(User user) { // 对密码进行加密 String encodedPwd passwordEncoder.encode(user.getPassword()); user.setPassword(encodedPwd); // 保存用户... } public boolean login(String username, String rawPassword) { User user userRepository.findByUsername(username); if (user null) return false; // 匹配明文密码和加密后的密码 return passwordEncoder.matches(rawPassword, user.getPassword()); } }2. 登录状态与会话管理用户登录成功后将其关键信息如userId,username存入HttpSession。Controller public class LoginController { PostMapping(/login) public String doLogin(RequestParam String username, RequestParam String password, HttpSession session) { User user userService.login(username, password); if (user ! null) { // 登录成功存入session session.setAttribute(loginUser, user); // 可以顺便合并未登录时的购物车 cartService.mergeCart(session, user.getId()); return redirect:/index; } else { // 登录失败返回错误信息 return login; } } GetMapping(/logout) public String logout(HttpSession session) { session.invalidate(); // 销毁session return redirect:/login; } }在需要登录的页面或接口通过判断session.getAttribute(loginUser)是否为空来进行拦截。3. 拦截器实现登录检查创建一个拦截器对需要登录的请求路径进行统一校验。Component public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); Object user session.getAttribute(loginUser); if (user null) { // 未登录跳转到登录页 response.sendRedirect(/login); return false; } return true; } }然后在配置类中注册这个拦截器并指定拦截路径如/order/**,/cart/**和排除路径如/login,/register,/static/**。4.3 商品与购物车并发与数据一致性1. 商品展示与分页商品列表分页是必备功能。使用Spring Data JPA可以轻松实现Repository public interface ProductRepository extends JpaRepositoryProduct, Integer { PageProduct findByCategoryIdAndStatus(Integer categoryId, Integer status, Pageable pageable); PageProduct findByNameContainingAndStatus(String keyword, Integer status, Pageable pageable); } Service public class ProductService { public PageProduct getProductsByCategory(Integer categoryId, Integer pageNum, Integer pageSize) { Pageable pageable PageRequest.of(pageNum - 1, pageSize, Sort.by(createTime).descending()); return productRepository.findByCategoryIdAndStatus(categoryId, 1, pageable); // status1为上架 } }在Controller中将Page对象传递给Thymeleaf模板前端即可渲染分页导航。2. 购物车实现细节购物车业务有两个难点未登录状态和登录后合并。未登录状态将购物车信息以JSON格式存入Cookie或Session。例如用MapproductId, quantity的结构存储。登录后合并用户登录时从Cookie/Session中取出临时购物车数据与数据库中该用户的购物车记录进行合并相同商品数量相加不同商品新增记录。唯一性约束如前所述数据库购物车表通过(user_id, product_id)唯一键来保证一种商品只占一条记录INSERT ... ON DUPLICATE KEY UPDATE语句是实现“添加或更新数量”的利器。3. 下单与库存扣减——高并发陷阱这是电商系统最经典的并发问题。用户A和用户B同时购买同一件最后一件库存的商品如果不加控制两人可能都下单成功导致超卖。解决方案一悲观锁不推荐用于高并发在查询商品时使用SELECT ... FOR UPDATE锁定该行数据直到事务结束。这会影响性能。解决方案二乐观锁常用在商品表中增加一个版本号字段version或使用更新时间戳。UPDATE t_product SET stock stock - #{quantity}, version version 1 WHERE id #{productId} AND stock #{quantity} AND version #{oldVersion}如果更新返回的影响行数为0说明库存不足或版本号已变被其他事务修改则下单失败。需要在业务代码中重试或提示用户。解决方案三在应用层使用分布式锁或队列对于毕业设计使用乐观锁是最佳实践。它简单有效能很好地体现你对并发问题的思考。在Service层的方法上添加Transactional注解并在更新库存的代码中判断影响行数即可。4.4 订单模块状态机与支付模拟1. 订单状态流转订单状态必须被严格管理。推荐使用状态模式或简单的枚举条件判断来实现状态机逻辑。public enum OrderStatus { CANCELED(0, 已取消), UNPAID(1, 待付款), PAID(2, 待发货), DELIVERED(3, 待收货), FINISHED(4, 已完成); // ... 构造方法、getter } Service public class OrderService { Transactional public void cancelOrder(String orderId, Integer userId) { Order order orderRepository.findByIdAndUserId(orderId, userId); if (order null) throw new RuntimeException(订单不存在); if (!order.getStatus().equals(OrderStatus.UNPAID.getCode())) { throw new RuntimeException(只有待付款订单才能取消); } // 1. 更新订单状态为“已取消” order.setStatus(OrderStatus.CANCELED.getCode()); orderRepository.save(order); // 2. 恢复商品库存需要查询订单明细 ListOrderItem items orderItemRepository.findByOrderId(orderId); for (OrderItem item : items) { productService.increaseStock(item.getProductId(), item.getQuantity()); } } }2. 支付流程模拟真实支付涉及与支付宝、微信支付的对接流程复杂。毕业设计中强烈建议使用官方沙箱环境进行模拟。支付宝沙箱注册支付宝开放平台创建沙箱应用获得APP_ID、私钥、支付宝公钥。集成支付宝提供的SDK调用alipay.trade.page.pay接口生成支付页面。配置一个公网可访问的回调地址ngrok等内网穿透工具可以临时解决本地开发回调问题用于接收支付结果通知。模拟流程用户点击支付 - 后端调用支付宝接口生成支付表单 - 跳转到沙箱支付页 - 用户用沙箱账号密码支付 - 支付宝异步通知你的回调接口 - 你的接口验证签名并更新订单状态为“已支付”。 即使最终演示时无法完成完整的支付回调你也应该在文档和代码中体现出对接的思路和关键代码如签名生成、验签这能极大提升评审老师的好感度。5. 前端页面与模板引擎整合5.1 Thymeleaf模板引擎基础Spring Boot官方推荐Thymeleaf它语法自然能在静态HTML中直接预览。在pom.xml引入spring-boot-starter-thymeleaf依赖并在application.yml中做基本配置spring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML encoding: UTF-8 cache: false # 开发时关闭缓存修改即时生效在Controller中通过Model对象传递数据到前端Controller public class ProductController { GetMapping(/product/{id}) public String detail(PathVariable Integer id, Model model) { Product product productService.getProductById(id); model.addAttribute(product, product); return front/product_detail; // 对应 templates/front/product_detail.html } }在HTML中使用Thymeleaf语法渲染!DOCTYPE html html langzh-CN xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8 title th:text${product.name} - 宠物商城商品详情/title link relstylesheet th:href{/css/bootstrap.min.css} /head body div classcontainer h1 th:text${product.name}商品名称/h1 p价格span th:text${#numbers.formatDecimal(product.price, 1, 2)}0.00/span元/p p库存span th:text${product.stock}0/span件/p !-- 判断库存控制按钮 -- button th:if${product.stock 0} th:onclick|addToCart(${product.id})|加入购物车/button button th:unless${product.stock 0} disabled已售罄/button /div script th:src{/js/jquery.min.js}/script script function addToCart(productId) { $.post(/cart/add, {productId: productId, quantity: 1}, function(resp) { if (resp.code 200) { alert(添加成功); } else { alert(resp.msg); } }); } /script /body /html5.2 前后端数据交互AJAX与RESTful风格虽然整体是服务端渲染但局部交互如添加购物车、修改数量使用AJAX能提升用户体验。Controller可以设计成返回JSON格式的数据。RestController // 注意是RestController不是Controller RequestMapping(/api/cart) public class CartApiController { PostMapping(/add) public Result addItem(RequestParam Integer productId, RequestParam Integer quantity, HttpSession session) { // ... 业务逻辑 return Result.success(添加成功); } } // 统一的返回结果封装类 Data public class Result { private Integer code; // 200成功500失败 private String msg; private Object data; public static Result success(Object data) { Result r new Result(); r.setCode(200); r.setMsg(操作成功); r.setData(data); return r; } }前端jQuery的$.ajax或$.post即可处理这种JSON响应。5.3 使用Bootstrap快速构建UIBootstrap是快速搭建美观界面的神器。从官网引入CSS和JS使用其栅格系统、组件和工具类。布局使用container、row、col-*构建响应式布局。组件导航栏(navbar)、卡片(card)、按钮(btn)、表单(form-control)、分页(pagination)等直接套用。图标引入Font Awesome图标库使用i classfas fa-shopping-cart/i来添加图标。一个商品列表页的卡片示例div classrow div th:eachproduct : ${productPage.content} classcol-md-3 mb-4 div classcard h-100 img th:src${product.mainImage} classcard-img-top alt商品图 div classcard-body h5 classcard-title th:text${product.name}商品名/h5 p classcard-text text-danger th:text¥ ${#numbers.formatDecimal(product.price,1,2)}价格/p a th:href{/product/{id}(id${product.id})} classbtn btn-primary btn-sm查看详情/a /div /div /div /div6. 项目部署、测试与答辩准备6.1 本地运行与打包数据库初始化在MySQL中创建数据库如pet_store并运行你的建表SQL脚本。在application.yml中配置数据源。spring: datasource: url: jdbc:mysql://localhost:3306/pet_store?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update # 首次可设为create后续改为update或validate show-sql: true # 开发时显示SQL便于调试运行与调试直接运行PetStoreApplication的main方法或使用mvn spring-boot:run。访问http://localhost:8080。打包使用Maven命令mvn clean package -DskipTests会在target目录下生成一个可执行的JAR文件如pet-store-0.0.1-SNAPSHOT.jar。6.2 部署到服务器以Linux为例上传文件使用FTP或SCP将JAR包和前端静态资源如果有独立前端上传到服务器。运行在服务器上安装Java运行环境JRE 8或11。使用nohup命令在后台运行nohup java -jar pet-store-0.0.1-SNAPSHOT.jar --server.port8080 app.log 21 --server.port可以指定端口。 app.log 21 将日志输出到文件并后台运行。使用Nginx反向代理可选但推荐安装Nginx配置将80端口的请求转发到8080端口的Spring Boot应用并处理静态资源。server { listen 80; server_name your-domain.com; # 或服务器IP location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 静态资源交由Nginx直接处理效率更高 location /static/ { alias /path/to/your/static/files/; expires 30d; } }6.3 系统测试要点功能测试按照功能清单逐一测试所有功能点是否正常。特别是边界情况库存为0时能否购买收货地址为空时能否下单订单取消后库存是否恢复流程测试模拟完整用户旅程注册 - 登录 - 浏览商品 - 加入购物车 - 下单 - 支付模拟- 查看订单 - 确认收货。兼容性测试在不同浏览器Chrome, Firefox, Edge下检查页面布局和功能。压力测试可选加分项使用JMeter或Apache Bench简单模拟多用户并发访问商品页、提交订单观察系统响应和数据库压力。这能体现你的工程思维。6.4 毕业设计答辩准备文档齐全需求分析、数据库设计E-R图、表结构、系统设计架构图、模块图、接口文档、部署文档、用户手册。这些是硬性指标。演示流畅准备一个清晰的演示脚本。从登录开始重点演示核心业务流程如完整购买流程、后台商品上架和订单处理避免在次要功能上浪费时间。突出亮点主动提及你项目中解决的核心难点比如“我使用了乐观锁解决了库存超卖问题”、“我集成了支付宝沙箱环境模拟了真实支付流程”、“我设计了订单快照表来固化交易信息”。代码整洁确保关键业务逻辑的代码有清晰的注释命名规范。老师可能会随机抽查某个功能的代码。准备问答预测老师可能问的问题为什么用SpringBoot为什么不用Redis做缓存你的数据库索引是怎么设计的如果用户量很大你的系统哪里可能成为瓶颈如何改进提前准备好答案。7. 常见问题排查与性能优化思路在实际开发中你肯定会遇到各种“坑”。这里记录一些典型问题和解决思路。7.1 开发阶段常见问题数据库连接失败错误信息Communications link failure或Access denied for user。排查检查application.yml中的数据库URL、用户名、密码是否正确检查MySQL服务是否启动检查是否使用了serverTimezone参数建议设置为Asia/Shanghai。Thymeleaf模板解析错误错误信息Template might not exist or might not be accessible。排查检查Controller中返回的字符串是否与templates/目录下的HTML文件路径匹配检查HTML文件开头是否引入了Thymeleaf命名空间xmlns:thhttp://www.thymeleaf.org。插入中文数据乱码排查确保三处编码统一为UTF-8数据库/表字符集、Spring Boot数据源URL添加?characterEncodingutf8、MySQL驱动版本8.x以上驱动类名是com.mysql.cj.jdbc.Driver。事务不回滚现象方法抛异常了但数据库数据还是改了。排查首先确保方法上有Transactional注解并且是由Spring容器管理的Bean如Service。其次默认只对RuntimeException和Error回滚如果抛出的是Exception需要指定Transactional(rollbackFor Exception.class)。最后确保异常没有被catch住并吞掉。7.2 部署与运行问题端口被占用解决netstat -tunlp | grep 8080查找占用端口的进程kill掉或者修改Spring Boot的启动端口--server.port8081。JAR包运行找不到主类排查检查pom.xml中是否配置了Spring Boot的Maven插件(spring-boot-maven-plugin)。没有这个插件打出来的JAR不是可执行JAR。静态资源404排查Spring Boot默认从/static,/public等目录提供静态资源。检查你的CSS/JS文件是否放在了src/main/resources/static/下访问路径是否为/css/style.css。如果使用了Nginx检查Nginx配置的静态资源路径是否正确。7.3 性能优化进阶思考加分项如果你的项目想追求更高分可以在文档中阐述以下优化思路即使未完全实现数据库层面查询优化为高频查询条件建立合适的索引。使用EXPLAIN命令分析慢SQL。读写分离对于读多写少的场景如商品浏览可以考虑使用主从复制将读请求分发到从库。连接池调优调整HikariCPSpring Boot默认连接池的配置如maximumPoolSize最大连接数避免连接数不足或过多。应用层面缓存引入Redis将热点数据如商品分类、热门商品信息缓存起来减少数据库压力。使用Cacheable注解可以轻松集成。异步处理对于一些非实时核心的操作如发送订单成功邮件、记录操作日志可以放入消息队列如RabbitMQ或使用Async注解异步执行提升主流程响应速度。静态资源分离将图片、CSS、JS等静态文件放到CDN或独立的对象存储如阿里云OSS减轻应用服务器压力。前端层面资源合并与压缩使用Webpack等工具对CSS/JS进行合并、压缩减少HTTP请求数和文件大小。浏览器缓存通过设置HTTP响应头让浏览器缓存静态资源。记住毕业设计的核心是展示你对一个完整系统开发流程的掌握以及解决实际问题的能力。不必一味追求新技术堆砌把基础功能做扎实、逻辑理清楚、代码写规范、文档写完整就已经能拿到一个不错的分数了。如果在这些基础上还能有一两个像“支付模拟”、“乐观锁控制库存”这样的亮点高分自然水到渠成。本文还有配套的精品资源点击获取