尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Spring Boot手机商城毕业设计:从数据库设计到部署的完整实战指南

Spring Boot手机商城毕业设计:从数据库设计到部署的完整实战指南 简介在Java Web开发中Spring Boot凭借约定优于配置、自动装配等特性已成为企业级应用和高校毕业设计的首选框架。围绕电商系统这一典型业务场景手机商城项目覆盖了商品管理、购物车、订单流转、用户权限等核心链路非常适合作为工程实践能力的综合训练。技术选型上Spring Boot与MyBatis-Plus结合可大幅提升CRUD开发效率而订单状态机、事务控制、索引优化等设计则是保障数据一致性与系统性能的关键。从需求分析、表结构设计到后端分层实现再到论文撰写与答辩准备本内容系统梳理了完整开发路径并针对环境配置、并发扣库存、部署上线等高频问题给出可落地的解决方案。无论是毕业设计选型还是商城系统开发入门本文都能为读者提供从理论到实践的参考。1. 毕业设计选型为什么是Spring Boot手机商城1.1 从标题反推项目的完整画像先聊点实际的。拿到基于springboot开发的欢迪迈手机商城设计与开发这个标题基本就能看出这是一套典型的Java Web方向毕业设计。每年这个类型的项目层出不穷市面上的成品、半成品、开源版本一大堆但真正能让你通过答辩、能写出像样论文、能抗住老师提问的其实不多。这套题目的核心价值在于它覆盖了Java后端开发最主流的技术栈又落在一个足够具象的业务场景——手机商城上老师一看就知道你做的是一个完整的、可运行的、有业务逻辑的系统而不是那种堆了一堆代码却说不清楚用来干什么的玩具项目。简单拆一下标题的三层信息。第一层技术栈锁定在Java Spring Boot这是目前国内大多数高校软件工程、计算机科学与技术专业毕业设计的主流选择也是招聘市场上需求量最大的方向之一。第二层业务场景是手机商城意味着你要实现商品展示、购物车、订单、支付模拟、用户管理等电商核心链路。第三层交付物包含毕业论文和源代码说明这不是一个只跑通功能的demo而是需要形成完整工程化项目并且能写成一篇有逻辑、有深度、有数据支撑的学位论文。对准备做这个题目的同学我给你一个明确预期这套项目的合理工作量是——后端至少8到12个实体表、15到20个接口、3个角色管理员、普通用户、游客、一套前端页面可以用模板引擎也可以分离开发再加一篇2万到3万字的论文。如果你看到某个版本的源代码只有三五个表、两三个页面那要么是阉割版要么是纯应付查重的东西拿去答辩风险很大。1.2 功能模块拆解一个手机商城该有什么很多同学拿到题目第一反应是我要做增删改查这个思路没错但只对了一半。毕业设计的功能设计要同时考虑三件事业务是否完整、技术是否有亮点、论文是否有东西可写。一个合格的手机商城功能模块至少要覆盖五个维度用户端核心流程用户的注册、登录、个人信息维护、收货地址管理。登录方式建议做手机号密码如果你想在论文里写亮点也可以叠加一个短信验证码登录用阿里云短信或者模拟实现后者更稳妥因为真实短信服务需要企业资质。商品浏览与检索商品的分页展示、按分类筛选、关键词搜索、商品详情页。图片上传和管理是必做的这里建议用本地存储访问映射的方式不要一上来就接OSS对象存储自己部署的时候容易出问题但论文里可以提一句生产环境可替换为云存储显得你有架构意识。购物车与下单流程加购、改数量、删除、结算、生成订单、模拟支付、查看订单状态。订单状态机是整篇论文的核心业务亮点至少要定义待付款、待发货、待收货、已完成、已取消这五种状态并且最好画出状态流转图。后台管理端管理员对商品、分类、用户、订单的管理。这里注意管理端的权限一定要做最简单的方案是Spring Boot拦截器或过滤器配合Session或Token做角色校验。别看这个点不起眼答辩时老师特别爱问你怎么控制普通用户不能访问管理页面数据统计分析这一步是拉开档次的关键。不必做复杂的大屏至少给出后台首页的统计面板今日订单数、销售额、用户总数、热销商品Top5。实现逻辑也简单SQL聚合查询或写一个统计Service就行但论文里能多出一小节系统数据统计分析模块的设计与实现评审老师很吃这一套。1.3 选型逻辑Spring Boot 商城场景的搭配优势说到选型这是论文第一章综述部分必须交代的内容也是答辩老师必问的问题。你选Spring Boot不能只说因为主流、因为生态好要说出实打实的理由。第一Spring Boot解决了Spring MVC时代最烦人的配置地狱。以前做一个SSM项目至少写四五个XML配置文件pom里手动管理几十个依赖版本新手光配置环境就能耗掉一周。Spring Boot用自动配置加Starter机制把常用组件的配置收敛到application.yml一个文件里这对毕设项目来说是极大的效率提升。你论文里的原话可以这样写Spring Boot通过约定优于配置的设计原则显著降低了项目搭建与维护成本使开发者能够将更多精力聚焦于业务逻辑实现。第二Spring Boot和前端模板引擎Thymeleaf或前后端分离开发模式都能无缝衔接。如果你做前后端分离Spring Boot天然的RESTful API支持加JSON序列化后端只需要返回统一结果集如果做服务端渲染Spring Boot对Thymeleaf的集成也是一条配置的事。这种灵活性保证了你在答辩演示时不管用什么方式展示后端代码都不用大改。第三社区生态和问题排查成本低。这点很现实——毕设开发周期就三四个月用Spring Boot遇到问题时CSDN、Stack Overflow、GitHub上几乎能找到你遇到的90%的报错解决方案。而如果你选了冷门框架卡住一个技术点一周都绕不出去那叫自找麻烦。2. 数据库设计与核心业务逻辑2.1 数据表结构设计从需求到建表的完整推演商城项目的数据表设计直接决定了后续开发是否顺畅。很多同学拿到代码第一步就急着跑起来然后发现加一个功能就要改表、改实体类、改Mapper来回折腾到吐血。本质原因就是前期没有把表结构想清楚。我给一套经过验证的最小完整表结构一共九张表足够支撑你完成论文里的系统详细设计章节用户模块user用户ID、用户名、密码、手机号、头像、创建时间、状态address地址ID、用户ID、收货人、联系电话、省市区、详细地址、是否默认。密码这里我强调一点务必要加密存储用Spring Security自带的BCryptPasswordEncoder或者MD5加盐都可以。毕设代码里如果出现明文密码答辩时基本是送命题。商品模块category分类ID、分类名称、父分类ID、排序、图标product商品ID、分类ID、名称、副标题、主图、轮播图、详情富文本、价格、库存、销量、状态、上下架时间。商品图片字段建议用JSON格式存多图不要单独建一张图片表理由后面说。交易模块cart购物车ID、用户ID、商品ID、数量、勾选状态orders订单ID、订单号、用户ID、收货地址快照、商品总金额、运费、实付金额、支付方式、状态、创建时间、支付时间、发货时间、完成时间order_item子订单ID、订单ID、商品ID、商品名称快照、商品图片快照、单价、数量、小计。营销与操作日志banner首页轮播图ID、图片地址、跳转链接、排序、状态operation_log日志ID、用户ID、操作模块、操作类型、请求参数、IP、操作时间。日志表是很多同学会忽略的但如果你在论文里写系统设计了日志记录功能便于追踪用户操作行为与故障排查这就是一个有据可查的功能点。表结构要特别注意两类设计细节。第一订单表一定要做地址快照和商品快照。因为用户下单后如果改了地址、管理员改了商品价格历史订单的数据不能被影响。快照实现的方案有两种一种是把收货人和商品信息冗余字段存进订单表另一种是把关联ID存下来查询时再取。我推荐前者逻辑简单而且论文里可以阐述采用数据冗余策略保证订单历史数据的稳定性。第二order_item表的数量字段建议用INT而不是VARCHAR价格字段用DECIMAL(10,2)这是Java后端开发最基本的数据类型规范写错的话MyBatis映射会出现精度问题。2.2 订单状态机商城业务的核心引擎订单状态是整个系统的灵魂。我见过不少毕设源码订单状态存一个INT字段0到4分别代表不同含义但代码里到处散落着if(status 1)这种魔法值这种代码一眼就会给老师留下不好的印象。更好的做法是定义一个OrderStatusEnum枚举类把状态编码、状态描述、状态操作映射关系统一管理。核心状态流转如下用户提交订单 -PENDING_PAYMENT待付款同时扣减库存用户模拟支付成功 -PENDING_SHIPMENT待发货记录支付时间管理员后台发货 -PENDING_RECEIPT待收货记录发货时间填入物流单号用户确认收货 -COMPLETED已完成记录完成时间用户在待付款状态下取消订单 -CANCELLED已取消回补库存这里有两个容易出错的地方。第一是库存扣减时机建议在提交订单时扣减而不是支付成功时扣减否则会出现用户下单后长时间不支付库存被其他用户买光的情况。第二是取消订单后的库存回补如果代码里只做了扣减没有回补跑几次测试数据库存就会变成负数这个Bug非常典型建议在论文的测试章节专门写一条用例测试用户取消订单后商品库存是否恢复。实现上可以用一个OrderService统一管理状态变更方法每个方法内部先校验当前状态是否允许该操作再执行状态更新和后续动作扣库存、发日志等最后返回统一结果对象。这种状态校验业务动作的模式是电商系统的经典写法。2.3 商品检索与分类两种方案怎么选商品检索功能最基础的实现是product_name LIKE %关键词%这也是大多数毕设的做法。但如果你想让论文的技术含量往上提一层可以在检索方案里引入Elasticsearch不过在部署上一个大问题很多同学的电脑跑不动ES或者服务器内存不够最后演示时环境挂掉得不偿失。我的建议是毕设答辩演示用MySQL的LIKE查询论文里用一节的篇幅设计基于Elasticsearch的商品检索方案写明技术选型考量、索引结构设计、检索流程但标注出于部署环境资源限制本系统采用MySQL模糊查询实现ES检索方案作为后续优化方向。这个策略既保证了论文的完整性又规避了演示风险是性价比很高的处理方式。分类这块如果是单级分类一张表就够如果做两级分类比如手机通讯 - 手机手机通讯 - 对讲机就需要在category表上增加parent_id字段。三级分类不建议做一来商城体量不需要二来递归查询和前端联动会复杂很多对毕设来说投入产出比太低。页面上的分类导航用二级分类加全部商品过滤条件就足够了。3. 后端工程化落地与核心代码实操3.1 项目结构从分包开始拉开层次差距拿到源码后先看包结构就能判断这套代码值不值得花时间研究。差的代码所有类都堆在controller或service包里好的代码一定是按职责分层清晰组织的。我推荐的标准分包如下com.hdmall ├── controller // 控制层接收请求、参数校验、返回结果 ├── service │ ├── impl ├── mapper // MyBatis的Mapper接口 ├── entity // 数据库实体类 ├── dto // 数据传输对象用于接口入参出参 ├── vo // 视图对象用于页面数据展示 ├── config // 配置类WebMvcConfig、拦截器注册等 ├── common │ ├── result // 统一返回结果封装 │ ├── exception // 全局异常处理 │ └── enums // 枚举类 ├── interceptor // 登录拦截器、管理员权限拦截器 ├── util // 工具类JWT工具、日期工具、文件上传工具 └── HdMallApplication.java这套结构不是摆设每一个包都有明确的职责边界。比如dto和vo的区别很多同学分不清我直接说人话dto是前端传给后端的参数对象比如注册时传RegisterDTO(username, password, phone)vo是后端返回给前端展示的对象比如用户信息UserVO(id, username, avatar)这个对象里你不能把密码字段暴露出去。论文的系统设计章节里画一张包结构图再逐层说明职责这一小节能写两千字而且全是有内容的干货。实体类的实现也要注意规范。主键用TableId(type IdType.AUTO)创建时间字段用LocalDateTime类型数据库映射用TableField(fill FieldFill.INSERT)配合MyBatis-Plus的自动填充功能就省得每次插入都要手动set时间。这里强烈建议集成MyBatis-Plus它在单表CRUD上的效率比手写XML高太多能让你的开发周期至少缩短两周。不过要注意论文里不能只写用MyBatis-Plus实现了增删改查要解释它的核心原理——通过LambdaQueryWrapper实现条件构造底层还是MyBatis的Mapper代理机制。3.2 登录鉴权拦截器与JWT的二选一用户登录是所有业务的前置条件也是答辩时非常容易踩坑的地方。目前主流做法有两种各有优劣方案一Session 拦截器。登录成功后将用户信息放入Session再写一个LoginInterceptor在preHandle里判断是否存在登录态。优点是实现简单、完全够用缺点是前后端分离场景下Session跨域不方便。方案二JWT 拦截器。登录成功后生成一个Token返回前端前端每次请求在Header里带上Authorization后端通过拦截器校验和解密。优点是天然支持前后端分离而且论文里可以写采用无状态认证机制提升了系统的可扩展性。我做毕设时选的是JWT方案实现起来也不复杂引入jjwt依赖写一个JwtUtil工具类负责生成和解析Token生成时把用户ID和角色放入claims设置过期时间比如24小时拦截器里解析Token后把用户信息放入ThreadLocal业务Controller直接用UserContext.getUser()拿当前登录用户。这里给一个关键提示拦截器需要放行登录、注册、商品列表、商品详情这些不需要鉴权的接口管理端接口需要单独的AdminInterceptor校验角色。如果你不加区分地把所有接口都拦了前端页面会全线飘红。放行名单在WebMvcConfig里用addPathPatterns和excludePathPatterns配置代码里写清楚注释方便论文里贴图。3.3 商品模块从Controller到Mapper的完整链路商品列表接口是典型的CRUD场景我以它为例给你拆解一遍完整实现链路其他模块照葫芦画瓢就行。Controller层代码RestController RequestMapping(/api/product) public class ProductController { Autowired private ProductService productService; GetMapping(/page) public ResultIPageProductVO page(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, RequestParam(required false) Integer categoryId, RequestParam(required false) String keyword, RequestParam(defaultValue sale) String sort) { return Result.success(productService.getProductPage(pageNum, pageSize, categoryId, keyword, sort)); } }Service层实现思路Override public IPageProductVO getProductPage(Integer pageNum, Integer pageSize, Integer categoryId, String keyword, String sort) { PageProduct page new Page(pageNum, pageSize); LambdaQueryWrapperProduct wrapper new LambdaQueryWrapper(); wrapper.eq(Product::getStatus, 1); // 只查询上架商品 if (categoryId ! null) { wrapper.eq(Product::getCategoryId, categoryId); } if (StringUtils.hasText(keyword)) { wrapper.like(Product::getName, keyword); } // 排序字段sale按销量 descprice_asc价格升序price_desc价格降序 if (price_asc.equals(sort)) { wrapper.orderByAsc(Product::getPrice); } else if (price_desc.equals(sort)) { wrapper.orderByDesc(Product::getPrice); } else { wrapper.orderByDesc(Product::getSales); } IPageProduct productPage productMapper.selectPage(page, wrapper); // 将实体列表转换为VO列表去掉不需要的字段 return productPage.convert(this::toProductVO); }这里有几个细节值得写进论文。第一是分页参数pageNum和pageSize做了默认值处理防止前端没传参时报错第二是排序逻辑用字符串配置而不是硬编码多个接口增加了查询的灵活性第三是convert方法把实体转成VO实现了数据库字段和接口返回数据的解耦保证密码、内部备注这类字段不会被返回给前端。3.4 文件上传图片怎么存最省事商城系统必然涉及商品图片和用户头像的上传。本地存储方案在毕设阶段是最合理的选择在application.yml里配置上传路径通过WebMvcConfig的addResourceHandlers把本地磁盘路径映射为/images/**访问URL。这个方案不需要额外搭建文件服务器也不需要申请云存储跑通整个流程没有任何障碍。实现时注意三个坑。第一上传文件的物理路径不要用相对路径要配置成绝对路径因为不同环境下执行的当前目录可能不同。第二文件名不能直接用用户上传的原始文件名要用UUID或者时间戳重命名否则遇到重名文件会被覆盖还可能因为中文文件名导致乱码。第三图片上传接口要做大小和类型的限制我只允许jpg、png、webp三种格式且单张不超过5MB超过直接返回错误提示。论文里关于文件上传的写法可以这样表述系统采用本地磁盘存储与静态资源映射相结合的方式处理图片文件该方案在中小型项目中具备部署简便、成本低廉的明显优势同时预留了OSS对象存储的接口扩展位置当系统规模扩大时可平滑迁移至云存储方案。这种写法既说明了当前方案又展示了你的架构格局。4. 毕业论文怎么写从提纲到每章一句话思路4.1 论文整体结构七个章节撑起一篇规范毕设毕业论文的写作质量直接决定了你的最终成绩。很多同学技术上做完了论文却不知道从哪里下笔最后东拼西凑出来一篇查重率超过60%的学术垃圾。其实毕设论文是有固定套路的按以下结构来写逻辑一定顺第一章 绪论。包含研究背景与意义、国内外研究现状、论文主要工作与组织结构。核心技巧是研究现状部分不要只罗列文献要用某学者在某种场景下提出了某方法解决了某问题但存在某不足这种句式形成一个递进的评述链条。第二章 相关技术介绍。写Java语言、Spring Boot框架、MyBatis框架、MySQL数据库、Vue前端框架等。注意每个小节要写技术的特点和选型理由不能写成一堆官方文档的摘抄。这个章节虽然是公认的水章节但恰恰是查重率最高的地方一定要自己整理语言。第三章 系统分析。写可行性分析、需求分析、用例分析、功能需求描述。功能结构图在这里给出每个角色配上用例图让老师一眼看清你系统有哪些功能、哪些人可以操作。第四章 系统设计。写总体架构设计、功能模块设计、数据库设计。数据库设计要给出ER图、每张表的建表语句和字段说明这部分是核心也是加分项。第五章 系统实现。按功能模块展示核心代码和截图。注意不要贴大段源码贴关键片段加注释再配运行截图。截图的摆放也有讲究每个功能点至少两张图操作前、操作后的数据变化让老师能顺着图把流程看明白。第六章 系统测试。写测试环境、测试用例表、测试结果分析。功能测试用例表是必须的列出编号、测试模块、操作步骤、预期结果、实际结果、结论。再写一段性能测试用JMeter做并发请求测接口响应时间哪怕只是演示一下也要在论文里留下数据记录。第七章 总结与展望。总结你做了什么、学到了什么再写系统存在的不足和后续改进方向。这一章不要写成流水账重点写通过本项目的开发你掌握了哪些工程化能力、遇到了哪些问题、如何解决体现你做这个项目的完整心路历程。4.2 工作量与查重两个必须提前规划的现实问题写论文最大的坑是时间安排。很多同学把论文压到最后两周结果代码跑通了但论文没写完。我用过来人的经验建议你论文要和开发同步写。做完用户模块就把系统实现里用户管理的章节写了做完订单模块就把订单实现那部分写了。最后留两周统一调格式、改图、降重游刃有余。查重方面核心技术介绍和系统设计部分是最容易标红的。一个小技巧所有技术概念不要直接抄百度百科或菜鸟教程用自己的话重新组织。比如Spring Boot的自动配置原理你可以这样写Spring Boot在启动阶段通过加载META-INF目录下的spring.factories配置文件将项目引入依赖对应的自动配置类注册到容器中并根据当前项目中的依赖情况决定是否生效。这句话的原理没有变但表述方式完全是自己的查重自然低。4.3 答辩准备十个高频问题清单答辩环节决定了老师是否认可你的项目。提前把以下十个问题准备好基本就稳了你说说Spring Boot的自动配置原理为什么选用MyBatis-Plus它相比MyBatis有什么优势用户密码是怎么存储的为什么不能明文存储订单状态有哪些画一下状态流转图如果用户下单后一直不支付库存怎么处理你系统里怎么区分普通用户和管理员的权限首页数据量大了之后分页怎么优化购物车数据是存在Cookie还是数据库为什么多个用户同时购买同一件商品库存怎么保证不超卖系统的并发量大概能承受多少你做过性能测试吗前五个问题如果答不上来基本凉凉后五个属于拔高题答上来就是优秀论文的加分项。每个问题提前准备一段30秒左右的答案结合你项目中的具体实现去说不要背概念。5. 常见问题排查与项目优化实录5.1 环境搭建阶段的三个高频报错毕设项目拿到手第一个坎就是环境配置。我给几百个学生看过项目下面三个问题出现频率最高问题一Maven依赖下载失败或版本冲突。表现是pom.xml里的依赖报红或者启动时报NoSuchMethodError。处理方案统一使用Spring Boot 2.7.x版本而不是3.x因为3.x的javax包全部换成了jakarta很多视频教程和旧代码用的是javax.servlet版本对不上会浪费大量时间。另外Maven仓库最好配置阿里云镜像没有这个配置下载依赖能让人等到怀疑人生。问题二数据库连接不上或SQL语法报错。表现是项目能启动但访问任何接口都报数据库异常。排查步骤先确认MySQL服务已启动再检查application.yml里的用户名、密码、URL中的数据库名是否与实际一致。最容易忽略的是字符集问题URL要拼接?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai不然插入中文会变成问号。问题三前端页面样式丢失或白屏。如果用的是Thymeleaf检查静态资源路径是否正确application.yml中spring.mvc.static-path-pattern/static/**有没有配置。如果前后端分离检查跨域配置——在WebMvcConfig里实现addCorsMappings方法允许localhost:8080的前端端口访问后端。5.2 数据一致性问题事务和唯一索引的双保险商城项目里的数据一致性核心在两处订单创建和库存扣减。如果你不做任何处理用户提交订单时扣了库存但订单创建失败库存就凭空少了。正确的做法是在Service方法上加Transactional注解把生成订单号、保存订单主表、保存子订单、扣减库存这几步放在同一个事务里任何一步失败全部回滚。Transactional这个注解写起来简单但要写出让答辩老师点头的效果需要补充三个细节事务的传播行为、回滚条件、隔离级别。在代码里显式声明Transactional(rollbackFor Exception.class)比裸写Transactional更有态度因为你明确了任何异常都要回滚包括运行时异常和非运行时异常。另一个隐藏的数据一致性问题——订单号生成。不要用数据库自增ID直接当订单号因为订单号需要对外展示必须唯一且不能暴露系统数据量。我建议用时间戳加随机数的方式yyyyMMddHHmmss 6位随机数或者直接用IdWorker.getId()MyBatis-Plus内置的雪花算法。雪花算法这个名词本身就是论文里的一个知识点值得专门写一段。5.3 性能优化三个小项目让测试数据更好看如果你的论文里要写性能测试但跑出来的吞吐量数据不太好看可以从三个方向做优化每个改动都能在论文里对应一段系统优化的描述。第一商品列表接口的SQL优化。给product表的category_id、status字段建联合索引给orders表的user_id建索引。配合MySQL的EXPLAIN语句分析SQL执行计划把type从ALL全表扫描优化到ref或range级别。测试数据可以这样写优化前查询耗时约120ms优化后降至约30ms。第二MyBatis-Plus的分页插件配置。在配置类中注册PaginationInnerInterceptor这个不配置会导致分页查询返回全量数据。很多同学踩了这个坑还不自知接口返回的数据全部正确但性能极差。第三热点数据的缓存处理。在商品详情接口上引入Spring Cache用Cacheable(cacheNames product, key #id)注解查询时优先走缓存缓存没有则查数据库并写入。这个优化点非常好写进论文代码量只有几行但技术价值非常高。演示的时候第一次请求详情页可能会有点慢第二次就会快很多做成对比图是非常好的展示素材。5.4 部署上线从本地到服务器的完整路径很多学校要求毕设项目能够部署到服务器上进行演示提前把这一步跑通可以避免很多尴尬。打包方式选择mvn clean package -DskipTests生成JAR包然后通过java -jar hdmall.jar运行。这里要注意JDK版本要和打包时一致不然启动会报UnsupportedClassVersionError。如果在远程服务器部署简单的做法是用nohup java -jar hdmall.jar app.log 21 后台运行再把前端打包后的静态文件放在Nginx的html目录下通过反向代理把/api请求转发到后端服务的8080端口。Nginx配置里要注意两个点前端路由需要配置try_files $uri $uri/ /index.html;避免刷新后404静态资源要配置缓存expires 7d;提升访问速度。部署这块我不建议你在答辩前才折腾提前两周开始准备因为服务器上的JDK、MySQL、Nginx版本和你本地环境大概率有细微差异会遇到不少光靠百度解决不了的坑。6. 实操验证与经验沉淀6.1 完整跑通一遍核心业务链路的验证顺序项目做好了不能只在电脑上摆着。建议你按照下面的顺序完整跑一遍业务链路模拟真实用户的操作流程同时记录截图和日志这些素材都是论文和答辩的弹药第一步管理员登录后台创建手机分类智能手机、功能机、配件然后添加至少四款商品分别设置不同的价格、库存、销量。第二步退出后台注册一个测试用户在商城首页浏览商品列表测试关键词搜索和分类筛选。第三步将两款商品加入购物车修改购物车数量然后结算下单。第四步进入我的订单模拟支付。第五步切换回管理员账号在订单管理中找到这笔订单执行发货操作填写物流单号。第六步切换回用户账号确认收货然后到后台的统计面板查看销售数据变化。这六步每一步都会触发后端日志、数据库记录更新、状态流转把整个过程的日志留存下来写论文时专门摘一段系统运行效果分析。6.2 用数据库SQL把项目说清楚答辩老师最常做的一个操作就是当场看你的数据库。不要怕提前准备几个能拿得出手的SQL查询结果。比如用一条SQL统计出所有用户的累计消费金额排名用一条SQL查看最近七天的订单数量趋势。这些SQL语句本身就能成为答辩时的技术谈资它们比你在PPT里贴一百页截图都有说服力。我常用的一条统计SQLSELECT DATE_FORMAT(create_time, %Y-%m-%d) AS order_date, COUNT(*) AS order_count, SUM(pay_amount) AS total_amount FROM orders WHERE pay_status 1 GROUP BY DATE_FORMAT(create_time, %Y-%m-%d) ORDER BY order_date DESC LIMIT 7;老师看到你能熟练运用日期函数、分组聚合和排序自然就相信这个项目确实是你自己动手做的。6.3 给后来者的避坑清单最后单独说一份避坑清单都是我在给大量学生改项目时总结出来的高频问题。按照这个清单逐一核对你的项目基本能稳定免除低级错误数据库密码不要用超过8位的复杂密码用root/123456这种最简单的方便部署和演示时快速配置。application.yml里的配置项写清楚注释尤其是数据库连接、服务器端口、文件上传路径这三项不要使用没有注释的配置。Controller里的接口统一以/api开头方便统一处理跨域和权限拦截也让URL风格看起来更专业。统一返回结果类Result的code字段用200表示成功、500表示失败业务错误用40001、40002这种分段编码不要在Controller里到处返回true/false。前端页面不要在script标签里直接写死后端地址做统一封装方便部署时切换域名。每次修改核心代码后建议把整个模块重新跑一遍防止改动A功能弄坏了B功能。这个习惯在开发后期尤其重要很多BUG就是改出来而不是写出来的。本文还有配套的精品资源点击获取
返回列表