ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于SpringBoot的服饰电商商城系统设计与实现:从需求到部署完整指南

基于SpringBoot的服饰电商商城系统设计与实现:从需求到部署完整指南 一年到头最折磨人的就是毕设选题尤其像“基于SpringBoot的服饰电商展示与交易平台”这种看起来烂大街、实际要做出差异化很难的题目。我的建议是别再把它当增删改查系统来做了你完全可以把这套SpringBoot服装商城做成一个拿得出手的项目关键不在功能多而在于技术路线清晰、模块边界分明、每一处设计都说得出为什么。这篇内容不光是写给你抄的也把我踩了不少坑之后形成的完整思路整理出来。从需求拆解、技术选型、数据库设计到前端如何和SpringBoot配合再到实际开发中高频出现的报错和排查方法都按毕设答辩的标准给你捋清楚。只要按这个思路走一遍进度条基本就能走到80%以上。1. 项目整体思路与需求拆解1.1 先把角色和场景定住功能边界就出来了做商城系统前最忌讳的就是一上来建表、写接口。你得先明确这套系统是给谁用的在什么场景下使用服装网站天然带有“展示”和“交易”两个属性比普通电商系统多了一层时尚感的要求。我建议把用户划分为三种角色对应不同的操作入口游客访客浏览首页、看商品列表、看商品详情但不能下单。这类用户对应的是“拉新”场景不能一上来就逼着注册。注册会员能加购物车、能下单、能看个人订单记录、能改收货信息和密码。对应“转化”场景。后台管理员负责商品上下架、分类维护、订单状态流转、库存调整、轮播图管理。对应“运营”场景。这样一拆前后台功能就自然分开了。前台商城负责展示、搜索、交易入口后台管理负责数据维护、订单跟踪和基础配置。很多毕设答辩被问“你的系统有哪些角色、各自做什么”其实在需求分析阶段就把这个理清楚后面根本不用慌。1.2 功能模块拆解前台展示和后台管理分开做无论你的前台是用Vue单独部署还是用Thymeleaf服务端渲染功能清单都要列清楚。我按自己比较认可的方式给你一套标准功能清单可以直接作为开题报告的功能模块章节前台用户端首页轮播图推荐位、新品专区、热销单品展示、分类快捷入口商品检索按分类浏览、按关键词模糊搜索、按价格区间筛选、按上架时间/销量/价格排序商品详情多图展示、尺码与颜色选择、价格库存展示、商品参数详情购物车加入、修改数量、删除、批量结算、价格重新计算订单生成订单、在线支付模拟、取消订单、确认收货个人中心注册、登录、退出、个人信息修改、密码修改、收货地址管理订单管理订单列表、订单状态筛选、订单详情查看后台管理员端管理员登录认证商品管理商品列表、商品发布、商品编辑、上下架、删除、库存调整分类管理商品分类的增删改查支持二级分类订单管理订单列表、订单详情、订单发货、订单备注、退款处理轮播图管理首页轮播图片的更换和排序用户管理会员列表、禁用/启用账号、重置密码数据概览商品总数、今日订单数、总销售额、近期趋势这样一套下来技术覆盖点就非常全面权限认证、文件上传、分页搜索、复杂状态流转、统计聚合都有。答辩时老师不管问你前台还是后台你都能有东西讲。1.3 常见理解误区商城不是“商品表订单表”那么简单的很多同学把商城系统的设计逻辑简化成了两张表一张商品表、一张订单表订单里存商品名和价格就完事。这在实际开发中是有问题的答辩时也容易被追问。订单和商品之间必须通过“订单明细表”关联而不是把商品信息直接冗余在订单表里。原因很简单商品的价格和名称会变如果直接复制到订单表里后续商品涨价了历史订单还是应该保持成交时的价格。所以订单表存的是订单级别的信息总金额、状态、收货地址、用户ID、下单时间订单明细表存的才是某一款商品的快照信息商品ID、商品名称、单价、数量、小计。这个细节是最能体现你有没有真正理解表结构设计的点。另外库存和商品的关系、轮播图与商品的关联、分类与商品的从属关系都需要在设计阶段想清楚。宁可在前期多花一小时画表结构也不要写了一半再重构。2. 技术选型为什么是SpringBoot以及生态搭配怎么选2.1 之所以选SpringBoot不只是因为它“简单”SpringBoot在Java后端开发中已经是事实标准了毕设选它有几个肉眼可见的优势内嵌Tomcat不用额外装容器打包成jar一键运行部署省事starter机制把常用功能的依赖和配置都自动封装好了加依赖就能用自动装配让数据源、事务、参数校验这些配置不再需要XML堆积生态庞大只要Java方向几乎所有中间件都有对应的Starters但在答辩时不要只说“SpringBoot开发效率高”这种套话我给你一个更深层的说法SpringBoot的核心价值在于自动配置和约定优于配置它把Spring生态里复杂的Bean装配过程封装成自动配置条件判断让我们专注于业务代码而不是框架整合。结合你的项目比如spring-boot-starter-data-redis、spring-boot-starter-validation这些starter就能说明开发中大部分功能只需要引入starter并写业务代码框架层面的复杂逻辑由自动配置完成。2.2 我的推荐组合SpringBoot 2.x MyBatis-Plus MySQL Vue3技术选型我建议遵循“稳定优先、资料丰富、自己能驾驭”的原则。后端主框架SpringBoot 2.7.x。为什么要2.x而不是3.x3.x要求JDK17很多同学本机还在用JDK8而且3.x后的javax包名变成了jakarta网上大量老教程不适用踩坑成本高。毕设求稳用2.7版本最合适。持久层MyBatis-Plus。单表CRUD基本不用写SQL内置分页插件代码量直接砍掉一大截。默认驼峰映射、逻辑删除这些功能都很实用。关键是我觉得答辩时聊MyBatis-Plus的“条件构造器QueryWrapper实现动态SQL”比聊“写了一大堆XML”更有亮点。数据库MySQL 5.7或8.0。这俩都可以注意SQL语法兼容即可。需要特别注意如果本机装的是MySQL 8驱动的URL需要指定serverTimezone参数否则会报时区错误。前端如果是做前后端分离选Vue3 Element Plus不会错。要是你前端基础比较弱或者时间紧张也可以直接用Thymeleaf模板引擎在SpringBoot里写页面这样项目整体是单体应用部署更简单。但从学习价值角度我更推荐前后端分离方案哪怕做得简单些也比全用模板引擎强——因为能体现出你懂接口设计和跨域处理这两点答辩时非常加分。其他组件方面如果你要做登录Token鉴权可以用SpringBoot JWT Hutool工具包Hutool负责生成和解析JWT特别方便几行代码搞定。如果验证码需要用Hutool的CaptchaUtil接口就行。文件上传如果人脸识别、OSS这些太复杂那就先把图片存本地磁盘目录后续可以再换对象存储对毕设来讲完全够用。2.3 项目结构怎么组织答辩时才不慌很多人喜欢把所有代码堆在controller、service、mapper三个包里写的时候确实快但答辩时展示项目结构就非常难看了。我推荐使用一个清晰的分层结构同时体现Controller-Service-Mapper三层架构com.example.fashionshop ├── controller // 接收请求、返回结果 ├── service // 业务逻辑层接口实现类 │ └── impl ├── mapper // MyBatis-Plus数据访问层 ├── entity // 数据库实体类 ├── dto // 前端请求参数封装登录参数、下单参数等 ├── vo // 前端响应数据封装商品详情VO、订单VO等 ├── config // 配置类跨域、拦截器、文件上传配置 ├── common // 公共类统一返回结果、异常处理、常量定义 ├── utils // 工具类JWT、文件存储等 └── FashionshopApplication.java这样分层的好处是职责明确controller只做参数接收和结果返回service做业务判断和事务控制mapper只操作数据库。答辩时可以讲三层架构的职责划分显得有设计感。尤其是Result统一返回结果类一定要做别用Map散装返回。3. 数据库设计商品、订单、用户这三块是核心3.1 核心表结构和关键字段数据库是这类项目的命脉。表结构设计得好后面写业务代码就顺畅。我给出核心的几张表设计你可以直接参考用户表userid 主键自增username 用户名唯一索引password 密码加密存储nickname 昵称avatar 头像URLphone 手机号email 邮箱gender 性别status 状态0正常1禁用create_time 创建时间商品分类表categoryid 主键name 分类名称比如“上装”、“下装”、“连衣裙”parent_id 父分类ID0表示顶级分类支持二级分类sort 排序号icon 分类图标商品表productid 主键category_id 分类ID对应分类表name 商品名称subtitle 副标题/卖点描述main_image 主图URLdetail 商品详细描述富文本或长文本price 当前售价Decimaloriginal_price 划线原价stock 库存数量sales 销量status 上架状态0下架1上架create_time 创建时间update_time 更新时间这里要注意商品的颜色和尺码是比较特殊的字段。如果只是简单做可以直接用逗号分隔存到一个字段里比如color黑色,白色,灰色sizeS,M,L,XL。如果要做得更规范就拆分出一个商品SKU表product_sku记录具体某个颜色某个尺码对应的库存和价格。毕设做简单方案够用但如果想加分SKU表才是难点和亮点。订单表ordersid 订单号order_no 订单编号用时间戳随机数生成对外展示用user_id 下单用户IDtotal_amount 订单总金额status 订单状态我建议定义为0待付款、1待发货、2待收货、3已完成、4已取消receiver_name 收货人姓名receiver_phone 收货人电话receiver_address 收货地址create_time 下单时间pay_time 付款时间deliver_time 发货时间receive_time 收货时间订单明细表order_itemid 主键order_id 订单IDproduct_id 商品IDproduct_name 商品名称快照product_image 商品图片快照price 成交单价快照quantity 购买数量total_price 小计金额购物车表cartid 主键user_id 用户IDproduct_id 商品IDquantity 数量selected 是否选中有些系统做结算勾选功能轮播图表bannerid 主键image 图片URLproduct_id 关联商品ID点击跳转详情sort 排序status 是否显示3.2 字段类型和设计的关键细节价格字段必须用Decimal类型不要用Float或Double。Java端对应的也得用BigDecimal。为什么Float和Double是浮点数有精度损失商品价格和订单金额这种涉及钱的字段一旦精度出错就完蛋。MySQL里用DECIMAL(10,2)表示总长度10位、小数2位够用了。状态字段用户状态、商品状态、订单状态都要加这属于业务中间状态控制不用枚举来写死。尤其订单状态是这类系统的核心状态机换季、退款这些业务都建立在订单状态基础上。时间字段用datetime类型统一存服务器时间。Java实体用Date或LocalDateTime都可以MyBatis-Plus对LocalDateTime默认支持推荐用后者。插入时不要手动逐个set时间直接用MyBatis-Plus的自动填充功能TableField(fill FieldFill.INSERT)就能在insert时自动写入createTime更新时用FieldFill.INSERT_UPDATE。逻辑删除给订单、商品表可以留一个deleted字段使用MyBatis-Plus的逻辑删除功能避免物理删除导致的数据丢失答辩时可以说明这一点体现数据安全意识。3.3 外键的取舍很多教材喜欢把表关系画成有外键的ER图但实际企业开发中外键约束其实很少用。因为外键会影响写入性能而且业务层已经保证了数据的一致性。我刚入行时有段时间不加外键总觉得不踏实后来做了一段时间就明白了为了保证性能和灵活性MySQL本身的主力互联网架构也是尽量少用物理外键一致性交给代码事务和逻辑约束处理。毕设里推荐不用物理外键但表关系要靠逻辑字段关联ER图里该标的外键关系还是要标出来给老师看。4. 后端核心功能实现认证、商品、订单一个都不能落4.1 统一返回结果类和统一异常处理我建议任何接口都返回统一结构code、message、data三个字段。无论前端还是后端联调都能减少很多沟通成本。定义一个Result 泛型类里面放一个静态方法ok()、error()就可以了。另一个必须做的是全局异常处理。SpringBoot里用RestControllerAdvice ExceptionHandler就可以捕获所有异常业务异常直接抛自定义的ServiceException未知异常返回友好提示而不是打印一堆堆栈。这个设计点不复杂但答辩时一提“全局异常处理”老师就知道你有生产环境思维。4.2 登录认证JWT还是Session毕设最常见的做法是Session Cookie因为顺手登录成功往session里塞个userId就行。但Session在前后端分离场景下不太方便跨域时Cookie处理麻烦分布式场景Session共享更麻烦。我建议直接用JWT方案。核心思路是用户登录成功后后端用JWT工具生成一个Token返回给前端前端把Token存到localStorage每次请求在header里带Authorization: Bearer xxx后端写一个拦截器或Spring MVC拦截器拦截除登录、注册、商品浏览外的接口校验Token解析出userId放入ThreadLocal或request attributeJWT的生成用Hutool的JWTUtil特别简单几行代码就实现签名和验签。注意秘钥要定一个足够长的字符串过期时间建议设成24小时前端到期再跳登录页。这个方案和传统的Session方案比面试和答辩时能展示你对无状态认证的理解而且符合前后端分离的项目架构。4.3 商品模块动态查询和搜索排序商品列表是典型需要写动态SQL的场景用户可能传分类ID、可能传关键词、可能传价格区间、还可能要求按不同字段排序。用MyBatis-Plus的LambdaQueryWrapper就能解决LambdaQueryWrapperProduct wrapper new LambdaQueryWrapper(); if (StringUtils.hasText(keyword)) { wrapper.like(Product::getName, keyword); } if (categoryId ! null) { wrapper.eq(Product::getCategoryId, categoryId); } if (minPrice ! null) { wrapper.ge(Product::getPrice, minPrice); } if (maxPrice ! null) { wrapper.le(Product::getPrice, maxPrice); } wrapper.eq(Product::getStatus, 1); wrapper.orderByDesc(Product::getSales);这个写法就是不写SQL全部用方法链完成让条件判空控制动态拼接非常直观。加上MyBatis-Plus的分页插件前端传入pageNum和pageSize后端返回总记录数和列表即可。搜索这里还可以再加一个细节关键词搜索时如果同时匹配了商品名和副标题可以用EntityWrapper的and嵌套实现优先匹配。不过对毕设来说一个like查询已经够用不用过度设计。4.4 购物车怎么保证数据不错乱购物车本质是用户和商品的对应关系加上数量和选中状态。加购的时候先判断是否存在存在就增加数量不存在就插入新记录。这个逻辑不复杂但有几种情况要处理否则数据会错乱同一用户同一商品不能出现两条记录所以表上可以建一个(user_id, product_id)的唯一索引代码上先查询再判断是否更新购物车商品数量不能超过库存要在加购时就把库存上限作为校验用户修改数量时要重新计算金额这个不用存数据库响应前端时通过商品价格计算展示即可购物车数据前端展示时要返回商品的最新价格不能直接拿购物车里存的快照字段。所以查询接口要联表查询购物车时把商品的最新信息组装出来。这类VO的设计就是项目亮点。4.5 订单模块状态流转是关键订单功能是整个系统的核心和难点尤其是订单状态管理。我强烈建议你理清状态机然后写清楚每次状态变更的条件和动作。定义如下状态流转创建订单 待付款待付款 支付成功 待发货待发货 管理员发货 待收货待收货 用户确认收货 已完成待付款 超时/主动取消 已取消待发货 管理员取消 已取消实现时要注意下单这个操作要放在一个事务里先创建订单主记录再批量创建订单明细再扣减库存。这三步任何一步失败都要回滚。扣库存建议用乐观锁或者加条件更新保证并发时不会超卖boolean success productService.update( new LambdaUpdateWrapperProduct() .eq(Product::getId, productId) .ge(Product::getStock, quantity) .setSql(stock stock - quantity) );通过where条件里的ge(stock, quantity)实现剩余库存必须大于购买数量的约束这样并发场景下不会把库存扣成负数。这是非常经典的高并发防超卖写法比先查再更新要安全得多。订单号生成方式可以用年月日时分秒 用户ID后四位 随机数然后用字符串拼接。注意别用数据库自增ID当订单号那是主键不是业务编号。启动时随机种子这些细节不用纠结Hutool的IdUtil.getSnowflakeNextIdStr()直接生成雪花ID也行。4.6 支付怎么实现一个“看起来真实”的支付毕设没必要对接支付宝或微信支付真实接口既需要商户资质流程又复杂。常见做法是“模拟支付”页面里放一个“确认支付”按钮点击后把订单状态从未付款改成待发货同时记录支付时间。但要注意在支付接口里加一个校验订单必须是当前登录用户的且订单状态必须等于待付款否则拒绝操作。还要在代码注释里说明真实支付流程在这里需要调用第三方支付平台的API比如支付宝的电脑网站支付用统一收单下单接口支付成功后通过异步通知修改订单状态。这样解释给老师听他知道你理解完整链路只是没接真实通道。4.7 文件上传图片存哪里、怎么访问商品图片上传是敏感点。普通的做法是后台管理端上传图片SpringBoot接收MultipartFile写入服务器本地磁盘然后把相对路径存数据库再通过一个映射URL对外提供访问。核心配置spring.servlet.multipart.max-file-size10MB spring.servlet.multipart.max-request-size20MB文件存储地址建议配成绝对路径比如D:/fashion-shop/upload/不要用相对路径。然后写一个WebMvcConfigurer把磁盘路径和URL路径做映射Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceResolver(new PathResourceResolver()) .addResourceLocations(file:D:/fashion-shop/upload/); }存数据库的字段就存“/upload/2025/06/01/xxx.jpg”前端直接拼域名访问。这里容易踩的坑就是本地路径分隔符跨平台问题别在代码里硬编码“/”尽量用File.separator或者相对路径拼接。答辩时可以提一句正式部署时文件会存到OSS对象存储本地磁盘方案是为了开发环境方便。5. 前端联调与部署Vue打包塞进SpringBoot还是分离部署5.1 两种方案的取舍前端如果用Vue开发会面临部署方式的决策。一种是将Vue打包后的dist目录塞进SpringBoot的static静态资源目录打成同一个jar另一种是前后端完全分离各部署各的。塞在一起的好处是一个进程、一个端口、不用配Nginx、答辩时不用解释一堆部署细节。缺点是前端每次修改后都要重新打包再拷贝到Java工程里开发效率低而且在springboot里配history路由还得改写请求转发规则用一个controller处理404转发到index.html。我的建议是答辩阶段用分离部署本地起Nginx托管前端后端起SpringBoot接口地址通过Nginx反向代理到8080。这样展示清晰老师如果要看部署图也好看。但如果时间紧张前端也很简单那就全塞一个jar省事。5.2 联调过程中的跨域问题前后端分离开发中跨域是最常见的坑。前端在5173端口跑Vite开发服务器后端在8080两个端口不同就必然跨域。解决方式主要有两种后端加CORS配置写一个WebMvcConfigurer注册CorsRegistry允许指定来源、指定header和方法。因为JWT要放到请求头里注意设置allowedHeaders(*)。直接用Nginx反向代理前端请求/api下的地址Nginx转发到后端的实际端口这样从前端视角是同源请求就不存在跨域。我建议两个方案都了解开发环境用后端CORS部署环境用Nginx这样怎么都能通。5.3 启动端口和配置修改开发过程中很多同学被端口占用坑过。SpringBoot默认8080如果被占了改配置server.port8080 server.servlet.context-path/api在配置里加了context-path后所有接口路径都会自动带一个/api前缀。要注意的是JWT拦截器里的排除路径也要跟着改不然放行规则就失效了。数据库连接配置统一放application.yml里密码、用户名、URL都配好注意MySQL的时区参数spring: datasource: url: jdbc:mysql://localhost:3306/fashion_shop?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456字符编码这里一定要用utf8mb4不要用utf8因为utf8在MySQL里是utf8mb3有些冷门字符比如emoji存不进。数据库连接串里的characterEncodingutf8实际指向的是utf8mb4仍然建议你建库时直接指定utf8mb4。6. 高频问题与排查技巧实录6.1 SpringBoot版本和依赖冲突搜教程的时候我发现一个很普遍的现象有人下了个SpringBoot 2.7项目改了JDK、依赖之后启动报错找不到SpringApplication。原因多半是JDK版本不对或者Maven没有正确导入。2.x最低要求JDK83.x必须JDK17先检查本机java -version再检查pom.xml里spring-boot-starter-parent版本。如果Maven依赖一直标红先mvn clean 重新导入。还有MyBatis-Plus版本和SpringBoot版本之间也有兼容性问题。比如SpringBoot 2.7 MyBatis-Plus 3.5.x版本是没问题的但如果你去用MyBatis-Plus 4.x的早期版本可能因为分页插件写法调整而踩坑。建议直接锁定MyBatis-Plus 3.5.3.1版本稳定。6.2 启动时报数据库连接失败先检查MySQL服务是否启动。Windows上可以在服务管理里看MySQL是否在运行。然后检查URL、用户名、密码有没有写错最隐蔽的问题是URL中没有加serverTimezoneAsia/Shanghai导致连接时报“The server time zone value”的错误。这个问题基本只要加上参数就解决。再往深的可能有MySQL 8的驱动类名变了要用com.mysql.cj.jdbc.Driver。这些细节都要核对不要指望一次性就能起成功。6.3 前端跨域报错怎么办看到“Access-Control-Allow-Origin”相关的报错说明跨域配置没生效。先确认后端CorsRegistry有没有配置前端的请求地址是不是写成了绝对地址而不是相对地址前端代理有没有配置正确。调试时打开Chrome开发者工具看Network重点看那个请求的状态码和响应头响应头里有没有Access-Control-Allow-Origin字段一目了然。6.4 文件上传后访问404文件上传后图片打不开大概率是资源映射没配置对。先确认上传路径存到数据库的是什么再确认addResourceHandler的路径模式然后手动在浏览器里访问一下地址。注意路径映射的Location必须是file:开头的绝对路径。有一种很常犯的错误是开发时File写到D盘部署到Linux后路径不存在记得改成Linux路径或者干脆用相对路径动态获取。6.5 页面中文乱码乱码几乎都是字符集没统一。Java文件编码、前端页面编码、数据库连接URL的编码三个地方全部要统一为UTF-8。IDEA里可以在右下角把文件编码改成UTF-8。另外如果使用了Thymeleaf页面开头要加 。6.6 JWT拦截器把登录和注册也拦截了如果登录都调不通检查拦截器的addPathPatterns和excludePathPatterns的配置。排除的路径要写对比如排除/login、/register而其他所有请求都需要Token。还有一点微信公众号开发之类没有任何关系别总想着把外部平台登录耦合进来登录模块自己走得通就够了。6.7 MyBatis-Plus 分页不生效分页插件不生效通常是分页拦截器没有注册成Bean。MyBatis-Plus从3.5.x之后用MybatisPlusInterceptor替代了之前的PaginationInterceptor。在配置类里注册一下就好了。Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; }另外查列表时返回的IPage要作为方法的返回值不能把它当参数传进去然后返回List那样分页数据总数为0。7. 时间规划和后续扩展方向7.1 怎么分配各阶段时间每次带毕设都有人问我时间够不够。我的建议是如果还没有开始写按下面的节奏走保持每天两小时基本一个月能做完。第1周需求分析、表结构设计、项目搭建、通用类编写第2周用户模块注册登录JWT、商品模块分类列表详情第3周购物车订单模块含事务库存第4周后台管理端商品、订单、轮播图管理 前端页面整合最后留2-3天做整体测试、写文档、准备答辩不要一上来就写代码更不要直接改别人的完整项目。可以看参考项目的设计思路但一定要自己敲一遍因为答辩时要能随手改代码、解释运行逻辑否则一眼就会被识破。7.2 如果你的项目想加分可以扩展这几块基础功能做完后如果想在答辩时拉开差距可以挑一个方向做增强Redis做热点商品缓存把首页轮播图、热销商品列表缓存到Redis减少数据库压力Elasticsearch做商品全文检索比MySQL的like查询体验好很多能体现大数据量下的搜索设计思路RabbitMQ做订单超时取消用户下单15分钟不支付自动取消利用延迟队列实现微信小程序/H5前端做成多端展示体现适配能力注意这些都是可选的一个项目里挑一个做透就够了贪多嚼不烂。7.3 根据我个人经验给你几个最实在的建议第一把项目跑起来之后再写文档。很多同学喜欢先写一堆开发文档再写代码结果代码和文档对不上。我建议是把核心代码写完联调通过后再回头写开题报告和论文中的系统设计部分效率和准确度都会高很多。第二数据库连接串、版本问题这类环境坑遇到一次就记录下来。毕设过程中百分之六十的时间会花在排错上把这些问题汇总成一份自己的排错文档答辩前翻一遍你会心态稳很多。第三不要执着于自己造轮子。JWT就用Hutool的分页就用MyBatis-Plus的验证码就用Hutool的先把项目做出来再去谈优化和底层原理。你把这套系统和它的关键机制讲清楚远比你在一个点上钻牛角尖有价值。最后再分享一个小技巧答辩演示前一定确保把项目里的测试数据做得“像样”。不要只有一张图一件衣服要多放几件不同风格的衣服、不同品牌的数据、几十条订单数据、不同状态的订单各几条。老师看演示的时候真实的数据会让系统显得完整可信。这个细节比你在答辩时背一大段技术名词有用得多。
返回列表