全栈(PHP + Vue + MySQL)开发旅游管理系统教程(五)

简介: 教程来源本节详解旅游管理系统API接口测试全流程:含Postman环境配置、5个核心接口(注册/登录/线路/订单/列表)的功能与鉴权验证,覆盖测试用例设计、常见启动/跨域/CORS问题排查,及Nginx、Docker生产部署方案。

5.4 API接口测试详解
5.4.1 使用Postman测试接口
准备工作:

下载并安装Postman

创建新的Collection命名为“旅游管理系统”

创建环境变量:
image.png
接口1:用户注册

请求方法: POST
请求URL: {
  {base_url}}/user/register
请求头: Content-Type: application/json
请求体:
{
    "username": "testuser",
    "email": "test@example.com",
    "password": "123456",
    "name": "测试用户"
}

预期响应:
{
    "code": 201,
    "message": "注册成功",
    "data": {
        "user_id": 2,
        "username": "testuser",
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
    }
}

接口2:用户登录

请求方法: POST
请求URL: {
  {base_url}}/user/login
请求体:
{
    "username": "testuser",
    "password": "123456"
}

预期响应:
{
    "code": 200,
    "message": "登录成功",
    "data": {
        "user_id": 2,
        "username": "testuser",
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
    }
}

在Tests选项卡中添加自动设置token的脚本:

if (pm.response.code === 200 && pm.response.json().code === 200) {
    const token = pm.response.json().data.token;
    pm.environment.set("token", token);
}

接口3:获取旅游线路列表

请求方法: GET
请求URL: {
  {base_url}}/tours?page=1&limit=10
请求头: Authorization: Bearer {
  {token}}

参数说明:
- page: 页码,默认1
- limit: 每页数量,默认10
- keyword: 搜索关键词
- category_id: 分类ID筛选
- sort_by: 排序字段(price/view_count/sold_count/created_at)
- sort_order: 排序方向(asc/desc)

接口4:创建订单

请求方法: POST
请求URL: {
  {base_url}}/orders
请求头: 
  Authorization: Bearer {
  {token}}
  Content-Type: application/json
请求体:
{
    "tour_id": 1,
    "departure_date": "2024-06-15",
    "adult_count": 2,
    "child_count": 1,
    "contact_name": "张三",
    "contact_phone": "13800138000",
    "remark": "靠近窗户的座位"
}

接口5:获取订单列表

请求方法: GET
请求URL: {
  {base_url}}/orders?page=1&limit=10
请求头: Authorization: Bearer {
  {token}}

5.5 完整的功能测试流程
以下是完整的测试用例清单,建议按照此清单逐项测试:
image.png
image.png
image.png
image.png
image.png
5.6 常见问题与解决方案
5.6.1 后端启动问题
问题1:Composer安装失败

# 错误信息
Your requirements could not be resolved to an installable set of packages.

# 解决方案
# 更新Composer到最新版本
composer self-update

# 清除Composer缓存
composer clear-cache

# 重新安装
composer install

问题2:数据库连接失败

# 错误信息
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost'

# 解决方案
# 1. 检查.env文件中的数据库配置是否正确
# 2. 确认MySQL服务已启动
# 3. 确认数据库用户有权限访问

# 重置MySQL密码(Ubuntu)
sudo mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';
FLUSH PRIVILEGES;

问题3:端口被占用

# 错误信息
Failed to listen on 127.0.0.1:8000 (reason: Address already in use)

# 解决方案
# 方案1:使用其他端口
php artisan serve --port=8001

# 方案2:查找并关闭占用端口的进程
# Linux/macOS
lsof -i :8000
kill -9 PID

# Windows
netstat -ano | findstr :8000
taskkill /PID PID /F

问题4:JWT密钥未生成

https://bgnno.cn/

# 错误信息
The secret is not set in the configuration

# 解决方案
php artisan jwt:secret

# 如果仍然报错,手动在.env中添加
JWT_SECRET=your-64-character-random-string

5.6.2 前端启动问题
问题1:依赖安装失败

# 错误信息
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve

# 解决方案
# 删除node_modules和package-lock.json
rm -rf node_modules package-lock.json

# 清除npm缓存
npm cache clean --force

# 重新安装
npm install --legacy-peer-deps

问题2:跨域请求失败

// 浏览器控制台错误
Access to XMLHttpRequest at 'http://localhost:8000/api/tours' from origin 'http://localhost:5173' has been blocked by CORS policy

// 解决方案
// 1. 检查后端CORS配置是否正确
// 2. 检查Vite代理配置
// 3. 临时方案:使用浏览器插件禁用CORS(仅开发环境)

问题3:Vite代理配置不正确

// vite.config.js
export default {
    server: {
        proxy: {
            '/api': {
                target: 'http://localhost:8000',
                changeOrigin: true,
                rewrite: (path) => path.replace(/^\/api/, '')  // 必须正确配置
            }
        }
    }
}

5.7 部署到生产环境
5.7.1 后端部署
https://www.bgnno.cn/
步骤1:优化配置

# 设置生产环境
APP_ENV=production
APP_DEBUG=false

# 优化配置加载
php artisan config:cache

# 优化路由加载
php artisan route:cache

# 优化视图加载
php artisan view:cache

# 优化事件加载
php artisan event:cache

步骤2:使用Nginx + PHP-FPM部署

# /etc/nginx/sites-available/travel-api
server {
    listen 80;
    server_name api.travel.com;
    root /var/www/travel-api/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

5.7.2 前端部署
步骤1:构建生产版本

# 构建生产版本
npm run build

# 构建产物位于 dist/ 目录
# 包含经过压缩、优化的HTML、CSS、JS文件

步骤2:使用Nginx部署前端文件

# /etc/nginx/sites-available/travel-frontend
server {
    listen 80;
    server_name travel.com;
    root /var/www/travel-frontend/dist;

    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://localhost:8000/api/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

5.7.3 使用Docker部署
后端Dockerfile:

FROM php:8.1-fpm

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

# 安装PHP扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 设置工作目录
WORKDIR /var/www

# 复制项目文件
COPY . .

# 安装依赖
RUN composer install --no-dev --optimize-autoloader

# 设置权限
RUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache
RUN chmod -R 775 /var/www/storage /var/www/bootstrap/cache

EXPOSE 9000
CMD ["php-fpm"]

前端Dockerfile:

FROM node:18-alpine as builder

WORKDIR /app
COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

docker-compose.yml:

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: travel_db
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"

  backend:
    build: ./travel-api
    depends_on:
      - mysql
    environment:
      DB_HOST: mysql
      DB_PASSWORD: root123
    volumes:
      - ./travel-api:/var/www
    ports:
      - "9000:9000"

  frontend:
    build: ./travel-ui
    ports:
      - "80:80"
    depends_on:
      - backend

volumes:
  mysql_data:
相关文章
|
8天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
3461 20
|
20天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
18060 60
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
1天前
|
SQL 人工智能 弹性计算
阿里云发布 Agentic NDR,威胁检测与响应进入智能体时代
欢迎前往阿里云云防火墙控制台体验!
1158 2
|
4天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
1905 8
|
15天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
3175 29
|
3天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
1534 3
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
4天前
|
机器学习/深度学习 缓存 测试技术
DeepSeek-V4开源:百万上下文,Agent能力比肩顶级闭源模型
DeepSeek-V4正式开源!含V4-Pro(1.6T参数)与V4-Flash(284B参数)双版本,均支持百万token上下文。首创混合注意力架构,Agent能力、世界知识与推理性能全面领先开源模型,数学/代码评测比肩顶级闭源模型。
1744 6
|
5天前
|
人工智能 测试技术 API
阿里Qwen3.6-27B正式开源:网友直呼“太牛了”!
阿里云千问3.6系列重磅开源Qwen3.6-27B稠密大模型!官网:https://t.aliyun.com/U/JbblVp 仅270亿参数,编程能力媲美千亿模型,在SWE-bench等权威基准中表现卓越。支持多模态理解、本地部署及OpenClaw等智能体集成,已开放Hugging Face与ModelScope下载。