苍穹外卖Day3
🌟 苍穹外卖项目实战:从数据库到接口的全链路问题解决指南
本文记录了苍穹外卖项目开发过程中遇到的关键问题及解决方案,涵盖数据库连接、接口测试、全局参数传递、服务器配置等核心环节,助你快速定位并解决类似问题!
🚀 一、数据库连接问题:1045访问拒绝
问题描述
2025-07-13 09:10:56.762 ERROR 2488 --- [Create-42898626] com.alibaba.druid.pool.DruidDataSource:
create connection SQLException, url: jdbc:mysql://localhost:3306/sky_take_out?serverTimezone=Asia/Shanghai...
errorCode 1045, state 28000java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
✅ 解决方案
-
检查MySQL服务状态
# 管理员命令行 net start mysql
-
验证登录凭据
mysql -u root -p # 输入密码验证
-
修正配置文件
- 检查
application.yml
中的数据库密码 - 确保用户名/密码正确(通常为
root/123456
)
- 检查
-
权限检查(备用)
-- 查看用户权限 SHOW GRANTS FOR 'root'@'localhost';-- 授权全局权限(谨慎使用) GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
-
IDEA内嵌数据库(可视化操作)
- Database面板 > New > Data Source > MySQL
- 直接创建表结构和测试数据
🔐 二、接口测试401未授权问题
问题现象
在接口文档测试新增员工功能时,返回响应码401
✅ 解决方案
-
定位拦截器
- 检查
JwtTokenAdminInterceptor
等拦截器
public class JwtTokenAdminInterceptor implements HandlerInterceptor {// 令牌校验逻辑 }
- 检查
-
获取有效Token
- 通过管理员登录接口获取Token
- 在Swagger/Knife4j文档中测试登录接口
-
添加全局参数
- 在接口文档中添加Header参数
参数名称: token 参数值: eyJhbGciOiJIUzI1NiJ9...(登录返回的Token)
-
调试技巧
ALT + F8
:查看变量值Ctrl + F5
:强制刷新Ctrl + 左键单击
:跳转到定义
📡 三、全局参数Token接收失败问题
问题现象
接口文档设置了全局参数,但代码中无法获取Token值
✅ 解决方案
-
添加调试日志
// 在拦截器中添加日志输出 log.info("接收到的Token: {}", token);
-
设置断点调试
- 在日志输出行设置断点
- 调试模式启动项目
-
检查参数名称一致性
# application.yml sky:jwt:admin-token-name: token # 确保与接口文档一致
-
多途径获取Token
// 优先从Header获取,其次从参数获取 String token = request.getHeader(tokenName); if(token == null) {token = request.getParameter(tokenName); }
⚠️ 四、IIS与Nginx端口冲突问题
背景知识
- IIS:微软Windows系统的Web服务器,默认占用80端口
- Nginx:高性能HTTP和反向代理服务器
✅ 解决方案
-
停止IIS服务
net stop was /y net stop w3svc
-
清除HTTP.sys注册
netsh http delete urlacl url=http://+:80/
-
重启Nginx
cd F:\project\cangqiong\code\day01\nginx-1.20.2 taskkill /IM nginx.exe /F start nginx
-
验证端口占用
netstat -ano | findstr :80
🛠️ 五、SQL异常:唯一键冲突
问题描述
### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException:
Duplicate entry 'zhangsan' for key 'idx_username'
✅ 解决方案
添加在全局异常处理器
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){String message = ex.getMessage();log.error("异常信息:{}", message);if(message.contains("Duplicate entry")){String[] split = message.split(" ");String msg = split[2] + "已存在";return Result.error(msg);}else{return Result.error("未知错误");}
}
注解一定要加
💡 项目经验总结
- 数据库连接问题:80%的数据库访问错误源于配置错误
- 接口安全设计:JWT拦截器是保护API的第一道防线
- 端口冲突:生产环境推荐使用Nginx反向代理解决端口复用
- 异常处理:全局异常处理器能极大提升系统健壮性
- 调试技巧:
- 合理使用日志级别(DEBUG/INFO/ERROR)
- 善用IDE的断点调试功能
- 接口文档与代码保持同步更新
最佳实践:开发阶段保持DEBUG日志级别,生产环境调整为ERROR级别
最后的致谢
如果本文对您有帮助,请点赞👍、关注❤️、收藏⭐️。您的支持是我持续分享的动力!