ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

JavaWeb二手交易系统源码解析:从Spring Boot到Druid实战改造

JavaWeb二手交易系统源码解析:从Spring Boot到Druid实战改造 简介面向 JavaWeb 期末大作业与课程设计场景的二手闲置物品交易系统完整源码覆盖用户登录、商品发布/浏览、订单交易等常见业务模块适合高校学生参考完整工程结构或直接二次开发。压缩包共 352 个文件约 45.54MB核心代码包括 39 个 Java 源文件和同名 class 编译文件104 个 XML 配置/映射文件前端包含 22 个 HTML、28 个 JS、26 个 CSS 页面样式与交互脚本另有图片、字体、properties 配置和 Maven 运行脚本等辅助资源目录清晰便于定位前后台代码与数据库配置。从应用启动类到控制器、Service 实现类、工具类均有完整链路数据库连接池等配置内容也可直接借鉴对期末答辩、课程设计报告编写及 JavaWeb 实战练习都有参考价值。已有 4460 人学习下载适合需要快速交付期末作业、理解分层开发思路或系统学习 JavaWeb 项目的开发者。1. 期末周最值的一件事把二手闲置物品交易系统这份 JavaWeb 源码跑起来再改如果你这周就要交 javaweb 期末大作业又不想从零手搓一个 Spring Boot 项目那这份二手闲置物品交易系统源码就是你的救命稻草。它不是那种只有页面没有逻辑的静态模板而是带着完整 Java 后端链路可以直接跑的真实项目。里面包含商品管理、用户登录、Druid 连接池、统一返回值处理这类常见期末答辩考点核心里面还有几乎所有课程设计都要用到的增删改查闭环。适合三类人一是时间紧想快速交作业的二是想把别人项目改成自己风格但缺乏参考的三是想通过读懂一个真实项目来搞懂 Spring Boot MyBatis 协作方式的。我拆过不少这类源码这篇把从导入到改代码的完整路径和常见翻车点都写出来。2. 拆包看架构从十个 Class 文件名反推技术栈与项目分层2.1 文件名里藏着技术选型Spring Boot、MyBatis、Druid 怎么一眼看出来拿到 zip 后先别急着解压运行把里面的 class 文件列出来看一遍项目的技术画像就出来了。这份源码里的关键类名我列成了一张表每行都指向一个明确的技术决策类名职责推断对应技术点Application.classSpring Boot 启动入口说明是 Spring Boot 工程而非传统 SSM 的 XML 配置方式GoodController.class / UserController.class商品、用户的 Web 控制层典型 MVC 分层Controller 只做参数接收和结果返回GoodsServiceImpl.class / UserServiceImpl.class商品、用户的业务实现层接口 实现类的标准 Service 设计Goods.class / User.class实体映射类对应数据库表结构字段大概率与表列一一对应DruidConfig.class数据源配置类使用 Druid 连接池并且做了自定义配置而不是默认配置AjaxResult.class统一 JSON 返回体前端通过 Ajax 拿数据后端封装 code、msg、data 三要素DateUtil.class日期工具类处理商品发布时间、用户注册时间等格式化逻辑从这张表你能得到三个关键结论。第一这是一个前后端不分离的 Spring Boot 单体项目界面用模板引擎渲染AjaxResult 说明部分交互走 JSON 接口。第二数据层用的是 MyBatis因为 ServiceImpl 这种命名习惯是 MyBatis 项目中非常常见的分层写法。第三DruidConfig 单独成类说明不是简单依赖默认数据源而是手动注册了 Druid 的监控和过滤功能这也是答辩时老师容易追问的细节。这里要提醒一句拿到这种压缩包第一件事不是跑代码而是先把类清单看一遍。很多同学在 IDEA 里直接双击运行 Application 类结果因为缺依赖或配置不对反复报错原因就是你根本不了解这个项目里有什么东西。2.2 分层设计还原Controller 到 Service 再到数据库的完整调用链二手闲置物品交易系统这种规模的项目代码结构一般遵循标准三层架构。Controller 接收前端请求调用 Service 接口ServiceImpl 里写业务逻辑再通过 MyBatis 的 Mapper 操作数据库。这个项目的类名里没有出现 Mapper 相关类但你不用慌这是很多课程设计源码的常规操作——把 Mapper 接口和 XML 文件放在 resources 目录下class 目录里只会保留编译产物。看这种项目的代码建议按照一条业务链路去跟以发布商品为例前端表单提交到 GoodsController 的 addGoods 接口Controller 接收参数后封装成 Goods 对象调用 GoodsService 的 addGoods 方法最终落到 GoodsServiceImpl 里完成数据库写入。我拆这类项目时一般会先画出这条链路再看每个节点的入参和返回比把每个类从头到尾读一遍效率高得多。// 反推 GoodsController 核心代码结构 Controller RequestMapping(/goods) public class GoodsController { // Spring 的构造器注入替代 Autowired 可以提升可测试性 private final GoodsService goodsService; public GoodsController(GoodsService goodsService) { this.goodsService goodsService; } // 发布商品接口前端以表单形式提交 PostMapping(/add) ResponseBody public AjaxResult add(Goods goods) { boolean success goodsService.addGoods(goods); return success ? AjaxResult.success() : AjaxResult.error(发布失败); } // 商品列表接口支持分页参数 GetMapping(/list) ResponseBody public AjaxResult list(RequestParam(defaultValue 1) Integer page, RequestParam(defaultValue 10) Integer limit) { return AjaxResult.success(goodsService.getGoodsList(page, limit)); } }参数说明page 和 limit 这种分页参数在课程设计里很常用defaultValue 保证前端不传时不会空指针ResponseBody 是关键它让方法返回 AjaxResult 时被 Jackson 序列化成 JSON 字符串而不是跳转页面。我习惯在 Controller 里尽量用构造器注入这样单元测试的时候不用启动整个 Spring 容器。反推逻辑说明goodsService.addGoods() 内部要做的核心事情就两件——把 Goods 实体里没值的字段补默认值比如发布时间用 DateUtil 生成当前时间然后调用 Mapper 写入数据库。很多同学做完新增功能后列表页看不到数据多半是漏了发布时间赋值数据库字段非空而实体里是 null直接抛异常。2.3 核心表设计用户表和商品表在二手场景下的字段取舍看实体类就能大概拼出数据库表结构。用户表通常包含 id、username、password、nickname、phone、avatar、create_time 这些字段商品表核心是 id、title、description、price、original_price、seller_id、status、create_time。两个表通过 seller_id 建立一对多关系这就是典型的二手交易模型一个用户能发布多个商品一个商品只属于一个用户。价格字段是这类系统的重点。我见过不少同学在设计时用了 double 或 float但实际项目里价格用 decimal 更稳妥否则在计算和展示时容易丢精度。你不需要改这个但答辩时被问到你得知道。status 字段也要注意它控制商品状态0 表示在售1 表示已下架2 表示已卖出。这个字段在列表页过滤和详情页按钮展示上起着关键作用。-- 常见二手商品表结构字段名与实体类对应 CREATE TABLE goods ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, title VARCHAR(100) NOT NULL COMMENT 商品标题, description TEXT COMMENT 商品描述, price DECIMAL(10, 2) NOT NULL COMMENT 售价, original_price DECIMAL(10, 2) COMMENT 原价, seller_id INT NOT NULL COMMENT 发布者ID, status TINYINT DEFAULT 0 COMMENT 0在售 1下架 2已卖出, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 发布时间, KEY idx_seller (seller_id) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4;逻辑说明TINYINT 做状态位比用 VARCHAR 存字符串性能更好而且代码里可以用数字判断create_time 直接给默认值 CURENT_TIMESTAMP 能省掉后端手动赋值但如果你发现 DateUtil 被使用频繁大概率这个项目没开默认值而是用了工具类。utf8mb4 是必须的utf8 在遇到 emoji 表情或生僻字时会报编码错误这是经典坑。索引只建了 idx_seller因为查询场景就是按用户查他发布的商品。3. 三十分钟跑起来IDEA 导入、数据库脚本与 Druid 配置排查3.1 环境版本匹配JDK 8、MySQL 5.7、IDEA 的搭配逻辑这类 javaweb 项目最稳的运行环境是 JDK 8 MySQL 5.7 IDEA 2020 以后任意版本。不要一上来就用 JDK 17 或 MySQL 8后面可能会碰一鼻子灰。JDK 版本过高会导致 Tomcat 内嵌容器和 Spring Boot 老版本不兼容最常见报错是 java.lang.NoSuchMethodError 或模块化系统拒绝访问MySQL 8 则要额外注意驱动名要改成 com.mysql.cj.jdbc.Driver 和时区配置。我在 IDEA 里导入这种 zip 的流程是File → New → Project from Existing Sources然后选中解压后的文件夹Maven 会自动识别 pom.xml。如果项目没有 pom.xml 而是 lib 目录那就说明是传统 WEB-INF/lib 方式引入依赖需要手动添加 Tomcat 运行环境。这份源码里有 Application.class十有八九是 Maven 管理的 Spring Boot 工程直接按 Maven 项目导入就行。导入后第一件事是等 Maven 下载依赖。这里给个血泪经验千万别傻等先检查本地仓库和镜像。打开设置里的 Maven 配置看 user settings 文件指向的本地仓库路径是否存在如果之前配过阿里云镜像下载速度会快不少。等依赖下完再写代码否则一敲代码全是红色报错心态会崩。!-- pom.xml 中关键依赖版本组合参考 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.3.12.RELEASE/version /parent dependencies !-- Web 层支持内嵌 Tomcat -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Thymeleaf 模板引擎渲染 HTML 页面 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency !-- MyBatis 与 Spring Boot 整合 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.1.4/version /dependency !-- Druid 连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.6/version /dependency !-- MySQL 驱动注意 MySQL 8 需要换驱动类名 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency /dependencies逻辑说明Spring Boot 2.3.x 是当前课程设计项目中最常见的版本因为和 JDK 8 天生配合好不像 Spring Boot 3 强制要求 JDK 17。Thymeleaf 负责把后端数据渲染到 HTML和 AjaxResult 同时存在意味着项目里既有页面跳转也有局部刷新。MyBatis 依赖里要小心版本冲突如果同时引入了 mybatis-spring-boot-starter 和纯 mybatis 包启动时会报 mapper 找不到。3.2 数据库准备建库脚本执行和 Druid 连接池的参数详解大多数课程设计源码会在压缩包里附带 sql 文件一般是 db_secondhand.sql 或者 init.sql 这类命名。如果没带脚本你可以通过实体类反向建表但字段类型拿不准会踩坑。我建议先把 zip 里的文件全部解压出来找 sql 文件优先用脚本实在找不到再手工建表。执行脚本要注意字符集问题。我用 Navicat 或命令行执行时会先手动创建数据库并指定 utf8mb4再执行脚本里的建表语句。如果直接双击运行 sql 文件可能会因为脚本里没有 CREATE DATABASE 语句而报 1046 没有选中数据库的错误。执行成功后检查一下表数量通常只有 user 和 goods 两张表如果有第三张表可能是作者自己扩展的功能。# application.yml 中 Druid 数据源配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/secondhand?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin123 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.secondhand.entity参数说明driver-class-name 写 com.mysql.cj.jdbc.Driver 是针对 MySQL 8 的写法如果这个项目用的驱动是 5.x要改回 com.mysql.jdbc.Driver。url 里 serverTimezoneAsia/Shanghai 是必须的不写的话 MySQL 8 会报 CST 时区错误。characterEncodingutf8 解决中文乱码问题这也是 javaweb 项目完整案例 mysql 里最常被问到的配置项。Druid 的 initial-size 和 max-active 分别代表初始连接数和最大连接数课程设计规模 5 和 20 足够。max-wait 是获取连接的超时时间超过 60 秒会抛异常。这里有个细节login-username 和 login-password 配置的是 Druid 监控页面的登录账号默认是 admin/admin123你如果不想让别人看到你的项目监控数据就改掉。启动成功后访问 http://localhost:8080/druid 可以看连接池实时状态这是给答辩加分的好素材。3.3 启动验证从日志到页面三层确认项目健康配置完成后启动 Application 类观察控制台输出的日志。看到 Tomcat started on port(s): 8080 这行日志代表 Web 容器启动成功看到 Druid 的初始化日志说明数据源没问题。这两个都没报错才能在浏览器里测试接口。第一层验证是打开首页。二手交易系统的默认路径一般是 / 或 /index能看到页面正常渲染说明 Thymeleaf 模板和静态资源加载没问题。第二层验证是测试登录功能用脚本里的初始账号试一次能跳转到首页就说明登录链路通。第三层是验证 Druid 监控页访问 /druid 看 SQL 执行记录如果你刚才登录了一下能看到 select 语句被执行这就是整个链路完整的证据。如果启动时报错端口被占用在 idea 运行终端或命令行里用 netstat -ano | findstr 8080 找出占用进程然后在任务管理器里结束它。如果报错信息里出现 Access denied for user root说明密码不对回到 yml 里检查 password 字段。最常见的错误是本地 MySQL 设置了密码但 yml 里还是空。4. 二次开发实战把通用模板改造成你自己的期末项目4.1 页面改造入门Thymeleaf 模板修改与列表页数据绑定拿到项目跑通之后你要做的最重要事情是让它变得像你的作品。大多数老师会抽查代码和页面如果连页面标题还是原作者的名字答辩印象分会很受影响。Thymeleaf 模板的修改入口很好找在 resources/templates 目录下的 HTML 文件里。以首页为例先找到 index.html用 IDEA 打开后你会看到大量 th: 开头的标签。th:text 用于将后端传入的变量渲染成文本th:each 用于遍历列表。如果你想把商品列表页的默认标题改掉直接修改标签内容即可。如果你想把页面导航栏的 logo 文字改掉全局搜索原来的项目名批量替换成自己的名字。/p precode classlanguage-html!-- 商品列表页的 Thymeleaf 核心片段 -- div classgoods-grid th:eachgoods : ${goodsList} div classgoods-card !-- 用 th:href 拼接商品详情页地址 -- a th:href{/goods/detail/{id}(id${goods.id})} h3 th:text${goods.title}默认标题/h3 /a !-- 价格格式化保留两位小数 -- p classprice th:text¥ ${#numbers.formatDecimal(goods.price, 1, 2)}¥0.00/p !-- 发布时间由 DateUtil 格式化后直接传入 -- span classtime th:text${goods.createTime}2024-01-01/span !-- 根据商品状态显示不同按钮 -- button th:if${goods.status 0} classbtn-buy我想要/button button th:if${goods.status 1} classbtn-sold disabled已下架/button /div /div /code/pre p逻辑说明th:each 类似 for 循环每遍历一个商品生成一个卡片#{...} 是 Thymeleaf 的内置工具方法numbers.formatDecimal 处理价格展示避免出现 19.9 变成 19.900000000001 这种浮点尴尬th:if 做状态判断。改造页面时我一般保留原有结构和 class只修改文字和样式这样不容易引入布局问题。/p p这个项目的 DateUtil 类在时间格式化上起了大作用。默认情况下 Java 的 LocalDateTime 传到 Thymeleaf 会显示成 2024-06-01T15:30:00 这种带 T 的格式非常丑。DateUtil 将其格式化为 yyyy-MM-dd HH:mm:ss 后前端展示才符合中文习惯。我建议你能不动这个逻辑就尽量别动改动不熟练反而影响列表页渲染。/p h34.2 新增一个举报/留言功能完全照抄 Goods 这条链路/h3 p如果你觉得只是改页面不够想加个功能体现工作量那你不需要从零写照着项目里 Goods 这条现有链路复制再改最快。加功能之前先想清楚模型我要在现有结构之上扩展比如在商品详情页加入收藏功能就需要一张 favorite 表。/p p照着 Goods 的链路加新功能只需要五个文件实体类 Favorite.java、Mapper 接口 FavoriteMapper.java、Mapper XML 文件 FavoriteMapper.xml、业务类 FavoriteService 和 FavoriteServiceImpl、控制器 FavoriteController.java。这套命名规则在这个项目里已经很清楚了照着写就行。每个文件的内容都可以拿 Goods 对应文件改动词名即可。/p precode classlanguage-java// 新增的 FavoriteController结构对齐 GoodsController Controller RequestMapping(/favorite) public class FavoriteController { private final FavoriteService favoriteService; public FavoriteController(FavoriteService favoriteService) { this.favoriteService favoriteService; } // 收藏操作前端传用户ID和商品ID PostMapping(/add) ResponseBody public AjaxResult add(RequestParam Integer userId, RequestParam Integer goodsId) { // 先判断是否已收藏避免重复插入 if (favoriteService.isFavorited(userId, goodsId)) { return AjaxResult.error(已经收藏过了); } boolean success favoriteService.addFavorite(userId, goodsId); return success ? AjaxResult.success() : AjaxResult.error(收藏失败); } // 取消收藏 PostMapping(/cancel) ResponseBody public AjaxResult cancel(RequestParam Integer userId, RequestParam Integer goodsId) { boolean success favoriteService.cancelFavorite(userId, goodsId); return success ? AjaxResult.success() : AjaxResult.error(取消失败); } } /code/pre p逻辑说明这段代码先查重再插入防止重复收藏这是答辩时值得讲的业务细节。RequestParam 强制前端传参如果没传会直接报 400也比在方法里判空更直接。AjaxResult 的统一 code 设计让你在任意接口里返回成功或失败都不用操心 HTTP 状态码。/p p照抄链条时最常翻车的是 Mapper XML 里的 namespace 没改。如果你复制了 GoodsMapper.xml一定要把 namespace 改成 FavoriteMapper 的全限定名否则启动时 MyBatis 会报绑定异常。还要注意 XML 里 resultType 要和实体类对应不要复制时漏改了包名。/p h34.3 切换远程 MySQL 与修改服务器端口Druid 配置的两个隐藏细节/h3 p有些同学本地没有装 MySQL或者宿舍两台电脑需要共享同一个数据库这就涉及把数据源指到远程服务器的问题。改 application.yml 里的 url 地址就行把 localhost 换成远程 IP。这里有两个细节要注意都是我这几年看别人翻车总结出来的。/p p第一远程 MySQL 默认不允许 root 用户从非本机登录你会看到 Host xxx is not allowed to connect to this MySQL server 报错。在远程服务器上执行 GRANT ALL PRIVILEGES ON em./em TO root% IDENTIFIED BY 密码 并执行 FLUSH PRIVILEGES 才能放开限制。第二云服务器的安全组和防火墙要放行 3306 端口这一步和环境无关纯网络层面的问题排查起来容易忽略。/p p修改端口就更简单了在 application.yml 里加一行 server.port: 9090 即可。但要注意改了端口后Druid 监控页的访问地址也要跟着变还有前端页面里如果写死了 8080 端口请求接口全部都要改否则浏览器控制台全是跨域或 404 报错。这种硬编码问题在课程设计里很常见我建议前端请求一律用相对路径这样换端口的时候就只改一处。/p h25. 避坑指南期末交作业最容易碰上的五个实际问题/h2 h35.1 端口 8080 被占用导致启动失败/h3 p现象启动 Application 类时控制台报 Port 8080 was already in useTomcat 起不来。/p p原因上一个项目没有正常停掉或者电脑上其他软件占了 8080。最常见的是之前运行过同一个项目但窗口没关再点一次启动就会冲突。/p p解决在 IDEA 终端执行 netstat -ano | findstr 8080看到 LISTENING 状态的 PID到任务管理器详情页结束对应进程然后重新运行。如果你频繁切换项目建议直接把端口改成 8090规避大部分冲突。/p h35.2 打开 /druid 监控页面显示 404/h3 p现象项目正常启动但浏览器访问 http://localhost:8080/druid 返回 404 或者白屏。/p p原因DruidConfig 里只配置了数据源 Bean没有注册 StatViewServlet。很多源码的 DruidConfig 类实际上根本没开监控页就只是个数据源包装。/p p解决检查 DruidConfig 中是否包含 ServletRegistrationBean 类型的方法没有的话手动补上设置 url-pattern 为 /druid/*并启用 login-username 和 login-password。spring boot 的 yml 里也要确认 stat-view-servlet 的 enabled 为 true两处缺一不可。/p h35.3 AjaxResult 返回的数据前端拿到 null/h3 p现象接口用 Postman 测试返回正常但浏览器页面上数据展示不出来看 network 面板发现 response 里 data 是 null。/p p原因前端期望的数据字段名和后端返回的 JSON key 不一致。比如后端返回 goodsList前端写的是 list或者是 Goods 实体里字段为 nullJackson 默认不序列化 null 值导致整个 data 只剩空壳。/p p解决在 AjaxResult 的 data 字段上加 JsonInclude(Include.ALWAYS) 注解或者让前端改取值字段名两个方向都行。我自己的习惯是把 AjaxResult 设计成泛型类 AjaxResultT这样返回数据时类型明确前端取值也少出这种玄学问题。/p h35.4 商品价格出现 19.999999 这种奇葩结果/h3 p现象数据库查询出来的价格展示在页面上变成 19.9999999999 或者 0.30000000000000004。/p p原因实体类里 price 字段用的 double而 double 是二进制浮点无法精确表达所有十进制小数。这是计算机原理层面的坑跟你代码逻辑没有关系。/p p解决把所有涉及金额的字段从 double 改成 BigDecimal数据库层面保持 decimal 不动。BigDecimal 构造时用字符串构造器 new BigDecimal(19.9)不要用 new BigDecimal(19.9)后者依然会拿到不精确值。这个坑很容易在答辩时被老师提问你答出原理会很加分。/p h35.5 中文乱码问题页面显示问号或乱码/h3 p现象登录后首页中文标题全部变成 ?? 或 ¤¤ 这类乱码。/p p原因有三层可能——数据库连接 url 缺 characterEncodingutf8、IDE 的文件编码不是 UTF-8、数据库表本身是 latin1 字符集。一层没配好就会乱。/p p解决按顺序排查。首先确认连接 url 里写了 characterEncodingutf8然后在 IDEA 中打开 Settings → File Encodings把所有编码改成 UTF-8最后检查表结构的 charset如果是 latin1 就执行 ALTER TABLE goods CONVERT TO CHARACTER SET utf8mb4。这三步走完乱码问题基本根治。/p h26. 答辩前夜三个能让你少被追问的细节处理和演示路径设计/h2 p二手交易系统这类项目答辩时老师最爱问的无非几个点表结构怎么设计的、登录校验怎么做的、为什么用这个技术栈。其中软删除这个概念值得你提前准备一下。商品表里如果有个 is_delete 或 status 字段表示下架那这就是软删除的实现。传统 delete 是物理删除数据没了没法恢复软删除是逻辑上隐藏数据还在。用户删除自己发布的商品时系统其实执行的是 UPDATE 语句把 status 改成 1而不是 DELETE。这个设计在课程设计里属于亮点回答时主动说出来老师会很认可。/p p日期处理同样是易考点。DateUtil 这个类的作用是把 LocalDateTime 转成特定格式的字符串你在答辩时可以主动演示列表页时间和详情页时间格式一致是同一个工具类做的。这比每个 controller 里手动 SimpleDateFormat 优雅得多。老师问为什么用工具类而不是直接格式化你可以答为了复用和统一管理这正是工程化思维的体现。/p p演示路径建议设计成一条完整业务闭环总时长控制在三十秒内。先用测试账号登录然后发布一个商品填写标题、价格和描述回到列表页确认新商品出现点进详情页确认状态正常最后用另一个账号浏览这条商品。整个流程下来登录、发布、查询、状态流转全链路都覆盖到了比东点一下西点一下强得多。/p p演示前建议在浏览器打开开发者工具把 Network 面板切到 XHR 过滤这样每次点击操作后后端返回哪些 JSON 数据都看得清清楚楚。答辩时依据 network 里的每个请求讲后端逻辑比自己背代码要自然得多而且显得你对项目链路非常熟悉。我还习惯在演示前关掉 Druid 监控页的登录或者直接展示监控页面的 SQL 执行列表让老师直观看到项目跑起来了这会省去很多解释问题的口舌。/p p最后再叮嘱一句这台机器在答辩前务必完成一次从 MySQL 到 IDEA 的冷启动测试拔掉电源重启后再跑一遍完整流程。我一直记得自己那次熬夜改完代码直接去答辩结果演示时 MySQL 服务没启动页面全崩只能看着老师摇头。从那以后我每到交作业或答辩前都强制自己按冷启动流程完整走一遍别在最后一步掉链子。希望帮到你。/p p a hrefhttps://download.csdn.net/download/weixin_55305220/85709915 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表