简介:本资源是一套面向计算机专业本科生的毕业设计完整交付物,聚焦校园场景下的闲置物品交易需求,基于Spring Boot快速构建高可用Java Web应用。资源涵盖可直接部署运行的源码、结构清晰的毕业论文(含绪论、技术选型、需求与系统设计、功能实现及测试等六章)以及答辩用PPT,覆盖从开发到汇报的全流程。压缩包共785个文件,包含114个Java核心业务类、153个JavaScript前端交互脚本、44个Vue组件、44个CSS样式文件、79个GIF动效资源及SQL建表语句等,总大小22.63MB,目录组织规范,便于分模块学习与调试。已有158人下载学习,特别适合需要参考标准毕业设计范式、理解前后端分离架构落地、掌握MySQL数据库设计与Spring Boot整合实践的学生使用。 校园闲置物品交易这个方向,我从2021年就开始带学生做了,SpringBoot版本也从2.3一路换到3.x。做这个选题的人特别多,但真正能把源码、论文、答辩PPT串成一条线的并不多。今天我就把这个项目从技术选型、核心功能实现,到论文怎么写、答辩怎么讲,完整拆一遍,顺便把那些文档里查不到的坑都给你标出来。
这个项目本身不复杂,典型的前后端分离入门级全栈应用,但它把用户认证、商品发布、订单流转、文件上传、检索分页这些Web开发核心知识点全串起来了,非常适合作为课程设计或者毕业设计。你要是有SpringBoot基础,照着这篇文章一步步复现,两到三周就能跑通全套。
1. 项目整体设计与技术选型
1.1 为什么是SpringBoot而不是SSH或SSM
很多人在选型阶段会犹豫:既然学校教过SSM,为什么不直接SSM?我用实际项目经验告诉你,SpringBoot带来的开发效率提升是决定性的。SSM的痛点在于配置太繁琐——Spring配置文件、SpringMVC配置文件、MyBatis配置文件三个文件互相引用,一个applicationContext.xml写错一行,整个项目启动黑屏半小时排查。而SpringBoot通过自动配置和starter机制,只需要在pom.xml里引入一个spring-boot-starter-web,就能把SpringMVC和内嵌Tomcat全部拉起来,配置文件扔进application.yml,开箱即用。
另外一个很实际的原因是就业导向。现在去招聘网站上看,Java后端岗位要求里写SSM的越来越少,基本都是SpringBoot、SpringCloud这套。校园闲置物品交易网站作为你的入门项目,直接用SpringBoot起步,等于提前适应企业开发技术栈。它能帮你节省大量配置时间,把精力集中在业务逻辑上,而业务逻辑才是答辩时老师真正关心的地方。
1.2 核心功能模块如何规划
一个校园闲置物品交易网站,表面上看起来就三件事:发布闲置、浏览物品、联系交易。但做成毕设项目,功能太简单答辩撑不住,必须拆得细一些。我一般建议按用户角色拆成两个端,再加一个管理后台的简化版:
- 学生端(前台):用户注册登录、商品发布与编辑、商品浏览与搜索、商品详情、收藏功能、留言咨询、下单购买、订单管理、个人中心(修改资料、查看我的发布/我的订单)。
- 管理员端(后台):登录、用户管理(禁用/启用)、商品审核与下架、分类管理、订单管理、数据统计(商品数量、用户数量、订单数量)。
- 公共模块:统一异常处理、JWT登录拦截、文件上传、分页查询、敏感词过滤。
这里有个关键点,很多学生会把"交易"做成真实的线上支付,比如接入支付宝沙箱。我的建议是不要做。校园二手交易的真实场景是线上下单、线下面交,你强行接支付,不仅增加大量对接工作,还会在答辩时被老师追问资金安全、退款流程、实名认证等问题,很容易把自己问住。下单后显示"待线下交易"状态,交易完成后双方确认,这样既符合实际业务,又把复杂度控制在合理范围内。
1.3 数据库表结构怎么设计才合理
数据库设计是答辩时的高频考点,表结构是否规范,老师一眼就能看出来。我常用的表设计如下:
用户表(user):id、username、password(BCrypt加密存储)、nickname、avatar、phone、student_no(学号)、role(0学生/1管理员)、status(0正常/1禁用)、create_time。
商品表(product):id、user_id(发布人)、title(标题)、description、price(保留两位小数)、original_price(原价,可选)、category_id、images(多图存储,可用逗号分隔或单独表)、status(0在售/1已售/2下架/3审核中)、view_count、create_time、update_time。
订单表(orders):id、order_no(订单号,用时间戳+随机数生成)、product_id、seller_id、buyer_id、status(0待交易/1已完成/2已取消)、create_time、finish_time。
分类表(category):id、name、sort_order。
留言表(comment):id、product_id、user_id、content、create_time。
收藏表(favorite):id、user_id、product_id、create_time。
这里我给你两个经验提醒。第一,图片存储千万别直接把图片路径写死在数据库一条字段里。一个商品可能有多张图,要么用JSON格式存数组,要么单独建一张product_image表。我建议用JSON字符串存,简单够用,后端用List<String>接收,前端推送字符串数组,整套流程很顺畅。第二,订单表一定要做唯一订单号。这属于业务实战中的基本素养,答辩时提到"订单号设计参考了电商系统的雪花算法思路",印象分直接拉升。
2. 核心业务实现与关键代码讲解
2.1 登录注册与JWT鉴权的完整流程
登录鉴权是这个项目里绕不开的核心点,也是老师最喜欢深挖的地方。我选的是JWT,不用Session,原因很简单:前后端分离架构下,Session需要依赖Cookie,存在跨域和集群会话同步问题,而JWT是无状态认证,客户端每次请求在Header里带上Authorization: Bearer token,服务端验签通过就能解析出用户信息,天然适合这种场景。
登录流程是这样:前端传username和password,后端用BCryptPasswordEncoder.matches()校验密码(密码入库前一定要BCrypt加密,绝对不能明文存),校验通过后我用jjwt库生成token,payload里放userId和role,签名算法HS256,过期时间设置24小时。然后定义拦截器,在WebMvcConfigurer里注册,对/api/order/**、/api/user/**等需要登录的路径做拦截,放行登录、注册、商品列表查询这些公开接口。
// JWT工具类核心方法 public String generateToken(Integer userId, String role) { return Jwts.builder() .setSubject(String.valueOf(userId)) .claim("role", role) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 86400000)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); }这里有个细节值得重点说一下:路径需要做白名单放行。我见过不少项目把拦截器写得太粗暴,导致用户没登录连商品列表都看不了,这是不符合实际场景的。游客应该可以浏览闲置商品,但只有登录后才能在发布、下单时触发鉴权。这个"开放浏览、闭合交易"的设计理念,在答辩时可以主动讲给老师听,说明你有真实业务思维。
2.2 商品发布与图片上传的实现细节
商品发布页是整个系统里用户操作最重的页面。前端需要一个表单:标题、描述、价格、原价、分类、状态、图片上传。其中价格我建议用BigDecimal类型接收,前端el-input-number精确到分,后端用BigDecimal避免浮点运算精度丢失问题——这是商品类项目中很基础但很多人会踩的坑。
图片上传我用的方案是本地存储:前端拿到图片文件后,通过multipart/form-data请求到/api/upload接口,后端用UUID.randomUUID()重命名文件,防止文件名冲突,然后按日期分目录存放:/upload/2025/06/xxx.jpg。同时限制文件类型和大小,一般只允许jpg、png、gif,最大5MB,防止有人传脚本文件或者大文件把磁盘打爆。
@PostMapping("/upload") public Result<String> upload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return Result.error("上传文件为空"); } String originalFilename = file.getOriginalFilename(); String ext = originalFilename.substring(originalFilename.lastIndexOf(".")); String filename = UUID.randomUUID().toString().replace("-", "") + ext; String datePath = new SimpleDateFormat("yyyy/MM").format(new Date()); File dir = new File(uploadPath + datePath); if (!dir.exists()) { dir.mkdirs(); } file.transferTo(new File(dir.getAbsolutePath() + File.separator + filename)); return Result.success("/upload/" + datePath + "/" + filename); }你注意到没有,我返回给前端的不是完整URL,而是相对路径。前端拿到后拼接http://localhost:8080/upload/...来展示。这么做的好处是后期换OSS、换域名,只需要改一个常量,不用动数据库里存好的数据。你在写论文的时候把这一小节重点写清楚,配合代码画个流程说明,这块就是你的亮点。
2.3 订单交易状态机的设计与实现
订单状态是交易系统的灵魂。我在项目里定义了三个状态,简洁并且覆盖完整场景:
- 待交易(0):买家下单后,等待双方线下见面交易。
- 已完成(1):交易确认完成,商品状态同步改为"已售"。
- 已取消(2):买家或卖家主动取消,商品自动恢复为"在售"状态。
用状态机来设计的好处是,所有状态流转都是可控的,不会出现"订单已取消但商品还显示已售"这种脏数据。我在代码里每个状态流转方法都做了前置校验,以防非法流转。
@Transactional public void buyProduct(Integer productId, Integer buyerId) { Product product = productMapper.selectById(productId); if (product == null || product.getStatus() != 0) { throw new BusinessException("商品不存在或已被购买"); } // 校验商品状态、锁定库存、创建订单 Orders order = new Orders(); order.setOrderNo(generateOrderNo()); order.setProductId(productId); order.setSellerId(product.getUserId()); order.setBuyerId(buyerId); order.setStatus(0); ordersMapper.insert(order); // 商品下架 product.setStatus(1); productMapper.updateById(product); }这里我加了@Transactional事务注解,因为创建订单和修改商品状态是两个操作,必须同生共死。这个问题答辩时几乎是必问的:"为什么用事务?不用会怎样?"你要能答出:不加事务时,订单创建成功但商品状态更新失败,同一个商品会被卖两次,产生超卖问题。答出这一层,老师就知道你理解了事务的核心价值。另外,商品编辑时我也做了原作者校验,只有发布人本人才能改自己的商品,这是资源越权控制的经典案例,同样值得在项目里实现并写进论文。
2.4 搜索、分页与消息提醒的实现
搜索功能不需要上Elasticsearch,那是高射炮打蚊子。直接用MySQL的LIKE模糊查询就行,按标题LIKE CONCAT('%', keyword, '%')搜索,按分类、价格区间组合过滤。不过要注意,LIKE查询无法命中索引,数据量大了会慢,但你校园场景几千条数据完全没问题。要是想加亮点,可以用MyBatis-Plus的LambdaQueryWrapper,代码简洁,答辩时展示加分:
LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Product::getStatus, 0) .like(StringUtils.isNotBlank(keyword), Product::getTitle, keyword) .eq(categoryId != null, Product::getCategoryId, categoryId) .orderByDesc(Product::getCreateTime); IPage<Product> page = productMapper.selectPage(new Page<>(current, size), wrapper);分页这块用MyBatis-Plus的内置分页插件PaginationInnerInterceptor,配合Page对象,从第几页拿几页很顺手。返回结果我统一封装成Result对象,包含code、message、data三个字段,前端根据code做统一处理,比如后端返回401就跳转登录页,这套设计也是企业级项目标配,值得写进论文技术选型部分。
消息提醒这块,要是时间不足可以不做站内信,用最简单的"留言评论"替代。卖家在商品详情页能看到买家对自己的留言,在个人中心看到"我的消息"列表。别小看这个功能,它实现了用户之间的轻量交互,让整个平台不是"死"的。如果你时间充裕,可以引入WebSocket做实时通知,但那是锦上添花,先保证主体功能稳定运行。
3. 从零到一搭建与实操全流程
3.1 开发环境与工具版本选型
环境准备这一关,很多人卡在版本不对上,我直接给你一套踩过坑之后验证可用的组合:
- JDK:1.8或11(如果选SpringBoot 3.x,必须JDK 17+,我建议你用JDK 1.8 + SpringBoot 2.7.x,教程多、踩坑资料全、兼容性好)
- Maven:3.6.3及以上
- 数据库:MySQL 5.7或8.0,我推荐8.0,性能更好,
LocalDateTime映射更友好 - IDE:IntelliJ IDEA 2023.2及以上
- 前端:Vue 2 + Element-UI(或者纯HTML + Thymeleaf模板引擎,如果你不想写前后端分离)
这里说句掏心窝的话:如果你前端基础薄弱,不要硬上Vue。直接用Thymeleaf服务端渲染,或者简单写几个HTML页面+原生AJAX,把精力放在后端逻辑上,效果反而更好。很多学生被前端折腾到最后,后端代码都没时间完善,得不偿失。
3.2 快速初始化SpringBoot项目
初始化项目有两条路。一条是访问start.spring.io网站,填好Group(比如com.campus)、Artifact(比如campus-trade),勾选Spring Web、MyBatis Framework、MySQL Driver、Validation依赖,然后生成并导入IDEA。另一条是在IDEA里直接新建Spring Initializr项目,效果一样。
项目创建好后,先把pom.xml补齐:MyBatis-Plus、Lombok、JWT、Hutool这4个依赖基本是必需品。然后立刻配置application.yml,把端口(8080)、数据库连接、MyBatis-Plus日志、文件上传路径配置好。我建议把数据库连接给你写清楚格式:
spring: datasource: url: jdbc:mysql://localhost:3306/campus_trade?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:mapper/**/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl启动前先去MySQL里建好数据库,把SQL脚本执行一遍。如果启动报错,90%是数据库连接没配好,这是新手最常见的问题。启动成功后,浏览器访问http://localhost:8080,能看到页面,说明项目骨架已经通了。
3.3 前端页面与后端接口的对接技巧
前端部分,如果你走前后端分离,我用Vue2 + Element-UI配合Vue Router做单页应用。页面一般是:登录页、注册页、商品列表页、商品详情页、发布商品页、个人中心页、后台管理页。用Axios做请求,重点处理拦截器:
// axios请求拦截 service.interceptors.request.use(config => { const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = 'Bearer ' + token; } return config; }); // axios响应拦截 service.interceptors.response.use( response => response.data, error => { if (error.response.status === 401) { router.push('/login'); } return Promise.reject(error); } );接口对接时最容易出的问题就是跨域。你需要在后端加一个CORS全局配置,允许http://localhost:3000或http://localhost:8081这样前端地址的请求进来。这个配置我建议直接写一个CorsConfig类,实现WebMvcConfigurer接口,重写addCorsMappings方法,放行所有路径和常用方法。这块在纸上写起来很快,但实际操作时如果漏了,前端页面全都调到不出数,很痛苦。
另一个小技巧是接口响应统一结构。我在前面说过封装Result对象,前端根据code === 200判断成功。早年间我见过有学生代码里有的接口返回Map,有的返回String,有的直接返回实体类,前端对接时一团乱麻。统一响应格式这个事看似简单,实际是保命的,能帮你省掉大量调试时间。
3.4 项目打包与本地部署上线
项目开发完成后,打包部署是最后一个关卡。后端在IDEA右侧Maven面板运行package命令,会在target目录生成一个jar包。SpringBoot内置了Tomcat,所以部署时不需要额外装Tomcat,直接:
java -jar campus-trade-0.0.1-SNAPSHOT.jar如果你是前后端分离,前端则执行npm run build,生成的dist目录可以用Nginx托管,然后通过Nginx反向代理把/api前缀的请求转发到后端的8080端口。这一套流程就是企业里最常见的"前后端分离项目部署方案"。写论文时,在"系统部署"章节把这条链路写清楚,配上Nginx配置截图,内容很扎实。
还有一个点要注意:打包后的jar包运行时,文件上传路径和开发时可能不一致。建议把上传路径配置成绝对路径,比如在application.yml里写file.upload-path: /opt/campus/upload/,而不是代码里写死相对路径。不然你把jar包部署到服务器上,目录结构变了,图片也传不上去了。
4. 项目开发中常见问题与排查技巧
4.1 启动时报端口被占用怎么办
这个问题几乎每个做SpringBoot项目的人都会遇到。Tomcat默认8080端口,启动时报Web server failed to start. Port 8080 was already in use.,十有八九是之前启动过的项目没关掉。Windows系统按Win+R输入cmd,执行netstat -ano | findstr 8080,找到占用端口的PID,然后taskkill /F /PID 这个PID。Linux系统用lsof -i:8080和kill -9 PID,也是一样的套路。
如果你不想每次杀进程,可以把端口改成不常用的,比如server.port: 8088。但改了端口之后,前端所有请求地址里的端口也要同步改,不然又会陷入"页面打不开"的泥潭。这个细节,报错排查时最容易忽略。
4.2 图片上传成功但页面显示不出来
这个问题我见的太多了。上传接口返回200,文件也保存在本地了,但前端访问http://localhost:8080/upload/xxx.jpg返回404。原因很简单:SpringBoot默认的静态资源映射只覆盖classpath:/static/、classpath:/public/等几个目录,你上传到本地的磁盘路径不在映射范围内。
解决方案是写一个WebMvcConfiguration配置类,把磁盘上传目录映射成URL路径:
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/upload/**") .addResourceHandler("file:" + uploadPath); }配置好以后,/upload/前缀的请求就会映射到磁盘目录,图片就能正常显示了。这个问题在开发时经常被忽略,因为你用IDEA运行时可能偶尔能访问到(取决于工作目录),一旦打包成jar部署就绝对404。所以建议你从一开始就加上这个配置,省得后面排查到怀疑人生。
4.3 数据库插入中文乱码
中文乱码的原因集中在两个地方:数据库连接URL没有指定字符集,或者表本身不是utf8编码。连接URL里一定要有characterEncoding=utf8,就像我前面配置写的那样。表结构如果创建时没指定字符集,可以用SQL改:
ALTER TABLE product CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;另外,MySQL 8.0默认字符集已经是utf8mb4了,5.7则需要手动确认。建议建库时就写清楚:
CREATE DATABASE campus_trade DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;中文乱码这个问题很玄学,有时候你改了代码没用,改数据库字符集才有用,有时候是前端页面没设<meta charset="utf-8">,甚至后端接收参数时经过程序乱了一遍。排查思路是先确认数据库端数据是否正常,再排查前后端传输环节,用Postman直接调接口是最快的定位手段。
4.4 高频报错与解决方案速查表
| 错误场景 | 可能原因 | 解决方案 |
|---|---|---|
启动报class not found | 遗漏Maven依赖 | mvn clean install刷新依赖,检查pom是否引入对应starter |
| 接口返回401 | JWT过期或未带token | 检查Axios拦截器是否设置Header,检查token有效期 |
| 操作数据库报TODO空指针 | @Autowired注入失败 | 检查Service是否加@Service注解,Mapper是否加@Mapper或@MapperScan |
| 前端跨域报错 | 后端未开启CORS | 添加CorsConfig全局配置类 |
| MyBatis-Plus分页不生效 | 未配置分页插件 | 添加PaginationInnerInterceptor并指定数据库类型 |
| 商品列表能查到但详情404 | ID类型不匹配 | 检查前后端ID的JSON序列化,统一为String或Long |
| 部署后图片路径失效 | 静态资源映射未配置 | 在配置类中注册/upload/**到本地路径 |
这里面的前后端ID精度丢失问题,值得单独提醒一下。Java的Long类型ID传到前端JavaScript时,如果数字超过Number.MAX_SAFE_INTEGER(9007199254740991),精度会丢失。一般自增ID不会超过,但你要是用了雪花算法生成ID,必然踩坑。处理办法是用Jackson的ToStringSerializer把Long序列化成String:
@JsonSerialize(using = ToStringSerializer.class) private Long id;这个点不仅面试会被问,答辩时主动跟老师说"我处理了前后端大数精度问题",绝对是一处加分亮点。
5. 论文写作与PPT答辩的全套思路
5.1 论文框架该怎么搭
论文千万不要写成"用户管理模块有增删改查"这种流水账,老师看了会崩溃。我的建议是采用标准软件开发文档结构,同时把自己在项目中做的技术决策写进去,让论文有"技术深度":摘要要突出"基于SpringBoot+Vue的校园闲置物品交易网站"的背景、技术方案和主要成果,关键词放SpringBoot、校园闲置交易、推荐算法(如果你做了)、JWT鉴权。第一章绪论讲研究背景和意义,结合校园闲置资源浪费的现状,国内外研究现状可以引用一些二手交易平台的资料。第二章相关技术介绍,把SpringBoot、Vue、MySQL、MyBatis-Plus、JWT这些用到的技术逐一介绍,每项写200字左右,重点写为什么选它。第三章需求分析,画用例图、角色分析,把功能需求和非功能需求分开写,还可以描述一下春游闲置、书籍转让等具体场景。第四章系统设计,写总体架构图、功能模块图、数据库E-R图和数据表结构,这是最核心的一章,表结构设计细节全部丢进去。第五章系统实现,按功能模块展开,每个功能要有核心代码段加运行效果截图双管齐下,不要只贴代码不贴界面。第六章系统测试,写测试用例表和测试结果,至少包含功能测试和兼容性测试,加分项是写一段接口性能压测或数据库优化调优的过程。最后结语加致谢加参考文献。
这里有个技巧:论文里所有图表一定要自己截图或者用工具画,不能用网上随便找的图。查重系统现在对图片识别已经很智能,文档结构类似度高一样会被标记。我一般用draw.io画架构图,用Navicat导出表结构后截图,效果干净且专业。
5.2 PPT演示的逻辑顺序
答辩PPT不要做成论文的缩略版,而是把"你做了什么事、解决了什么问题、有什么亮点"讲清楚。我常用的PPT结构是7页:封面,问题背景。系统功能结构图,用一张图把功能模块全部画出来。技术架构图,展示SpringBoot + Vue的前后端分离架构。核心功能演示,放3到4页截图,包括商品列表、商品发布、订单流程、后台管理。重点技术讲解,选1到2个技术点深入展开,比如JWT认证流程或订单事务处理。系统测试,放测试用例和结论。最后是总结展望和致谢。
演示时要注意的是,PPT里文字不能多。一张页面放一个核心观点,图为主,文字为辅。答辩现场大家不会仔细读PPT,你要靠图表和讲述把项目的价值讲出来。演示时间控制在8到10分钟,讲的时候不要逐字念PPT,而是讲思路、讲设计、讲踩过的坑,这样反而显得从容。答辩前我建议你在宿舍或者教室走两遍流程,重点练习演示环节的流畅度,很多同学平时写代码6得很,一上台就紧张到鼠标点不准,这是心态问题,但练习能明显改善。
5.3 答辩高频问题提前准备
我把这几年学生答辩时被老师问到的问题整理了一份清单,你在准备阶段把这几个问题想明白,心里就有底了:
- 为什么选择这个课题?从校园闲置资源浪费、绿色环保、自己的技术积累三个角度去答。
- 系统有哪些功能模块?画一下系统功能结构图,按前台、后台、公共模块三个维度讲。
- SpringBoot相比传统SSM的优势是什么?自动配置、起步依赖、内嵌服务器、简化部署,这四点背熟。
- 如何保证数据一致性?指向订单模块,回答@Transactional事务管理,防止多次下单。
- 数据库设计怎么保证效率?索引设计、分页查询、MyBatis-Plus的优化。
- 交易安全问题怎么解决?管理员审核商品、用户实名学号注册、线下面交机制。
- 这个系统还有什么可以改进的地方?推荐算法(基于用户行为)、消息推送(WebSocket)、接入真实支付、部署到服务器公网访问,说一个就够了,别贪多。
我的经验是,答辩老师最看重的不是你项目多复杂、技术多前沿,而是你对自己做过的每一行代码、每一个设计决策能否讲清楚来龙去脉。所以你在写代码的过程中,每做一个技术方案,都顺手记一下"为什么这么选",答辩时自然有话说。那些全程讲不清"为什么"、只会念代码的同学,即使项目功能很全,最终分数也不会太高。
6. 写在最后的一点建议
这个项目我从最开始带学生到现在,改了几十版的代码,做坏了无数次数据库,也看大家踩过各种莫名其妙的坑。如果你是自己一个人做,我最后的建议是:先跑通再优化,先做完再完善。不要一上来就想着加这个功能加那个功能,先把用户登录、商品发布、下单交易这条主链路跑通,哪怕丑陋一点,能用就行。跑通之后,再一点一点加收藏、加评论、加后台统计,这时候你心里对系统的掌控感完全不同。
另外,源码和论文里的代码、截图要保证一致性。我见过不少学生论文里贴的代码和实际项目里写的完全对不上,答辩演示的时候老师一对照就露馅了,这属于低级错误。每个功能模块实现完之后,顺手把核心代码复制进论文对应章节,边写边录运行效果,这样最后整理材料时就不用再到处翻找了。
做项目的过程一定会有卡壳的时候,搜索引擎、网上教程、大模型都可以用,但第一步永远是自己尝试去解决。你自己调通一个bug后获得的那种确定感,比任何现成的答案都值钱。希望这篇文章能帮你少走点弯路,也欢迎你在实际开发中遇到具体问题后,回来对应章节找找答案。
本文还有配套的精品资源,点击获取