
每年到这个时间点都有一批学弟学妹在毕设选题上纠结到不行。如果你点进这篇文章大概率是在琢磨“基于SSM的农产品销售系统”到底怎么做、怎么答辨、怎么和导师沟通需求甚至已经被某些机构的“全bao定制”价格劝退了。先说个实在话这个题目能成为经典毕设是有原因的——需求明确、技术栈成熟、工作量可控而且特别适合讲清楚“业务逻辑”和“框架整合能力”。更重要的是这套思路不只是为了交差做完之后你对SSM的理解会完全不一样后面做Spring Boot项目也能无缝迁移。我尽量用一篇文章把从选题到答辩的完整闭环讲清楚包括数据库怎么设计、核心功能怎么实现、远程调试怎么配、论文和源码怎么配合演示以及那些指导老师不会明说但答辩时一定会问的细节。文章不短但都是实操里趟出来的经验照着走能少踩很多坑。1. 项目需求拆解农产品销售系统的核心问题是什么先说这个系统到底做什么。农产品销售系统本质是一个典型的“多角色B2C电商平台”但它和普通商城有个明显区别农产品有季节性、易损耗、产地分散、规格不统一这些特性。所以作为毕设你不需要做什么大数据推荐、直播带货这种花活但要把“商品管理—购物车—下单—订单管理”这条主链路做扎实再配上用户和管理员两个维度的诉求。1.1 角色划分与权限模型这个系统通常分三种角色普通用户买家、管理员、还有一部分项目会加一个“商家/农户”角色。我的建议是如果导师没有特别要求做“用户管理员”两个角色就够了原因有两个一是角色变多意味着订单归属、商品上架权限、分账逻辑都会复杂写代码和写论文的工作量会翻倍二是答辩老师更关心你有没有把核心业务想清楚而不是角色数量。权限层面用最简单的拦截器方案就能搞定。登录成功后把用户对象放进Session写一个LoginInterceptor在SpringMVC配置里注册拦截路径和放行路径。需要记住的是静态资源JS、CSS、图片一定要放行否则页面样式全丢。管理员和用户的区分就在数据库的role字段查出来是1就走管理员逻辑是0就走用户逻辑。别一上来就上Spring Security或Shiro对纯SSM项目来说那是给自己找麻烦而且论文里不好解释框架耦合。1.2 功能模块清单与优先级我把功能模块按“必须做”“推荐做”“有余力再做”分个级必须做用户注册登录、商品分类展示、商品搜索、商品详情、购物车增删改、提交订单、订单列表与详情、后台管理员登录、后台商品管理增删改查、上下架、后台订单管理发货、查看、后台分类管理。推荐做轮播图管理哪怕是在后台写死几张图片、收货地址管理、订单状态流转记录待付款/待发货/待收货/已完成/已取消、分页查询、搜索关键字高亮。有余力再做图片上传到服务器本地目录、销量统计图表用ECharts、PDF订单导出、用户收藏、评论。没必要追求大而全。有些同学特别喜欢加功能结果项目堆到上万行代码问起来哪里都说不清楚答辩反而不讨好。把“必须做”的模块写出质量每一条链路能跑通就已经是中等偏上的合格毕设了。1.3 业务流程的“为什么”整个系统最核心的一条订单流程是这样的用户浏览商品 → 加入购物车 → 确认订单 → 填写/选择收货地址 → 提交订单此时生成订单和订单项 → 管理员发货 → 用户确认收货 → 完成。关键是“提交订单”这一步必须同时做两件事生成一条订单记录order表和生成多条订单项记录order_item表并且扣减商品库存。这三件事必须发生在同一个数据库事务里否则就会出大问题如果只生成了订单但库存没扣超卖如果库存扣了但订单没生成用户钱白扣。这类逻辑在论文里写“事务一致性”是非常加分的点因为说明你理解分布式事务之外的基础事务重要性。2. 技术选型与框架搭建为什么2025年还在用SSM我知道你心里可能有疑问现在都Spring Boot满天飞了做一个毕设还用SSM是不是有点过时这个问题我在知乎上也看到过很多讨论。从一个做毕设的实际角度出发SSM有两个无法替代的优势。第一个优势是“能说清楚”。Spring Boot的自动配置确实方便但很多同学做完都不知道底层发生了什么答辩被追问两句就卡壳。SSM不一样Spring的IOC和AOP、SpringMVC的请求流转、MyBatis的SQL映射每一层都是显式配置你必须清楚每个配置文件的每一行是干什么的这本身就是学习的过程。第二个优势是“工作量恰好”。毕设要求的是“体现综合运用所学知识的能力”SSM让你既要写配置、写XML、写Mapper、写JSP又要处理各种莫名其妙的jar包冲突这个过程对锻炼工程能力很有价值。而且关键是如果你以后要读研或者做Java开发从SSM迁移到Spring Boot就是几天的事。底层组件完全一样只是配置方式变了。所以不是SSM过时了而是“只学框架不学原理”的人过时了。2.1 技术栈清单与环境要求整体技术栈大概是这些JDK 1.8不要上17很多老依赖不兼容Maven 3.6用阿里云镜像MySQL 5.7或8.0建议5.78.0需要改驱动和时区配置多一事不如少一事Tomcat 8.5或9.0不要用Tomcat 10包名变了SSM会踩坑IDEA 2021以后版本社区版就能做但专业版更好用前端JSP JSTL Bootstrap 简单的jQuery/Ajax有同学喜欢把前端换成Vue技术上倒没有不行但主题会变成前后端分离那SSM的很多写法就不适用了。除非你有扎实的前端基础否则我还是建议JSP理由只有一个代码量最少、跑通概率最高。毕设要的是一个稳定可演示的系统不是技术试验田。2.2 项目结构与配置文件的组织方式SSM项目结构要按规范分层这是论文里会重点写的内容也直接影响后期维护controller包接收请求返回视图或JSONservice包业务逻辑层接口实现类分离写dao/mapper包MyBatis的Mapper接口entity/pojo包数据库对应的实体类vo包可选给前端展示用的组合对象比如订单详情VO里同时包含订单信息和商品列表interceptor包拦截器util包通用工具类MD5加密、分页参数等resources目录下放jdbc.properties、mybatis-config.xml、spring-mvc.xml、applicationContext.xml、log4j.properties配置文件有四个是核心每个都有易踩的坑。applicationContext.xml只管service、dao、数据源和事务不要扫描controllerspring-mvc.xml只管controller和视图解析器不要重复扫描service。这两个配置的“职责边界”如果不清楚就会出现事务失效或者Bean找不到的情况。2.3 MyBatis逆向工程与手写Mapper的取舍MyBatis的Mapper层有两种获得方式一种是使用MyBatis GeneratorMBG自动生成实体和单表CRUD另一种是手写SQL。我的建议是“单表操作用生成、多表查询必须手写”。为什么因为自动生成的代码虽然省力气但一旦遇到多表关联查询订单详情要联查商品名、用户信息要联查地址自动生成就无能为力了。而手写SQL虽然麻烦但你能精确控制每一条查询逻辑也方便在SQL上加动态判断比如搜索框里商品名可能为空、分类可能为空。比如搜索商品的Mapper方法可以写成select idsearchProducts parameterTypemap resultTypecom.example.entity.Product select * from product where if testkeyword ! null and keyword ! and name like concat(%, #{keyword}, %) /if if testcategoryId ! null and category_id #{categoryId} /if if teststatus ! null and status #{status} /if /where order by create_time desc limit #{offset}, #{pageSize} /select这种动态SQL就是MyBatis的核心优势。注意分页不要用物理分页插件PageHelper虽然方便但是本科毕设里你解释不清楚插件原理反而麻烦而且用limit和offset已经够用了。3. 数据库设计一张好表胜过十行代码数据库设计是这个项目里最值得花时间打磨的部分。很多同学喜欢急匆匆写代码结果表设计不合理后面加需求到处改表结构痛苦到怀疑人生。我建议项目启动前先用半天时间把表和字段理清楚。3.1 核心表结构与字段说明按最小但完整的电商模型你需要这些表user用户表id, username, password, nickname, phone, email, avatar, role, create_timecategory商品分类表id, name, parent_id, sort_orderproduct商品表id, category_id, name, subtitle, main_image, price, stock, sales, status, create_time, update_timecart_item购物车表id, user_id, product_id, quantity, checked, create_time, update_timeorder订单主表id, order_no, user_id, total_amount, pay_amount, receiver_name, receiver_phone, receiver_address, status, create_time, pay_time, deliver_time, finish_timeorder_item订单明细表id, order_id, product_id, product_name, product_image, current_price, quantity, total_priceaddress收货地址表id, user_id, receiver_name, receiver_phone, province, city, district, detail, is_default这几个表之间的关系很清晰一个用户有多个购物车记录、多个订单一个订单对应多个订单明细一个分类下有多个商品。在ER图里体现为主键外键关联论文里的ER图就照这个画。3.2 为什么订单表和订单明细表要分开这是数据库设计里一定要能讲清楚的经典问题为什么不下单的时候把商品快照直接塞到订单表里答案有两个层面。第一是“范式层面”一个订单包含多个商品如果一个订单一条记录塞详细商品信息必然出现大量冗余字段比如用户地址在每个明细里重复这违背了第三范式。第二是“业务层面”商品信息是会变的——价格可能会调、名称可能会改、商品可能会下架。订单是历史数据必须保留下单那一刻的“快照”所以order_item里专门设计了product_name、current_price这些字段目的就是当商品表变化时订单里记录的还是付款当时的商品信息。这个设计思路在答辩时非常加分因为说明你不是机械地建表而是理解“数据冗余在某些场景下是必须的”。3.3 订单状态字段的枚举设计订单状态建议用int类型用0、1、2、3、4表示不同状态0待付款1待发货已付款2待收货已发货3已完成已收货4已取消有些系统会再加一个5已退款但毕设一般不需要。在Java代码里最好定义一个常量类OrderStatus不要把魔法数字直接散落在代码里public class OrderStatus { public static final int UNPAID 0; public static final int PAID 1; public static final int DELIVERED 2; public static final int FINISHED 3; public static final int CANCELED 4; }这样写的好处是后面写业务判断时代码可读性很强比如“order.getStatus() OrderStatus.PAID”一目了然。还有一个隐藏好处论文的代码说明部分可以直接摘这一段显得工程素养很好。3.4 常见的设计坑有两个坑我在帮人改代码时反复遇到。第一个是金额字段用了double这是绝对不能忍的。数据库里金额要用decimal(10,2)Java实体类里用BigDecimal。double有精度问题做乘法单价*数量和累加多个订单项合计时会出现0.30000000000000004这种尴尬结果。哪怕你现在的数据量完全看不出问题答辩老师问一句“为什么用BigDecimal”答得上来就加分答不上来就是基础不牢。第二个是商品库存没有默认值或者允许负值。可以在product表上加一个约束stock字段默认0并且业务层在下单前做库存判断库存≥购买数量才允许下单。下单后执行“update product set stock stock - #{quantity} where id #{productId} and stock #{quantity}”这句SQL本身就带条件天然防超卖。4. 核心功能实现从代码层面打通主链路配置文件和表结构就绪后就可以开始写功能了。我按一个正常开发顺序把核心功能拆开讲每一段都给出关键代码和踩坑提醒。4.1 用户注册登录MD5加密和Session管理注册的逻辑不复杂前端提交用户名、密码、确认密码后端先校验用户名是否已存在去user表查一遍不存在则把密码加密后插入。密码加密我建议用MD5加盐或者直接用一个简单的加密工具类。虽然从安全性角度MD5已经被认为不够安全但在毕设里完全够用而且容易解释。关键是“不能明文存密码”这条底线必须守住。登录成功后把关键信息放进SessionRequestMapping(/login) public String login(String username, String password, HttpSession session, Model model) { User user userService.login(username, DigestUtils.md5Hex(password)); if (user null) { model.addAttribute(errorMsg, 用户名或密码错误); return login; } session.setAttribute(loginUser, user); return redirect:/index; }注意返回“redirect:/index”而不是直接返回视图名这个细节很重要如果用转发浏览器地址栏还是/login用户刷新页面时表单会被重复提交用重定向就能避免这个问题这也是PRGPost/Redirect/Get模式的基本思想。4.2 购物车用数据库存还是Session存购物车有两种存储方案存在session里或者存数据库表里。Session方案的优点是代码量少、不需要额外建表但缺点很明显——换浏览器、清缓存、cookie失效就全没了而且关闭浏览器再打开购物车空空如也观感很差。用数据库存购物车也就是前面建的那个cart_item表体验会好很多用户登录后从数据库查出自己的购物车记录用户可以随时回来查看也方便后台统计。购物车的核心操作就是加购、改数量、删商品、查询列表。改数量时注意一个细节每次修改数量后页面上的商品小计和总价用jQuery在前端动态计算即可不需要请求后端这样用户体验更流畅。只有提交订单时后端才重新从数据库读取最新购物车数据计算价格确保服务端价格永远可信。前端价格只是为了展示后端价格才是最终依据。4.3 提交订单事务、订单号与库存扣减提交订单是这个项目里最重要的一个方法前前后后要完成这些事根据userId查出勾选的购物车记录遍历购物车校验商品是否存在、状态是否上架、库存是否充足计算订单总金额用数据库里的价格不能信前端传过来的生成订单主记录状态为待付款把购物车明细复制为订单明细记录商品快照扣减库存清空购物车中已下单的商品这个方法必须加Transactional注解并且注意两点第一注解要加在public方法上且不能同类内部调用第二事务默认只回滚RuntimeException如果代码里手动catch了异常需要手动setRollbackOnly或把异常重新抛出去否则会出现“部分成功”的脏数据。订单号不能用简单的自增id。一般是用时间戳用户id随机数拼一个唯一字符串保证并发下不重复。写个简单的生成工具public static String generateOrderNo() { SimpleDateFormat sdf new SimpleDateFormat(yyyyMMddHHmmss); String timestamp sdf.format(new Date()); String random String.valueOf((int)((Math.random() * 9 1) * 100000)); return timestamp random; }这种格式既方便搜索也能在订单列表里直观看到下单时间也算是一种可说的设计。4.4 管理员端商品管理和订单处理管理员端功能不多但有一块特别容易被忽略——图片上传。商品主图不可能只靠URL地址必须提供一个上传入口。SSM里上传图片的通用做法是前端表单加enctypemultipart/form-data后端用CommonsMultipartResolver配置一个文件上传解析器接收MultipartFile后写到服务器指定的物理路径再把相对的访问路径存到数据库。要注意的地方是上传目录要提前建好并放到tomcat/webapps下的项目目录里或者配置虚拟路径映射图片访问路径不要存“绝对路径”因为换个环境运行就失效了应该存“项目内相对路径”比如/upload/product/xxx.jpg服务器目录需要设置写入权限Windows本地一般没问题Linux服务器上要chmod一下订单管理方面管理员可做的操作主要是“发货”把待发货订单改成待收货记录发货时间。如果做一个“订单状态时间线”比如在订单详情页展示创建时间、支付时间、发货时间、完成时间既好看又很容易实现论文里还能截图当成果展示。5. 本地部署、远程调试与问题排查标题里特别提到了“远程调试”这是很多同学买了二手代码或者找别人定制完项目后最头疼的部分。毕竟代码拿到手跑不起来比没代码还让人崩溃。5.1 从零部署一套SSM项目的标准步骤不管代码是哪里来的部署思路是通用的用IDEA打开项目等Maven把依赖下载完如果一直下载失败检查settings.xml里的镜像源修改jdbc.properties里的数据库地址、用户名、密码在MySQL中创建数据库字符集选utf8mb4然后导入sql文件在IDEA里配置TomcatDeployment里添加Artifactwar exploded模式Application context设置成项目名点击Tomcat旁边的debug按钮启动看到“Connected to server”就说明启动成功浏览器访问http://localhost:8080/项目名/看到首页即可这里有个很常见的问题很多同学启动Tomcat后页面报404第一反应是代码有问题其实大概率是Artifact没配对。IDEA中Web项目的部署本质是把项目打包成war包放到Tomcat的webapps下如果Artifact名称context路径和访问URL不一致就会404。所以遇到404先检查“Run/Debug Configurations”里的Deployment配置。5.2 远程调试Tomcat的配置方法远程调试的原理是JVM支持通过JDWPJava Debug Wire Protocol协议与IDE通信在远程服务器上开启调试端口后本地IDEA连接进去就能打断电、看变量、单步执行和本地调试体验完全一样。具体步骤如下。先在远程服务器上找到Tomcat的catalina.shWindows是catalina.bat在文件开头加上CATALINA_OPTS-agentlib:jdwptransportdt_socket,servery,suspendn,address5005注意参数说明servery表示让Tomcat作为调试服务端suspendn表示开启调试端口后不要阻塞Tomcat启动如果设置成y本地调试器没连上之前Tomcat会一直等着远程启动就会卡住address5005是调试端口可以自己换。然后重启Tomcat确认5005端口已经监听。Linux上用netstat -tlnp可以查到。接着在本地IDEA里Run → Edit Configurations → 左上角加号 → Remote JVM Debug填写远程服务器IP和端口5005把“Use module classpath”选中为你的项目模块。最后点debug按钮连接不出意外你就会看到“Connected to the target VM”的提示。然后就可以在本地代码里打断点了。但这里有个限制如果远程代码和本地代码不是完全一致断点位置可能会偏移所以远程调试前要先确保代码是同步好的。5.3 远程调试的坑与安全提醒远程调试这门技术官方叫JPDA远程调试实际用起来有两个坑。第一个坑是防火墙。云服务器不开放5005端口的话本地永远连不上。解决方法是去安全组规则里添加入站规则放行5005端口。注意开完记得在调试结束后关掉否则调试端口裸奔在公网上非常危险——任何人知道IP和端口都能连上你的JVM调试端口这就等于把你的应用底裤扒了。所以调试完一定记得杀掉Tomcat的调试参数或者用防火墙把端口关掉。第二个坑是本地项目编译版本和远程不一致导致断点不生效。稳妥做法是先在本地完整编译一次再把项目打成war上传到远程确保两边代码一致再做远程调试。远程调试不会的问题还可以用最笨但最有效的方式排查看日志。SSM项目里log4j或logback的配置要先弄好遇到异常把堆栈贴到搜索引擎一般都有答案。5.4 常见异常速查表我把毕设群里问的频率最高的几个问题整理一下几乎每个都是经典。异常现象原因解决方案启动报ClassNotFoundException: SpringServletContainerInitializerTomcat和Spring版本不兼容确认用的是Tomcat 8/9而不是Tomcat 10数据库连接失败 Access denied for userjdbc.properties密码错或用户无权限用命令行先试一下mysql -u root -p能通否连接MySQL8报Public Key Retrieval is not allowedMySQL8默认认证插件问题URL加allowPublicKeyRetrievaltrueuseSSLfalse查询中文乱码连接字符集和页面编码不一致URL加characterEncodingutf8过滤器统一UTF-8浏览器访问CSS/JS全挂拦截器把静态资源拦截了在spring-mvc.xml里加mvc:resources映射事务不生效数据只成功一半被同类内部方法调用或异常被catch了事务方法拆分到不同Service中或手动回滚MyBatis报BindingException: Invalid bound statementMapper接口和XML的namespace不对应检查namespace必须是接口全限定名页面报JSTL标签无法解析缺少jstl和standard依赖pom.xml里加上即可刷新页面重复提交订单表单POST后直接返回视图改为“redirect:/xxx”重定向这张表打印出来贴在工位上能省下很多百度时间。6. 论文文档写作与答辩表现的关键策略很多同学代码写得很溜一到写论文就头疼。其实毕设论文有非常固定的套路掌握好了就是填空题。6.1 文档结构与页面规划传统本科毕设论文以计算机类为例一般这样分章第一章 绪论研究背景和意义、国内外研究现状、主要研究内容第二章 相关技术介绍JSP/Servlet、Spring、SpringMVC、MyBatis、MySQL第三章 系统分析可行性分析技术/经济/操作、需求分析功能性/非功能性、用例图第四章 系统设计整体架构图、功能模块设计、数据库设计ER图表结构第五章 系统实现分模块贴核心代码和运行截图第六章 系统测试测试计划、测试用例表、测试结果这里有两个核心技巧。第一“相关技术介绍”这一章不要大段抄百度百科要用“我理解的语言”说明每个技术的作用——答辩老师看论文时最反感的就是明显粘贴复制的段落。第二“系统实现”不要整段贴长代码要选择每个模块里最核心的几行做讲解比如事务方法加Transactional是为什么、动态SQL的if判断解决什么问题。6.2 图表怎么画才能拿高分论文里的图包括用例图、实体关系图ER图、系统架构图、业务流程图。我用的是PlantUML或ProcessOn画完导出无缝贴进Word。用例图是系统分析的核心要表达清楚三种角色的操作权限。用户有注册、登录、浏览商品、搜索、管理购物车、下单、查看订单管理员有登录、分类管理、商品管理、订单管理、用户管理等。ER图建议用PowerDesigner画但这工具学习成本高。用ProcessOn画也行关键是实体和联系要标清楚商品—属于—分类多对一、用户—拥有—购物车记录一对多、用户—生成—订单一对多、订单—包含—订单明细一对多、订单明细—关联—商品多对一。流程图画一个主业务就够了最核心就是“用户下单流程图”登录→浏览商品→加入购物车→结算→生成订单→管理员发货→确认收货→结束。6.3 答辩高频问题与标准答法答辩时间一般5-15分钟老师会盯你最薄弱的环节提问。以下问题几乎必问为什么选择SSM框架它相比SSHStruts2HibernateSpring有什么优势标准答案SSH配置繁琐、Struts2漏洞较多、Hibernate对于复杂查询性能难调优SSM轻量灵活、MyBatis手写SQL可控性强、注解配置减少XML量。MyBatis和Hibernate的区别标准答案Hibernate是全自动ORM封装了SQL生成但复杂查询不灵活MyBatis是半自动ORMSQL由开发者编写灵活度高、易于优化。这是“用MyBatis的关键理由”。项目中的事务是怎么控制的标准答案使用Spring的声明式事务在Service层方法上加Transactional通过AOP切面统一处理遇到运行时异常自动回滚。订单状态你是怎么设计的标准答案用int常量表示五个状态用一个状态机辅助理解待付款→待发货→待收货→已完成其中待付款可取消。这个系统有没有考虑高并发标准答案本系统是课程设计级别的项目通过数据库事务和where条件stock quantity避免了基础超卖问题如果要更高并发可以引入Redis预减库存、消息队列削峰但当前设计能满足场景需要。这个答案既诚实又展示了你思考的深度。6.4 项目演示的节奏感演示环节很多人栽跟头。我建议按这个节奏来先系统登录页展示顺手提一句密码是MD5加密的— 用户注册新账号 — 浏览商品首页提分页和分类→ 搜索一个商品 — 加入购物车 — 提交订单 — 切到管理员账号 — 商品管理改个价格改个库存展示CRUD— 订单管理发货操作— 切回用户确认收货 — 登出。全程控制在8分钟左右。演示时有一件事特别重要提前把所有账号、数据库数据准备好演示用的商品图片要能正常显示不要临时输入数据。很多同学现场演示时输入了一个数据库里没有的商品名搜索为空场面就会非常尴尬。如果你用了服务器上的图片演示当天网络不好图片加载不出来也会大大影响效果。稳妥做法是商品图片全部用本地文件。7. 项目扩展思路做完之后还能往哪些方向走如果你时间还有富余或者答辩老师明确要求“系统要有亮点”下面这几个扩展方向可以挑一两个来加性价比都挺高。第一个方向加数据可视化。在管理员后台加一个首页统计面板用ECharts展示近7天订单量折线图、商品分类销量饼图、库存预警列表。数据源就是order表和order_item表的聚合查询。视觉冲击力强代码量不大论文里还能写“为管理员提供决策支持”非常治愈。第二个方向加Excel导出。把订单列表导出成Excel报表用Apache POI或EasyExcel实现。几十行代码就能跑通但是演示的时候直接导出文件这个动作比静态页面展示要更有说服力。第三个方向是缓存优化。把商品分类和热门商品列表用Redis缓存减少数据库压力。需要写一个简单的缓存工具类注意缓存一致性问题的处理。这块如果写清楚论文里可以单独开一小节“基于Redis的系统性能优化”对提升技术分很有帮助。第四个方向是支付模拟。不用接真实的微信/支付宝支付只需要在订单详情弹出“支付页”提供一个“模拟支付成功”的按钮把订单状态从待付款改成待发货然后按照正常的流程走就行。这既避免了申请商户号的麻烦又能把订单流程串完整。但还是要强调以上所有扩展都排在核心功能、代码质量、论文质量之后。先把基础和文档搞扎实再谈加分项。最后分享一个我自己的感受。每年帮人看毕设代码都能遇到一批人到三月份才慌慌张张开始最后通宵改bug、四处求人定制。其实这类SSM项目正常节奏应该是第一周搞定数据库和配置第二周完成用户端主流程第三周完成管理端第四周开始写论文第五周整理演示和查缺补漏。时间看着挺充裕前提是你真的每天推进一点而不是拖到最后。另外说一句找别人拿源码或教程做参考没有问题但一定要自己动手跑一遍、改一个功能点、理解每段代码在干什么。答辩的时候老师最常做的就是随机挑一段代码让你解释这年头导师们见的项目比学生写的还多想靠背稿蒙混过关真的不太现实。把这个项目做明白你收获的不仅是一个毕业设计更是Spring体系下的第一份实战经验这个积累会一直跟着你走到实习和第一份工作。