简介基于微信小程序与Java后端的校园服务平台毕业设计整合源码、演示视频、说明文档与数据库面向计算机相关专业毕业生或课程设计学习者。项目区分管理员、卖家、用户三类角色涵盖校园公告、二手商品管理、订单发货等完整业务闭环可快速理解前后端交互与权限设计。资源包共1112个文件约27.76MB包含Java后端、Vue管理端、微信小程序前端及SQL数据库脚本png/svg等图标资源丰富js/java/wxml/wxss构成主要代码另有mp4演示视频和docx说明文档便于对照学习与二次开发。已有138人学习适合需要完整毕业设计参考、快速搭建校园交易平台的读者。除源码外项目还提供环境安装与启动脚本从部署到功能演示均有支撑可有效节省项目落地时间并降低排错成本。1. 微信小程序校园服务平台毕设一份带视频、带 SQL、能直接跑通的完整前后端很多人拿到毕设资源的第一反应是找 README但这份基于微信小程序 Java 后端的校园服务压缩包里偏偏没有只有一堆 .bat 批处理和 .vue.bak 备份文件差点被当成损坏包丢掉。拆开跑通后会发现它是一套标准的校园二手商品交易平台小程序端面向用户和卖家Java 后端提供接口MySQL 存数据管理员、卖家、用户三类角色都有完整操作链路。对正在做毕业设计或课程设计的人来说这属于拿来就能复现的资源。适合两种人一种是选题还没定、想在小程序商城方向上省时间的人另一种是前后端分离项目里接口和小程序总对不齐想参考一个规范做法的人。下文从包内文件拆起一路跑到联调最后把最容易翻车的几个问题一次说清。2. 压缩包拆解.bak 文件、批处理脚本与三层技术栈2.1 先认清压缩包里的每一类文件源码、脚本、备份和数据库拿到的资源解压后顶层会看到几个批处理文件和一个源码目录。批处理文件命名比较直白1-install.bat 负责初始化环境2-run.bat 负责启动后端3-build.bat 负责打包构建这套顺序本身就是给新手的操作指引。我拆包时习惯先看 .bat 内容再决定下一步而不是直接双击因为批处理里的路径写死可能和本地环境不一致。源码目录里能看到不少以 .bak 结尾的文件比如 main.css.bak、update-password.vue.bak、BreadCrumbs.vue.bak。在课程设计和小型商城项目里开发者在改样式或重构组件前会把原文件复制一份改成 .bak 作备份这是很常见的个人习惯。但它不是项目运行需要的文件如果 IDE 把它当资源文件加载反而会干扰编译所以后面部署时我会直接忽略这些 .bak。整个项目是典型的前后端分离结构。小程序端放在微信小程序目录下用 WXML、WXSS 和 JS 写页面后端是 Java 工程采用 Spring Boot 风格组织controller 层暴露接口给小程序调用service 层处理业务mapper 层访问 MySQL。三者之间的调用关系是小程序发 request 请求到 Java 后端接口后端操作 MySQL 数据库再把结果以 JSON 格式返回给小程序渲染。后端源码目录一般按 Maven 标准结构组织src/main/java 下分成 controller、service、mapper、entity 四个包。controller 包对外暴露 REST 接口service 包处理业务逻辑mapper 包封装 MyBatis 或 JPA 的数据访问entity 包对应数据库表实体。看代码时先看 entity 再顺着 controller 找接口路径能快速理解每个表对外提供了哪些能力。课程设计版本常见的做法是把接口路径统一以 /api 开头比如 /api/user/login、/api/goods/list这样小程序的 BASE_URL 拼接起来很规整。下面这张表把包内主要交付物和各自的用途列出来二次开发前最好先对一遍避免把演示视频、数据库脚本和源码混在一起处理。交付物类型在项目中扮演的角色小程序源码目录前端代码用户、卖家、管理员三类角色的页面与交互逻辑Java 后端源码目录后端代码提供登录鉴权、商品管理、订单流转等接口SQL 数据库脚本数据文件建库建表并写入基础数据是项目能跑通的前提演示视频视频文件完整演示三类角色的操作路径用于答辩和功能核验说明文档文档环境配置与启动步骤通常写得比较简略需要结合实操补充.bat 批处理辅助脚本安装依赖、启动服务、打包后端可在本地按需修改提示解压后建议把压缩包放到无中文、无空格的路径下比如 D:/campus-project避免后面 Maven 和微信开发者工具因为路径编码问题报奇怪错误。2.2 技术选型为什么小程序端不用 Vue 跨平台方案而是原生 WXML这个项目的选题背景是校园服务平台目标用户是学生和校内卖家使用场景是手机端快速浏览和下单。因此前端选微信小程序是合理的它的原生框架在小程序运行时性能好登录、上传图片、订阅消息这些能力都有现成 API。相比用 Vue 写 H5 再套壳的方案原生小程序更贴近课程设计答辩时老师对微信小程序的期望。后端用 Java 而不是 Node.js 或 PHP同样有现实原因。毕业设计评审一般看中工程规范性和数据库设计能力Java 配合 Spring Boot 的 Controller-Service-Mapper 分层结构代码组织清晰事务管理方便。同样是校园平台有人会选 PHP 版或 Python 版源码但 Java 版本在答辩时有两个天然优势第一是分层清晰老师问业务逻辑写在哪一层可以明确回答 Service 层而不是含糊带过第二是 Java 生态对数据库事务、连接池、权限框架的支持成熟后续加功能时不用换技术栈。这个包里的 .vue.bak 文件也侧面说明它的课程设计版本曾经带 Vue 管理端毕业设计版本把这个管理端收敛为 Java 后端加小程序页面。对毕设来说这条路线的工程量和答辩覆盖面更均衡既有足够多的页面展示 UI 能力又有后端接口设计可以讲不像纯 H5 项目那样容易被追问你自己写了什么。2.3 前后端如何串起来从页面按钮到数据库表的完整链路以用户端下单为例数据流是小程序商品详情页点击立即购买前端把商品 id、买家 id、数量封装成参数通过 wx.request 发送到后端 POST /order/create 接口后端 Controller 接收请求后调用 Service 层校验库存和用户状态再调用 Mapper 层写入订单表并扣减商品库存执行成功后返回订单 id小程序跳转到订单详情页。整条链路里小程序只负责视图和交互业务规则全在后端这也是前后端分离的标准姿势。Java 后端的接口定义习惯是统一返回一个 Result 对象包含 code、message、data 三个字段。小程序端在封装请求时会先判断 code 是否为 200再决定是渲染数据还是弹出错误提示。下面这段是小程序端常见的请求封装function request(url, method, data) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL url, // BASE_URL 指向 Java 后端地址如 http://127.0.0.1:8080 method: method || GET, data: data || {}, header: { Content-Type: application/json }, // 必须显式声明 JSON否则后端解析不了 success: (res) { if (res.data res.data.code 200) { resolve(res.data.data); // 只把业务数据抛给页面 } else { reject(res.data); } }, fail: (err) reject(err) }); }); }这段封装逻辑说明三点。第一BASE_URL 是联调时的关键变量微信开发者工具里可以通过详情页的不校验合法域名开关访问本机地址第二请求头必须写 Content-Type 为 application/json否则 Java 后端的 RequestBody 注解拿不到参数第三统一在封装层判断 code比每个页面重复写 try-catch 要省事得多。我后来在这个封装上补了统一错误提示逻辑每当 code 不为 200 时统一弹 toast 显示后端返回的 message页面代码里就不用每个接口都写错误分支。二次开发新增接口时只需要照着已有方法抄一遍参数组装和页面跳转工作量很小。3. 部署到本地从建库、导 SQL 到小程序端联调的全流程3.1 环境准备清单版本和配置项要在启动前确认在动手之前先把环境对齐。JDK 需要 8 或 11版本太高可能出现反射相关的报错Maven 用 3.6 以上即可MySQL 建议 5.7 或 8.0注意 8.0 的驱动名和 5.7 不同如果后端配置文件里写的是 com.mysql.jdbc.Driver在 8.0 环境下要改成 com.mysql.cj.jdbc.Driver微信开发者工具用最新稳定版即可AppID 可以选择测试号不影响本地开发和真机预览。还有一个容易被忽略的点是系统环境变量。很多第一次跑 Java 项目的人在 IDE 里能运行但双击 .bat 脚本就报mvn 不是内部或外部命令原因是 Maven 没有配置到 PATH 环境变量里。启动前后端时先打开命令行输入 mvn -v 和 java -version确认输出正常再继续。微信开发者工具导入工程后如果页面空白先看编译日志里有没有 WXSS 语法错误。项目里 main.css.bak 这类文件不会参与小程序编译但 update-password.vue.bak 如果被误放到 pages 目录下小程序会把它当成未知文件加载控制台报 unexpected file。处理办法是从 pages 配置里剔掉或者直接移出工程。3.2 导入数据库命令行和图形化工具两种方式都可用数据库脚本是整个项目的前提。打开 SQL 文件后先确认文件头部有没有 CREATE DATABASE 语句。如果有直接在 MySQL 命令行执行即可如果没有需要先手动创建数据库再导入表结构和数据。下面这段是常见的导入流程mysql -u root -p # 输入密码后进入 MySQL 命令行 CREATE DATABASE IF NOT EXISTS campus_shop DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; USE campus_shop; SOURCE D:/campus-project/sql/campus_shop.sql;这段命令说明两点。第一utf8mb4 比 utf8 更适合存储表情符号小程序端昵称经常带 emoji如果建库时用了 utf8写库时会报 Incorrect string value 错误第二SOURCE 命令后面要写 SQL 文件的绝对路径路径中尽量别带中文。图形化工具如 Navicat 也可以右键连接选择运行 SQL 文件效果相同但要注意工具自身的字符集设置导入完成后可以执行 SHOW TABLES 确认表数量。表导完后检查一下各表的数据量。正规的课程设计资源会把管理员账号、测试用户、几条商品数据一起导入方便演示视频里展示的登录操作能原样复现。如果发现数据为空说明 SQL 脚本可能只包含表结构这时需要手动造几条数据否则登录后页面是空的。SQL 文件如果是从 Windows 里拷出来的可能带有 BOM 头MySQL 5.7 对 BOM 比较敏感导入时会报语法错误。处理方式是用 VS Code 把文件重新保存为 UTF-8 without BOM再执行导入。3.3 启动 Java 后端写死路径的 .bat 和手动命令的区别这个包里自带 1-install.bat、2-run.bat、3-build.bat 三个脚本。1-install.bat 一般是执行 mvn install 把依赖拉到本地仓库2-run.bat 通常是 mvn spring-boot:run 或 java -jar 启动服务3-build.bat 是 mvn clean package 打包。实际执行时我建议先打开编辑器看脚本内容把里面的写死路径改成自己机器上的实际路径然后用命令行手动执行因为脚本双击时窗口一闪而过看不到报错信息。手动启动后端的标准做法是这样cd D:/campus-project/java-backend # 进入后端工程根目录 mvn clean package -DskipTests # 跳过测试打包生成可执行 jar java -jar target/*.jar --spring.profiles.activedev这里说明两个参数。第一-DskipTests 表示跳过测试用例很多课程设计工程的单元测试会连数据库直接打包会被测试卡住第二--spring.profiles.activedev 指定配置文件开发环境走 dev 配置数据库地址和端口都在 application-dev.yml 里改。启动成功后会看到 Tomcat started on port(s): 8080 字样的日志这时可以打开浏览器访问 http://127.0.0.1:8080后端起了接口才能响应。如果后端是前后端分离结构且带了管理后台管理端页面往往也由 Java 工程提供静态资源启动后直接访问 8080 端口即可看到。用 IDEA 打开工程时等待 Maven 首次下载依赖需要几分钟建议配置阿里云镜像加速否则依赖下载失败时会报各种 ClassNotFoundException这属于环境问题而不是代码问题。另外 MAVEN_OPTS 内存不足也会导致打包失败报 Java heap space。这种情况可以在命令行加 MAVEN_OPTS-Xmx1024m 再重试排错时优先怀疑环境而不是代码。3.4 小程序端联调AppID、接口地址和本机调试开关后端启动后打开微信开发者工具导入小程序源码目录。导入时会要求填 AppID可以选测试号不影响页面浏览和接口调用。联调前需要做的第一件事是确认 BASE_URL。开发者工具默认可以访问本机地址把 BASE_URL 设为 http://127.0.0.1:8080 即可真机预览时这个地址要改成电脑在局域网内的 IP否则手机请求不到电脑上的后端服务。真机调试时常见的问题是脱离开发者工具预览后小程序请求直接失败。原因在于真机无法通过 127.0.0.1 访问电脑需要改为类似 http://192.168.1.100:8080 的局域网地址。同时后端接口要做好跨域配置这个原理在避坑章节专门说明。联调通过的标准是在小程序模拟器里注册一个新用户能正常收到校验提示首页能拉到数据库里的商品列表说明小程序到后端、后端到数据库整条链路已经打通。登录功能的联调尤为关键因为这个点最容易把前后端不一致暴露出来。小程序端登录一般调用后端 /user/login 接口参数是用户名和密码返回的 data 里带 userId 和 token。拿到 token 后小程序端要把它存在本地之后的商品发布、下单请求都在 header 里带上。如果后端返回 code 200 但 data 为 null通常是 SQL 查询没查到用户比如密码加密方式不一致。做真机预览时还有个小细节容易被忽略小程序自定义顶部导航栏的高度。这个项目如果改成自定义 navigationStyle不同机型的胶囊位置不同页面布局会错位。常见做法是调用 wx.getMenuButtonBoundingClientRect 获取胶囊位置动态计算 header 高度再让页面内容往下偏移。4. 三种角色的功能拆解订单状态流转与权限控制4.1 用户端注册登录、商品浏览与下单的完整入口用户端首页展示校园公告和二手商品列表商品支持按名称搜索。对应的操作路径是用户进入首页 → 查看公告或搜索商品 → 进入商品详情 → 点击购买 → 生成订单 → 在订单信息中查看物流状态。数据查询走的是后端 /goods/list 接口支持按商品名称和分类做条件过滤分页参数 page 和 size 由前端传递。注册流程是这个项目里的小细节。没有账号的用户先进入注册页填写用户名、密码、手机号后端校验用户名唯一后写入用户表。校验逻辑如果只在后端做会出现两名用户同时提交相同用户名的情况常见做法是利用数据库唯一索引兜底插入失败时再返回用户名已存在提示。二次开发时这段逻辑建议加一层参数校验比如密码长度至少 6 位避免用户输入非法数据后直接落库。下单逻辑往后端提交的是商品 id 和数量后端拿到商品价格后计算总金额并写入订单表。这里有一点值得注意订单金额必须由后端根据数据库里的商品价格计算而不是信任前端传过来的金额。课程设计里虽然不涉及真实支付但这个设计思想在答辩时很容易被问到回答清楚能加分。用户端的我的页面按订单状态分成待付款、待发货、已发货、已完成几个 tab每个 tab 对应一个订单状态码前端通过 status 参数请求 /order/list 接口。实现这个 tab 列表时小程序端没必要写四个页面复用一个列表组件传不同状态码进去即可。后端订单列表接口需要支持按 status 过滤同时关联商品表和卖家表一次查询把商品图片、名称、卖家昵称都带上减少前端二次请求。4.2 卖家端商品管理与订单发货的权限边界卖家的功能集中在商品和订单两个模块。商品功能是增删改查卖家可以发布新商品填写名称、价格、库存、描述和图片已发布的商品可以下架或修改下架后用户端不再展示。订单信息模块展示用户对本店商品下的订单订单状态包括待发货、已发货。卖家点击发货后填写快递单号订单进入已发货状态。这套逻辑在后端对应的是 role 字段的权限控制。用户表里每位用户有 role 属性注册时默认为用户卖家需要管理员审核或通过特定入口升级。后端接口在收到请求时先解析 token取出当前用户的 role如果是卖家才能调用商品新增接口。这段鉴权逻辑不复杂通常是一个拦截器或过滤器检查请求头里的 token解析出用户 id 和 role再决定是否放行。发布商品时前端会把表单里的图片临时路径传到后端后端把文件保存到磁盘后回传一个可访问的 URL。这里要注意图片体积小程序端 wx.chooseMedia 拿到的是临时文件建议先压缩再上传否则网络差的时候很容易超时。订单发货的状态变化在后端里可以设计为状态机。订单状态从待发货改为已发货再改成已完成每一步都记录更新时间。如果商家不发货用户无法确认收货所以这个状态流转是单向的。课程设计里做到这一步已经够用但如果想加分可以在状态变更的同时给用户发一条订阅消息小程序端用 wx.requestSubscribeMessage 申请订阅不过这块配置起来比较繁琐属于可选项。4.3 管理员端用户、商品、订单与公告的全局管理管理员端的功能是三类角色里最多的也是系统的后台管理核心。个人中心之外还有用户管理、校园公告管理、卖家管理、二手商品管理、订单信息管理、订单发货管理、管理员管理以及系统管理。用户管理里可以查看全部注册用户支持禁用某个用户卖家管理可以审核或取消卖家的发布资格公告管理支持发布、编辑和删除校园公告公告内容会同步展示在用户端首页。管理员账号通常由 SQL 脚本初始化到管理员表里登录入口与普通用户不同。部分毕业设计版本会做一个独立的 admin 目录部分版本则在同一个登录页里根据账号类型跳转到不同首页。这个项目从实现角度看管理员功能复用小程序端页面通过角色字段跳转到管理页面集合工作量少而且答辩演示时能在同一台手机上完成所有角色切换。管理员端的系统管理功能里通常包含基础数据统计比如注册用户数、在售商品数、今日订单量。这些统计值可以用一条 SQL 聚合查出来下面的语句是典型写法SELECT (SELECT COUNT(*) FROM user WHERE role 2) AS seller_count, (SELECT COUNT(*) FROM goods WHERE status 1) AS on_sale_count, (SELECT COUNT(*) FROM orders WHERE create_time CURDATE()) AS today_order_count;这个查询用了三个标量子查询数据量小的时候没问题如果后续要做工作台看板建议单独建统计表每日定时汇总否则订单量上来后这个接口会成为性能瓶颈。订单发货管理是管理员端比较关键的表单操作。管理员可以查看全平台所有订单并对未发货订单执行发货和填写快递单号。这相当于平台统一发货模式卖家和管理员的发货功能会共用一个订单发货表。二次开发时要注意区分发货人和操作时间两个字段否则统计每个卖家的发货量时容易出错。4.4 数据库表设计订单状态怎么和业务动作对应数据库是这个项目里最值得借鉴的部分表结构围绕三类角色展开。核心表包括用户表、卖家表、商品表、订单表、订单发货表、校园公告表、管理员表。用户表承载用户和卖家的公共信息通过 role 字段区分身份商品表挂在卖家 id 下方便卖家查询自己的商品订单表通过 buyer_id 和 goods_id 关联用户与商品订单发货表保存物流单号、发货时间、操作人。以下是最主要的几张表表名关键字段作用userid, username, password, role, phone用户与卖家公共信息role 区分角色goodsid, seller_id, name, price, stock, status二手商品信息status 控制上下架ordersid, order_no, buyer_id, goods_id, amount, status订单主表状态码驱动业务流转order_deliverid, order_id, deliver_no, operator_id订单发货信息记录物流单号与操作人noticeid, title, content, create_time校园公告内容展示在用户端首页订单状态字段建议用数字枚举而不是字符串状态码 0 表示待付款1 表示待发货2 表示已发货3 表示已完成。用数字的好处是数据库查询快、存储空间小缺点是代码可读性差所以在 Java 枚举类里定义常量即可。下面这个枚举是常见的写法public enum OrderStatus { WAIT_PAY(0, 待付款), WAIT_DELIVER(1, 待发货), DELIVERED(2, 已发货), FINISHED(3, 已完成); private final int code; private final String desc; OrderStatus(int code, String desc) { this.code code; this.desc desc; } public int getCode() { return code; } public String getDesc() { return desc; } }枚举的意义是把魔法数字收敛到一处。业务代码里判断订单状态时写 OrderStatus.DELIVERED.getCode() 比直接写 2 更清晰调试时也能通过 desc 直接看出状态含义。下单时状态初始为 0用户取消订单置为 -1卖家发货置为 2用户确认收货置为 3这些状态转换在 Service 层用 switch 或 if 判断建议写一个状态校验方法非法状态跳转直接抛异常回滚事务。整个数据库的设计里最容易出问题的是外键和索引。课程设计里有人为了省事省略外键但商品查询和订单查询都依赖关联字段没有索引会导致数据量上来后查询变慢。建议在 goods_id、buyer_id、seller_id 三个字段上建普通索引这能显著提升订单列表页的响应速度而且对数据库设计的评分有帮助。5. 避坑指南部署和二次开发中最容易翻车的 5 个问题5.1 页面样式和功能乱套.bak 备份文件被当成源码加载现象编辑器工程里能看到 main.css.bak 和一堆 .vue.bak 文件IDE 有时会把 .bak 当作可识别资源加载导致样式覆盖异常或编译报错。原因开发者改样式前习惯把原文件复制为 .bak 备份但工程里若配置了资源扫描路径.bak 文件会被重复加载后加载的文件覆盖原文件界面就乱了。解决把源码目录下所有 .bak 文件移出工程或通过 IDE 的 excluded 功能排除 .bak 后缀。我用的是笨办法导入工程后先全局搜索 *.bak统一移到 backup 文件夹眼不见心不烦也不会干扰打包。5.2 后端起不来端口被占用和 Maven 依赖下载失败现象执行 java -jar 启动后控制台提示 Port 8080 was already in use或者 Maven 打包时长时间停在下载进度上最后报 Could not resolve dependencies。原因8080 端口被之前残留的进程占用了比如重复启动过服务Maven 依赖下载失败通常是默认中央仓库太慢或本地仓库里残留了损坏的 jar 包。解决先查端口占用Windows 下执行 netstat -ano | findstr 8080拿到 PID 后在任务管理器结束进程或者直接改 application.yml 里的 server.port 换一个端口。Maven 问题就换镜像源在 settings.xml 里配置阿里云镜像然后删掉本地仓库里对应 groupId 的目录重新拉取。5.3 小程序请求后端一直失败跨域和合法域名双重拦截现象模拟器里点登录控制台报 request:fail或者后端明明有日志但小程序就是收不到返回。原因分离开发时有两个拦截点。一是微信小程序的合法域名限制request 的 URL 必须是已在 mp 后台配置的域名二是部分运行环境和真机调试对跨域请求的限制后端未返回 CORS 响应头。解决开发者工具里右上角详情勾选不校验合法域名这一步能解决本地联调的问题。同时在后端加一个 WebMvcConfigurer 配置放行跨域请求。下面的代码是常见做法Configuration public class WebConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) // 所有接口 .allowedOriginPatterns(*) // 允许所有来源本地联调用 .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowCredentials(true) .maxAge(3600); } }这段配置的关键在于 allowedOriginPatternsSpring Boot 2.4 以上版本用 allowedOrigins(*) 配 allowCredentials(true) 会报错改用 allowedOriginPatterns 才能让两者同时生效。OPTIONS 预检请求也是跨域里常见的坑。前端如果是 application/json 请求浏览器或部分运行环境会先发一个 OPTIONS 请求探路后端如果没有显式处理 OPTIONS请求会被拦截。上面的 allowedMethods 里带上 OPTIONS 就是为这个准备的。真机调试时记得把 BASE_URL 改成电脑的局域网 IP否则手机请求到达不了后端。5.4 数据库导入后中文乱码建库字符集和执行工具不一致现象导入 SQL 后用 Navicat 看商品表全是????但小程序端显示正常或反过来小程序显示乱码。原因SQL 文件本身就是 UTF-8 编码但建库语句没指定字符集MySQL 使用默认的 latin1 创建了表写入中文时就变成乱码。解决统一三步。第一步建库时显式指定 utf8mb4第二步确认 SQL 文件本身是 UTF-8 编码用记事本或 VS Code 打开另存时检查底部编码第三步Navicat 导入时在连接属性里把编码设为 UTF-8。改完后删除乱码库重新导入即可已经乱码的数据不要尝试修复。SQL 文件如果带有 BOM 头MySQL 5.7 对 BOM 比较敏感导入时报语法错误用 VS Code 重新保存为 UTF-8 without BOM 再执行。5.5 图片上传成功但页面显示不出来静态资源映射缺失现象卖家发布商品时选择图片接口返回成功但商品列表和详情页的图片裂开看请求路径返回 404。原因后端把文件保存到了磁盘本地目录但没有把目录映射为静态资源路径。比如文件存到 D:/upload/请求 /images/1.jpg 时后端去 resources 里找自然找不到。解决在 Java 后端里配置静态资源映射把磁盘目录映射到 URL 路径。做法是在 WebMvcConfigurer 里重写 addResourceHandlers把 /files/** 映射到 file:D:/upload/。配置后图片地址应该存相对路径前端通过拼接得到完整 URL。这个坑在部署到云服务器时更明显本地磁盘路径和服务路径要改成一致的绝对地址。如果把项目部署到云端图片保存路径还涉及到磁盘空间和目录权限建议单独规划一个存储目录并设置写权限图片访问 URL 不要写死 IP用后端接口返回相对路径前端拼接 BASE_URL 就能访问。6. 进阶把这份毕设改造成能写进简历的完整项目先对着演示视频把功能全部走一遍。视频地址在压缩包说明里也可以直接访问 https://pan.quark.cn/s/ec69fd640a2e 在线对照。管理员登录、卖家发布商品、用户下单、发货、确认收货这套流程在你的环境里必须完整复现。任何一步不一致优先查数据库初始化脚本和 BASE_URL两个环境差异点都对上了功能基本就通了。这一步做完项目才是真正属于你的而不是只在别人电脑上能跑。然后加两个提分点。第一个是订单状态机校验把第 4 章的 OrderStatus 枚举落进 Service 层新增 updateStatus 方法支付、发货、收货、取消都在一个方法里做状态校验遇到非法跳转直接抛业务异常。这个点在 Java 后端面试里经常被问到提前在项目里实现一遍比背八股文有用。第二个是接口文档用 Postman 把 /goods/list、/order/create、/user/login 这些接口整理成集合导出一份 JSON 文档放工程目录下。答辩时老师问接口怎么设计的直接打开 Postman 演示比口头描述有说服力。第三个技巧是把后台管理从纯接口验证升级成带页面的管理端。这个包里有 .vue.bak 备份文件说明原课程设计版本存在 Vue 管理端页面毕业设计精简掉了。如果时间充裕可以用 Vue 3 加 Element Plus 把用户管理、商品管理、订单管理三个页面重新搭起来复用现有 Java 后端接口前端工作量约两个晚上但项目从小程序加接口变成了小程序、管理端、接口三层完整前后端分离简历和答辩的深度完全不同。如果只做一个改动我建议补登出接口。很多毕设源码登录做得很完整登出却直接清空 token 了事后端没有失效机制。加上一个 token 失效处理或者至少在后端提供 /user/logout 接口并记录登出时间这个小细节能体现对会话管理的理解。说句实在话给自己系过安全带之后才敢说这东西值得下先跑通再改源码而不是边跑边改先对拍演示视频再谈扩展功能而不是一上来就加模块。从那以后我每次接手这类带备份文件、带批处理脚本的课程设计包都会强制走一遍备份文件清理、SQL 导入、联调对拍的流程省下的排错时间远比想象中多。希望这份拆解能帮你在校招或答辩前少走点弯路。本文还有配套的精品资源点击获取