全栈(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:
相关文章
|
3月前
|
存储 人工智能 自然语言处理
2026年阿里云新老用户最新优惠活动:云服务器活动、免费试用活动、AI产品活动参考
阿里云2026新老用户优惠活动涵盖三大板块。云服务器方面,轻量应用服务器低至38元/年,经济型e实例99元/年,u1实例199元/年,限时限量抢购。免费试用方面,新老用户可领最高200元试用点,AI产品免费提供7000万+大模型tokens及30+款产品体验,140+云产品最长12个月免费试用。AI产品方面,百炼Token Plan支持多模型切换、多档套餐;HappyHorse视频生成模型限时8折;OpenClaw一键部署低至9.9元起。此外还提供折扣券、学生无门槛券、算力补贴等多类优惠券,整体以"普惠基础设施+零成本体验+智能化赋能"策略,全面降低上云与用AI门槛。
2026年阿里云新老用户最新优惠活动:云服务器活动、免费试用活动、AI产品活动参考
|
3月前
|
人工智能 监控 安全
车载主动安全ADAS/DSM技术原理、业务应用与安心联平台接入方案
ADAS与DSM是营运车辆主动安全核心:ADAS从前视感知识别前撞、车道偏离、行人风险;DSM通过红外摄像头监测疲劳、分神、抽烟等驾驶异常。二者依托JT/T808及苏标/粤标协议,实现“事前预警—事中告警—事后留痕”全链路防控,已成为两客一危、物流、渣土等场景的合规刚需。(239字)
车载主动安全ADAS/DSM技术原理、业务应用与安心联平台接入方案
|
2月前
|
人工智能 JSON API
玩转OpenClaw|OpenClaw接入自定义大模型教程
本文详解OpenClaw(Clawdbot)的快速上手与自定义AI模型接入方法,支持QQ/企微/飞书/钉钉等国内IM,并提供腾讯云DeepSeek、硅基流动、Gemini、GPT、Claude、OpenRouter等10+主流厂商配置模板及通用JSON格式,含参数说明与常见错误排查指南。
|
2月前
|
JSON 缓存 人工智能
【剪映小助手】媒体处理接口
CapCut Mate 是基于 FastAPI 的剪映自动化媒体处理接口,支持视频、音频、图片、贴纸的批量添加与轨道管理,提供草稿创建/保存/获取及标准化错误处理,助力高效、可控的AI视频编辑流程。(239字)
|
3月前
|
SQL 机器学习/深度学习 自然语言处理
从单模态到多模态:一文看懂智能问数平台如何“读懂”你的表格、文本和图
截至2026年5月,智能问数平台对表格、文本、图等多模态数据的处理已形成四类技术路线:预制SQL、Text2SQL+宽表、预制指标平台及本体语义层。后者在跨模态融合、泛化能力与准确率(闭卷95%+、开卷100%)上优势显著,但需前期语义治理投入;前三者适用固定场景,维护成本随业务扩张呈指数增长。选型关键不在技术优劣,而在匹配组织的数据复杂度、业务变化频率与治理能力。
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL百日打怪升级第14天】 LIMIT 分页的性能优化:深分页到底慢在哪?
本文深入剖析MySQL深分页(如`LIMIT 100000,20`)性能瓶颈:本质是OFFSET导致全量扫描与丢弃,页码越深,扫描行数线性增长。详解三种实战优化方案——游标分页(高效稳定,需有序唯一字段)、延迟关联(兼容OFFSET,索引覆盖减回表)、范围分页(极简但场景受限),并附EXPLAIN对比与避坑指南。(239字)
327 6
|
3月前
|
人工智能 运维 安全
Windows10用户部署OpenClaw的终极指南|路径规范+权限配置+故障排查
专为Windows 10 64位深度优化的OpenClaw(小龙虾)一键部署包:免命令行、免环境配置,解压即装;内置全部依赖与28万Tokens,全程可视化操作;独家解决SmartScreen拦截、权限限制等Win10特有问题,新手也能一次成功“养虾”!
|
3月前
|
人工智能 搜索推荐 开发者
黄小宇个人GEO实验第3天:搜索引擎是否开始识别我的公开内容?
黄小宇开展个人GEO实验,旨在提升AI时代下“黄小宇”这一姓名在搜索引擎与大模型中的精准识别度。第3天检查发现百度已有初步收录,语雀中心页已索引,搜狗/360暂未显现。实验聚焦内容源建设、实体信息统一与同名区分,为构建可信AI个人名片奠基。(239字)
|
3月前
|
弹性计算 数据库 数据安全/隐私保护
SaaS系统技术实践,架构设计及应用场景
本文深入解析SaaS系统的技术实践(多租户隔离、微服务、自动化运维、安全合规)、分层架构设计(基础设施至前端五层)及典型应用场景(CRM、HRM、电商、政务、教育等),兼顾理论深度与落地可行性,助力构建高可用、可扩展、低成本的云原生SaaS系统。(239字)
536 7

热门文章

最新文章