苍穹外卖Day3

🌟 苍穹外卖项目实战:从数据库到接口的全链路问题解决指南

本文记录了苍穹外卖项目开发过程中遇到的关键问题及解决方案,涵盖数据库连接、接口测试、全局参数传递、服务器配置等核心环节,助你快速定位并解决类似问题!


🚀 一、数据库连接问题:1045访问拒绝

问题描述

log 复制代码
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 28000

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

✅ 解决方案

  1. 检查MySQL服务状态

    bash 复制代码
    # 管理员命令行
    net start mysql
  2. 验证登录凭据

    bash 复制代码
    mysql -u root -p
    # 输入密码验证
  3. 修正配置文件

    • 检查application.yml中的数据库密码
    • 确保用户名/密码正确(通常为root/123456
  4. 权限检查(备用)

    sql 复制代码
    -- 查看用户权限
    SHOW GRANTS FOR 'root'@'localhost';
    
    -- 授权全局权限(谨慎使用)
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
  5. IDEA内嵌数据库(可视化操作)

    • Database面板 > New > Data Source > MySQL
    • 直接创建表结构和测试数据

🔐 二、接口测试401未授权问题

问题现象

在接口文档测试新增员工功能时,返回响应码401

✅ 解决方案

  1. 定位拦截器

    • 检查JwtTokenAdminInterceptor等拦截器
    java 复制代码
    public class JwtTokenAdminInterceptor implements HandlerInterceptor {
        // 令牌校验逻辑
    }
  2. 获取有效Token

    • 通过管理员登录接口获取Token
    • 在Swagger/Knife4j文档中测试登录接口
  3. 添加全局参数

    • 在接口文档中添加Header参数

      参数名称: token
      参数值: eyJhbGciOiJIUzI1NiJ9...(登录返回的Token)

  4. 调试技巧

    • ALT + F8:查看变量值
    • Ctrl + F5:强制刷新
    • Ctrl + 左键单击:跳转到定义

📡 三、全局参数Token接收失败问题

问题现象

接口文档设置了全局参数,但代码中无法获取Token值

✅ 解决方案

  1. 添加调试日志

    java 复制代码
    // 在拦截器中添加日志输出
    log.info("接收到的Token: {}", token);
  2. 设置断点调试

    • 在日志输出行设置断点
    • 调试模式启动项目
  3. 检查参数名称一致性

    yaml 复制代码
    # application.yml
    sky:
      jwt:
        admin-token-name: token  # 确保与接口文档一致
  4. 多途径获取Token

    java 复制代码
    // 优先从Header获取,其次从参数获取
    String token = request.getHeader(tokenName);
    if(token == null) {
        token = request.getParameter(tokenName);
    }

⚠️ 四、IIS与Nginx端口冲突问题

背景知识

  • IIS:微软Windows系统的Web服务器,默认占用80端口
  • Nginx:高性能HTTP和反向代理服务器

✅ 解决方案

  1. 停止IIS服务

    bash 复制代码
    net stop was /y
    net stop w3svc
  2. 清除HTTP.sys注册

    bash 复制代码
    netsh http delete urlacl url=http://+:80/
  3. 重启Nginx

    bash 复制代码
    cd F:\project\cangqiong\code\day01\nginx-1.20.2
    taskkill /IM nginx.exe /F
    start nginx
  4. 验证端口占用

    bash 复制代码
    netstat -ano | findstr :80

🛠️ 五、SQL异常:唯一键冲突

问题描述

log 复制代码
### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: 
Duplicate entry 'zhangsan' for key 'idx_username'

✅ 解决方案


  1. 添加在全局异常处理器
java 复制代码
 @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("未知错误");
  }
}

注解一定要加


💡 项目经验总结

  1. 数据库连接问题:80%的数据库访问错误源于配置错误
  2. 接口安全设计:JWT拦截器是保护API的第一道防线
  3. 端口冲突:生产环境推荐使用Nginx反向代理解决端口复用
  4. 异常处理:全局异常处理器能极大提升系统健壮性
  5. 调试技巧
    • 合理使用日志级别(DEBUG/INFO/ERROR)
    • 善用IDE的断点调试功能
    • 接口文档与代码保持同步更新

最佳实践:开发阶段保持DEBUG日志级别,生产环境调整为ERROR级别


最后的致谢

如果本文对您有帮助,请点赞👍、关注❤️、收藏⭐️。您的支持是我持续分享的动力!