ARTICLE DETAIL

资讯详情

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

基于SpringBoot的饮食分享平台:毕设源码与开发实战

基于SpringBoot的饮食分享平台:毕设源码与开发实战 每年一到毕业设计季节就有不少同学私信问我“Java选题到底怎么选才能不被导师劝退”我的回答通常是——选一个你熟悉业务、技术栈覆盖够、又能把文档写丰满的题目比如基于SpringBoot的饮食分享平台。这类项目的核心关键词是Java、Spring Boot、毕设、源码、美食分享平台听起来不算惊艳但它几乎把毕设考核点全部串起来了用户端、管理端、数据建模、权限控制、文件上传、检索排序、点赞收藏足够撑起一篇有分量的毕业论文也能在答辩时讲出完整的业务链路。这套系统适合Java初学者作为练手项目也适合正在找选题、需要快速落地的同学直接参照复现更推荐给那些想通过一个中型Web应用把SpringBoot生态摸一遍的人。下面我把自己做这个项目时的完整思路、表结构设计、核心代码片段和调试踩坑记录全部拆开讲一遍。1. 项目定位与系统规划思路1.1 为什么选饮食分享平台而不是烂大街的商城或管理系统先说选题逻辑。很多同学毕业设计喜欢选XX管理系统比如图书管理系统、学生管理系统。这类题目的问题不是做不出来而是业务太单薄论文没东西可写答辩时老师问一句“你这个系统的难点在哪”场面容易冷掉。饮食分享平台不一样它天然具备两层业务属性内容社区属性用户注册、发布菜谱、上传图片、点赞评论、收藏关注涉及完整的社交交互闭环平台治理属性管理员要审核内容、管理分类、处理用户、查看统计这是典型的管理后台需求。一个项目同时覆盖C端用户操作和B端管理操作系统结构自然就立体了。用户端有首页信息流、菜谱详情、用户主页、搜索筛选管理端有内容审核、用户管理、分类维护、数据看板。无论从功能数量、页面数量还是数据表数量上看都比普通管理系统高出不少论文里光是需求分析和用例图就能画好几页。更深一层说饮食这个赛道还有一些软优势数据模型可以做得很有真实感。菜谱表要关联用户、分类、标签一张菜谱有主图、步骤图、视频链接菜谱有浏览量、点赞数、收藏数、评论数。这些字段的关联关系会让ER图非常好看写数据库设计章节时不用硬凑。1.2 系统角色与功能边界划分做毕设的第一件事不是写代码而是把角色和功能边界画清楚。这个平台我拆分成了三种角色每个角色的权限边界必须明确游客只能浏览首页菜谱、查看详情和评论不能点赞、收藏或发布内容。实现上通过拦截器放行部分URL路径来处理注册用户核心活跃角色拥有完整的C端功能。包括登录注册、浏览菜谱、关键词搜索、分类筛选、发布菜谱、编辑删除自己的菜谱、点赞/取消点赞、收藏/取消收藏、评论、关注/取关其他用户、个人资料编辑和头像上传管理员平台治理角色。登录后进入独立的后台界面负责用户禁用/启用、菜谱审核上架/下架、分类管理、首页轮播图配置以及最基础的数据统计用户总数、菜谱总数、今日新增等。这样划分的好处是权限控制逻辑清晰代码可维护答辩时也能清晰地讲清楚我做了几层权限校验。我用Spring Boot的HandlerInterceptor做登录校验用自定义注解区分用户和管理员权限没有引入Spring Security的重型配置——不是Security不好而是毕设场景下自定义拦截器加注解的方式更直观论文里也好解释。1.3 功能清单与工作量评估完整的功能清单建议按模块列出来方便排期和写文档模块功能点说明用户模块注册、登录、退出、信息编辑、头像上传注册时校验用户名唯一性密码BCrypt加密存储菜谱模块发布、编辑、删除、详情、图文步骤支持多图上传核心业务表互动模块点赞、收藏、评论、关注各自独立关联表均支持取消操作搜索模块关键词搜索、分类筛选、热门排序按标题模糊匹配按浏览量排序管理模块用户管理、菜谱审核、分类管理、轮播图与用户端共用一套后端但独立路径前缀统计模块平台概览数据、用户增长趋势管理端首页显示可用ECharts展示工作量方面我实际做完这套前后端前端是Vue Element UI的Web页面后端是纯SpringBoot接口大约花了两周半的业余时间。如果只做后端接口加简单的模板页一周内就能跑通。选这个题目不用怕工作量爆炸真正难的点在于表结构设计和互动模块的幂等处理后面我会详细展开。2. 技术选型与项目架构拆解2.1 后端技术栈与版本选择项目名既然带了SpringBoot技术栈的骨干就是它。我选的组合是Spring Boot 2.7.x为什么不用3.x因为3.x要求JDK17及以上而很多同学的电脑上装的是JDK8另外2.7是2.x系列里最成熟的版本社区资料也最多遇到问题搜起来方便。如果你是新配的环境也可以选3.x但建议保证JDK版本匹配MyBatis Plus 3.5.x毕设效率神器。内置的BaseMapper提供单表CRUD分页插件一条配置搞定逻辑删除也是注解搞定。比起纯MyBatis手写大量XML用MyBatis Plus节省的时间非常可观MySQL 8.0本地开发稳定注意驱动要用com.mysql.cj.jdbc.DriverMaven项目构建工具统一依赖管理Lombok减少实体类getter/setter代码但我建议实体类里关键字段的注释写清楚文档截图时好看JWTJJWT库无状态登录令牌适合前后端分离项目。强调一下用JWT不等于不用Session而是毕设项目用JWT能额外讲出一个认证方案选型对比小节论文里多一个亮点。我通常会在绪论或技术介绍部分提一句对比传统Session方案JWT在前后端分离场景下减轻了服务端存储压力这句话在答辩时非常加分。2.2 前端方案与项目结构前端我试过两种方案第一种是纯模板引擎渲染Thymeleaf配合Bootstrap好处是不需要Node环境打包成一个jar就能跑部署极其简单缺点是交互体验一般、页面代码较乱写分页和异步点赞比较费劲。第二种是前后端分离Vue2 Element UI Axios前端工程用Vite或Webpack构建开发和打包分开。推荐毕设选这种因为现在的JavaWeb课程普遍讲过Vue基础且前后端分离的架构在论文中可以写成一整节。最终我采用的是第二种方案前端代码单独放在frontend/目录下后端放在backend/目录下。后端项目结构采用经典的分层架构包名如下com.example.diet ├── controller # 控制层接收请求返回统一结果 ├── service # 业务层处理核心逻辑和事务 │ └── impl ├── mapper # MyBatis Plus的Mapper接口 ├── entity # 数据库实体类 ├── dto # 传输对象避免直接暴露实体 ├── vo # 视图对象按前端需要组装数据 ├── config # 配置类跨域、拦截器、MyBatisPlus配置 ├── common # 统一返回结果、异常处理、常量 ├── utils # JWT工具、文件上传工具等 └── exception # 自定义异常这个结构看起来普通但它是我反复调整后最舒服的controller层只有薄薄一层参数接收和结果封装业务全在service层。答辩时老师问你如何保证代码可维护性你就可以顺着分层讲下去。2.3 为什么推荐MyBatis Plus而不是Spring Data JPA这个话题也算老生常谈但我要给毕设党一个明确建议选MyBatis Plus。原因有三个第一MyBatis Plus的代码生成器能根据表结构反向生成实体、Mapper、Service基础CRUD代码几乎不用手写对赶工期的同学太重要了。虽然生成后要手动加业务逻辑但大量重复劳动被砍掉了。第二MyBatis Plus的分页插件非常稳定配合Page对象处理列表分页前端只需传current和size两个参数。第三国内社区生态好面试时提到MyBatis Plus也是企业常用技术不是毕业即失业的冷门框架。但有一点要注意MyBatis Plus的单表CRUD虽然方便复杂多表关联还是要手写SQL。比如首页信息流要同时拿到菜谱作者的头像和昵称我选择在Mapper里写Select注解自定义SQL配合LEFT JOIN而不是在Service层循环查询——避免N1问题这句话写进论文也是实打实的优化点。3. 数据库设计与核心表结构3.1 整体ER设计思路做毕设数据库设计时不用刻意追求几十张表但每张表必须有存在的业务理由。我的饮食分享平台一共设计了10张核心表涵盖用户、内容、互动、管理四个维度user用户表category分类表recipe菜谱表recipe_step菜谱步骤表comment评论表like_record点赞记录表favorite收藏记录表follow关注关系表banner首页轮播图表管理端配置admin管理员表单独建表方便权限识别其中比较关键的是互动类表。点赞、收藏、关注这三类都有一张独立的中间表而不是在业务表中存一个数字字段。虽然recipe表里有like_count和favorite_count字段用于展示但真实计数来源是中间表的统计。这一步设计在答辩时非常重要因为很多同学贪图方便只在菜谱表存个数字结果演示点赞功能时刷新一下就露馅了。3.2 核心表结构设计细节我挑几张重点表来讲建表SQL里隐藏着很多细节。user用户表CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 用户ID, username varchar(50) NOT NULL COMMENT 用户名, password varchar(100) NOT NULL COMMENT 密码(BCrypt加密), nickname varchar(50) DEFAULT NULL COMMENT 昵称, avatar varchar(255) DEFAULT NULL COMMENT 头像URL, gender tinyint DEFAULT 0 COMMENT 性别 0未知 1男 2女, signature varchar(255) DEFAULT NULL COMMENT 个性签名, status tinyint DEFAULT 1 COMMENT 状态 1正常 0禁用, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 注册时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;几个细节注意一下用户名必须唯一所以建了唯一索引密码字段长度至少100因为BCrypt加密结果是60位左右nickname和avatar允许为空注册时可以先给默认值后续用户自己改。recipe菜谱表CREATE TABLE recipe ( id bigint NOT NULL AUTO_INCREMENT COMMENT 菜谱ID, user_id bigint NOT NULL COMMENT 发布用户ID, category_id bigint DEFAULT NULL COMMENT 分类ID, title varchar(100) NOT NULL COMMENT 菜谱标题, cover varchar(255) DEFAULT NULL COMMENT 封面图URL, description text COMMENT 菜谱简介, ingredients text COMMENT 食材清单(JSON格式), status tinyint DEFAULT 0 COMMENT 状态 0待审核 1已上架 2已下架, view_count int DEFAULT 0 COMMENT 浏览量, like_count int DEFAULT 0 COMMENT 点赞数, favorite_count int DEFAULT 0 COMMENT 收藏数, comment_count int DEFAULT 0 COMMENT 评论数, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 发布时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_category_id (category_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有两个细节很值得写进论文status字段我做的是0待审核、1上架、2下架三段式状态而不是简单的0/1两态——加入待审核状态后管理端的审核功能就有业务抓手也避免用户发完图立刻出现在首页导致内容失控。另外view_count这类计数在页面展示时直接读但更新时不是每次请求都立刻UPDATE数据库而是只在每次查询详情页时做一次UPDATE recipe SET view_countview_count1这个步骤在答辩时可以说成延迟统计的简化实现。3.3 互动表的幂等设计点赞、收藏、关注是毕设里最容易出bug的地方核心要求是一个用户对同一内容只能有一条记录。我以like_record为例CREATE TABLE like_record ( id bigint NOT NULL AUTO_INCREMENT, user_id bigint NOT NULL COMMENT 点赞用户ID, recipe_id bigint NOT NULL COMMENT 被点赞菜谱ID, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_user_recipe (user_id, recipe_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;唯一索引uk_user_recipe是这套设计的命门。Service层的逻辑是这样的点赞时先INSERT一条记录如果捕获到唯一键冲突异常说明已经点赞直接返回请勿重复点赞取消点赞就DELETE对应记录。同时为了展示增加或减少计数我还在同一个事务里更新recipe表的like_count。这套逻辑配合MySQL的事务可以做到点赞/取消完全幂等。收藏表和关注表的结构与它完全对称复制粘贴改个表名和字段就行。4. 核心业务实现与代码拆解4.1 统一返回结果与全局异常处理先不急着写某个功能而是要把基建打好。我定义了一个Result类所有接口都返回这个统一结构Data public class ResultT { private Integer code; // 200成功其他失败 private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(操作成功); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }与此同时写一个RestControllerAdvice全局异常处理器把业务异常和未知异常统一转换为Result.error()返回。这样做的好处非常直接前端Axios可以统一拦截错误提示不需要每个接口各自try-catch。更重要的是论文里可以写一节统一异常处理设计配上截图显得工程素养很高。4.2 登录注册与JWT令牌生成用户登录是系统的入口我用JWT做无状态认证。生成流程如下// 登录成功后生成JWT String token Jwts.builder() .setSubject(user.getUsername()) .claim(userId, user.getId()) .claim(role, user) .setExpiration(new Date(System.currentTimeMillis() 24 * 3600 * 1000)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact();前端拿到token后存入localStorage后续每次请求在Authorization请求头里带上它。后端有一个JwtInterceptor拦截器在preHandle方法里面解析Token把解析出的userId存入request的attribute中这样后续Controller就能直接取出当前登录用户。这个过程麻烦的地方是要排除登录注册接口所以我在配置拦截器时用excludePathPatterns把/api/auth/**、/api/recipe/list、/api/recipe/detail/**这些公开接口放行。登录密码校验用BCrypt不要用MD5。MD5加不加盐都容易被彩虹表破解而BCrypt每次生成的哈希都不一样安全性高一个档次。Spring Security的BCryptPasswordEncoder可以直接依赖引入不需要引入整个Spring Security全家桶。4.3 菜谱发布的完整流程发布菜谱是这个系统的流量入口也是文件上传和事务处理的综合考验。我设计的前端表单包含标题、分类、简介、封面图、食材清单动态增删、图文步骤列表。后端Controller大概长这样PostMapping(/publish) public Result? publish(RequestBody RecipePublishDTO dto, HttpServletRequest request) { Long userId (Long) request.getAttribute(userId); recipeService.publishRecipe(userId, dto); return Result.success(null); }DTO里包含菜谱基本信息、食材列表、步骤列表Service层在一个事务里完成三步操作插入recipe主表记录拿到自增ID循环插入recipe_step步骤表记录每一行有步骤序号、文字说明和图片URL更新用户的发布数量统计这个可做可不做做了可以鞭策活跃度。注意点来了步骤表的图片上传不能放在循环里逐张等待而是在前端就把多张图片逐个调用上传接口拿到URL最后所有URL拼接在DTO里一次提交给后端。这样发布接口只做一次请求速度更快也避免了部分步骤图片上传成功但菜谱发布失败的数据碎片问题。文件上传我用的是本地磁盘存储路径可以在配置文件里指定上传成功返回/images/2024/xxxx.jpg这样的相对路径由前端拼接完整域名展示。4.4 首页信息流与搜索分页查询首页信息流是整个系统最核心的查询接口前端一进入就调用。它要求返回菜谱列表的同时带上作者头像和昵称、分类名称这就涉及联表。我直接在Mapper接口上写注解SQLSelect(SELECT r.*, u.nickname, u.avatar, c.name AS category_name FROM recipe r LEFT JOIN user u ON r.user_id u.id LEFT JOIN category c ON r.category_id c.id WHERE r.status 1 ORDER BY r.create_time DESC) IPageRecipeVO selectPublishedRecipePage(PageRecipeVO page);MyBatis Plus的分页插件会自动拦截这条SQL实现物理分页返回的IPage里有records、total、current、size等字段前端分页组件直接对接。搜索功能我加了两个维度一是标题模糊匹配LIKE %关键词%二是按分类筛选。没有引入Elasticsearch或全文索引因为数据量撑不到那个级别答辩时主动说当前数据量下MySQL的LIKE查询已经足够如果未来数据量增长可以引入全文检索中间件这句话是加分项显得你有扩展思考。4.5 点赞收藏的关注事务一致性点赞和收藏功能做出来容易但做出正常体验需要细心。前端点击点赞按钮后调用后端接口后端先判断当前用户是否已点赞然后执行插入或删除同时更新recipe.like_count。这里有个隐藏bug值得说说如果点赞接口在高并发下同时收到同一个用户的两次请求没有唯一索引的话会插入两条记录。我第一次测试时用脚本模拟快速点击就踩了这个坑。解决方案就是前面提到的UNIQUE KEY uk_user_recipe配合Service层在插入时捕获DuplicateKeyException。所以在讲设计时我会把唯一索引放在和业务逻辑同等重要的位置。4.6 管理后台与内容审核管理端并不复杂但它是平台管理系统这个标题里管理二字的直接体现。我的管理端接口全部沿用/api/admin/**前缀独立登录入口。管理员登录后可以查看用户列表支持按用户名搜索可以禁用/启用用户查看菜谱列表支持按状态筛选待审核/已上架/已下架和审核操作管理分类增删改查配置首页轮播图上传图片并设置跳转菜谱数据看板显示总用户数、总菜谱数、今日注册用户数、今日新增菜谱数用ECharts画折线图展示近7天新增趋势。这部分工作量看似大但由于前端是Vue Element UI表格和表单可以复用组件化的写法几天就能搭完。后端逻辑非常简单几乎都是单表CRUD加一个状态更新。答辩时管理端截图放在论文里能直观展现系统的完整程度。5. 部署调试与二次开发经验5.1 本地开发环境准备与启动流程我从零开始跑这个项目的完整流程如下新同学照着做基本不会卡壳安装JDK8或JDK17根据你选的Spring Boot版本、Maven 3.6、MySQL 8.0、IDEA在MySQL里执行项目根目录下的sql/init.sql脚本自动创建数据库和所有表打开application.yml修改数据源server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/diet_share?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的数据库密码 servlet: multipart: max-file-size: 10MB max-request-size: 50MB mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0启动SpringBoot主类看到控制台输出Started Application表示启动成功前端如果用的是Vue工程执行npm install安装依赖再npm run serve启动开发服务器默认端口5173或8081记得在Vue的vite.config.js或vue.config.js里配置代理转发到后端8080端口解决跨域。如果不想折腾前端分离直接把前端dist静态文件扔到src/main/resources/static目录下打包成一个jar也能跑适合演示时省事。5.2 配置后端跨域不生效的问题排查前后端分离项目最常遇到的就是跨域报错Access to XMLHttpRequest has been blocked by CORS policy。我在config包下写了CorsConfigConfiguration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }按说这样配置就完事了但实际调试时发现前端请求带上了自定义的Authorization请求头后端报错还是CORS。排查下来问题出在allowedHeaders(*)在某些Spring版本对携带凭证的请求不生效需要明确列出Authorization头。后来我改成.allowedHeaders(Content-Type, Authorization, X-Requested-With)这个问题就解决了。如果你用的是Spring Boot 2.4以上的高版本建议一定用allowedOriginPatterns而不是已废弃的allowedOrigins。5.3 文件上传目录与访问路径的坑文件上传有两个坑我反复踩过第一个坑是上传路径不存在。本地开发时我配置的上传根目录是./upload/但IDEA里工作目录不同会导致路径飘忽不定有时传到项目根目录的外部文件夹前端访问不到。解决办法是配置绝对路径或者把上传目录绑定到src/main/resources/static/upload/这样SpringBoot默认静态资源映射就能直接访问。为了稳妥我在WebMvcConfigurer里手动加了一个资源映射Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceLocations(file: uploadPath /); }第二个坑是Linux服务器上上传路径权限。如果你部署到服务器upload目录要确保运行用户有写权限否则上传时报FileNotFoundException排查起来非常隐蔽。5.4 高频Bug与解决对照表我把开发中遇到的高频问题整理成速查表方便你对照排查现象根因解决方案启动报Failed to configure a DataSourceapplication.yml数据源配置错误或MySQL没启动检查MySQL服务核对url/username/password接口报401但登录没问题JWT拦截器把公开接口拦截了检查addPathPatterns和excludePathPatterns配置列表分页不生效返回全部数据没配置MyBatis Plus分页插件在配置类里添加PaginationInnerInterceptor上传图片后浏览器访问404静态资源映射未配置或路径拼接错误配置addResourceHandlers检查返回的相对路径JSON返回时间格式为2026-08-01T08:00:00默认Jackson序列化格式问题在application.yml配置spring.jackson.date-format或用JsonFormat删除用户但数据仍然出现在列表没做关联删除或逻辑删除确认逻辑删除字段配置或手动清理互动表关联记录前端请求后端偶尔超时本地服务跨域OPTIONS预检慢确认CORS配置maxAge设置合理避免每次预检数据库插入中文乱码数据库字符集不是utf8mb4建库时指定CHARACTER SET utf8mb4连接URL加characterEncodingutf85.5 如何在这个项目上做二次开发如果你是拿到源码后想改成自己的毕设我建议按这个优先级加功能成本低、见效快菜谱收藏合集功能允许用户自建收藏夹、给收藏夹命名把收藏记录分组管理。这个改动只涉及favorite表加一个group_id字段前端加一个分组下拉框工作量很小但功能很有辨识度菜谱审核不通过原因反馈管理端下架菜品时填写原因用户端详情页或通知栏展示。这个功能很贴平台治理逻辑也能体现你考虑问题全面用户活跃度排行按发布菜谱数和获赞数综合排序做一个美食达人榜需要写一条带GROUP BY的统计SQL但业务逻辑不复杂个人主页的作品集展示按用户查看他发布过的所有菜谱这个本质上是复用已有的列表接口加userId参数。千万不要一上来就想着改权限框架、改微服务架构毕设的首要目标是稳定跑通、逻辑自洽、论文充实。把上面任何一个扩展点做完再配合源码里的注释和文档项目完整度能提升一大截。5.6 关于调试定制服务与交付质量我深知网上不少源码项目拿到手后要么缺包缺文档、要么代码风格混乱没法改。所以这套饮食分享平台的源码我是按可直接交付的标准整理的项目里自带README.md启动说明、sql初始化脚本、接口文档Postman导出、答辩PPT提纲核心模块代码带着注释关键设计点索引、事务、JWT拦截在文档里逐条说明。如果有同学拿到手后调试遇到问题最有效的排查路径是先看控制台日志里SQL打印MyBatis Plus默认打印SQL确认Mapper执行到哪一步再根据错误类型对照上面那张排查表基本都能解决。需要做个性化功能定制的建议先把现有代码跑通一遍再跟我说想改哪里沟通效率最高。写在最后这套基于SpringBoot的饮食分享平台我从选题、设计到编码复盘过好几遍最大的体会是——毕设项目的价值不在于框架多先进而在于每一条业务逻辑背后你都能讲清楚为什么这么设计。比如互动表为什么要加唯一索引发布菜谱为什么要用事务批量插入步骤管理端为什么要做状态审核流这些细节才是答辩老师真正想看的东西。我还记得自己当时排错排到深夜发现只是CORS配置多了一个引号时的崩溃感所以特意把那些容易踩的坑都写在了上面。希望这篇分享能帮你在毕设路上少走几步弯路做完之后你会发现自己对SpringBoot的理解比啃十篇教程都扎实。
返回列表