1. 环境搭建从Nginx启动到端口冲突排查第一次接触苍穹外卖项目时最让人头疼的往往是环境搭建这个拦路虎。记得我刚开始配置Nginx前端服务时双击nginx.exe后窗口一闪而过浏览器访问localhost却始终显示空白页。这种情况十有八九是端口冲突导致的而80端口作为HTTP默认端口经常被其他服务占用。解决这个问题其实很简单只需要三步走打开cmd输入netstat -ano | findstr 80查看占用进程用tasklist | findstr 进程ID确认具体程序执行taskkill /PID 进程ID /F强制结束进程不过更稳妥的做法是直接修改Nginx配置。找到nginx-1.20.2/conf/nginx.conf文件将server块中的listen 80改为其他端口比如8080。这里有个小技巧修改配置后需要先执行nginx -s stop停止服务再重新启动nginx.exe才会生效。2. 项目结构深度解析从父工程到子模块打开后端工程sky-takeout后你会发现这是个典型的Maven多模块项目。这种结构最大的好处是职责分离我来拆解下各模块的核心作用sky-take-out父工程就像项目的大脑统一管理所有子模块的依赖版本。pom.xml里的就是它的神经中枢。sky-common相当于项目的工具包我特别喜欢里面的Result类封装了统一的API响应格式让前后端交互更规范。sky-pojo这里存放着各种数据传输对象相当于项目的血液系统。sky-server真正的业务逻辑心脏包含Controller、Service等核心组件。3. 分层对象详解Entity/DTO/VO的实战应用刚开始接触这些概念时我也经常分不清它们的区别。直到在苍穹外卖项目中实际运用后才真正理解它们的价值Entity直接映射数据库表结构。比如Employee实体就对应employee表每个字段都和表列一一对应。DTO前端传后端的数据集装箱。登录时前端传来的用户名密码就是用LoginDTO接收的。VO后端返前端的定制包裹。比如EmployeeVO可能只包含前端需要的id、name等字段隐藏了敏感信息。实际编码时我习惯用后缀明确类型UserEntity、UserDTO、UserVO。这样代码可读性会大大提高团队协作也更顺畅。4. 编码问题排雷Input length 2报错解决启动项目时最让人崩溃的莫过于看到java.nio.charset.MalformedInputException: Input length 2这个错误。这其实是文件编码不匹配导致的我总结了一套排查方案首先检查IDEA的全局编码设置File - Settings - Editor - File Encodings确保Global Encoding、Project Encoding都是UTF-8底部Default encoding for properties files也要选UTF-8然后重点检查yml配置文件右键点击application-dev.yml选择File Encoding确认编码为UTF-8勾选Transparent native-to-ascii conversion最后记得执行maven clean compile重新编译有时候缓存会导致修改不生效。我在实际项目中遇到过三次这类问题都是因为团队成员用不同操作系统开发文件编码默认设置不同导致的。5. 数据库配置避坑指南苍穹外卖的数据库脚本sky.sql执行后会自动创建11张业务表。这里最容易出错的是连接配置我建议在application-dev.yml中配置正确的数据库连接spring: datasource: url: jdbc:mysql://localhost:3306/sky_take_out?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver特别注意时区问题可以在url后添加serverTimezoneAsia/Shanghai如果使用MySQL 8.0驱动类要写com.mysql.cj.jdbc.Driver6. 开发环境终极检查清单为了避免大家重复踩坑我整理了一份必查清单JDK版本是否为1.8可以在终端用java -version验证IDEA中Project Structure设置的SDK和Language level是否匹配Maven的settings.xml是否配置了阿里云镜像Git安装后是否配置了全局用户名和邮箱Windows系统是否关闭了隐藏已知文件类型的扩展名这个会导致配置文件修改时出错记得第一次带新人时有个小伙伴折腾了两天环境都没跑起来最后发现是因为他电脑的JAVA_HOME指向了JRE而不是JDK。所以环境变量的检查也千万不能忽视。