全栈(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:
相关文章
|
4天前
|
SQL 运维 安全
初级程序员必备的十大技能之数据库基础(四)
教程来源 http://xgmoi.cn/ 本节聚焦MySQL性能优化与安全运维:通过慢查询日志定位瓶颈,结合SQL写法优化(如避免SELECT*、善用EXPLAIN)、索引与分区设计提升查询效率;同时涵盖权限管控、mysqldump备份恢复及自动化策略,兼顾性能与可靠性。
|
人工智能 运维 关系型数据库
智能运维+多模型服务能力,阿里云 RDS AI 助手旗舰版正式上线!
RDS AI 助手旗舰版在 RDS AI 助手专业版智能运维能力的基础上,提供灵活模型选择、智能模型路由、多模型灾备、API Key 集成等更自主可控、灵活便捷的模型服务,并支持纳管运维各类环境部署的数据库。
智能运维+多模型服务能力,阿里云 RDS AI 助手旗舰版正式上线!
|
1天前
|
人工智能 自然语言处理 API
阿里云百炼Token Plan订阅方案:支持多模型灵活切换,兼容主流AI工具,多档位套餐,包月预算可控
阿里云百炼Token Plan团队版是面向企业及开发者的多模态AI订阅服务,采用Credits统一计量,支持Qwen3.6、Wan2.7、GLM-5、DeepSeek-V4、Kimi K2.6等十余款主流模型,兼容Qwen Code、Claude Code、OpenClaw等热门AI工具。提供标准版(198/月)、高级版(698/月)、尊享版(1,398/月)三档坐席,配套共享用量包(5,000/62.5万Credits)供弹性补额。计费按Token实际消耗抵扣,无频次限制,承诺不使用用户数据训练模型,多租户隔离保障稳定运行,适用于团队协作、开发办公等场景。
|
9天前
|
SQL 机器学习/深度学习 自然语言处理
从单模态到多模态:一文看懂智能问数平台如何“读懂”你的表格、文本和图
截至2026年5月,智能问数平台对表格、文本、图等多模态数据的处理已形成四类技术路线:预制SQL、Text2SQL+宽表、预制指标平台及本体语义层。后者在跨模态融合、泛化能力与准确率(闭卷95%+、开卷100%)上优势显著,但需前期语义治理投入;前三者适用固定场景,维护成本随业务扩张呈指数增长。选型关键不在技术优劣,而在匹配组织的数据复杂度、业务变化频率与治理能力。
|
9天前
|
人工智能 运维 安全
Windows10用户部署OpenClaw的终极指南|路径规范+权限配置+故障排查
专为Windows 10 64位深度优化的OpenClaw(小龙虾)一键部署包:免命令行、免环境配置,解压即装;内置全部依赖与28万Tokens,全程可视化操作;独家解决SmartScreen拦截、权限限制等Win10特有问题,新手也能一次成功“养虾”!
|
11天前
|
人工智能 运维 前端开发
给 Hermes 装上显微镜:Agent 执行全知道
阿里云 Hermes 可观测插件基于 OpenTelemetry,追踪 Agent 推理、工具调用、Token 消耗、时延与安全风险,帮助定位成本高、响应慢、工具异常等问题。
|
8天前
|
人工智能 API Go
Token 到底是什么?搞懂这个“AI 最小货币单位”,省钱又省心
纯干货,用“乐高积木”比喻,3分钟讲透AI核心概念——Token:它是什么、怎么拆、为何影响输入长度、API费用和AI记忆力。附4个实测省钱技巧,助你省30%以上成本,轻松处理长文本。
|
11天前
|
人工智能 自然语言处理 API
阿里云百炼Token Plan团队版产品与收费标准介绍:标准版198元、高级版698元,尊享版1398元
阿里云百炼Token Plan团队版是面向企业和开发者的多模态AI大模型订阅服务,以Credits为统一计量单位,支持文本生成与图像生成模型灵活切换,兼容主流AI编程与智能体工具。提供标准、高级、尊享三档包月套餐,多租户隔离确保高峰不排队,并承诺不使用对话数据训练模型,保障数据安全。超出套餐额度可购买共享用量包,消费可通过控制台和费用中心实时监控。适用于AI编程集成、智能体开发等场景。配合Qwen3.6发布低至4.5折优惠及先用后返最高200元活动,可助力用户灵活控制AI预算。
|
11天前
|
弹性计算 编解码 安全
阿里云服务器2核4G最新租用价格:可选实例、收费标准和最新活动价格
2026年阿里云2核4G配置服务器的价格参考:目前,轻量应用服务器2核4G(200M带宽、50G云盘)新用户月付仅9.9元,年付199元;通用算力型u1实例2核4G(5M独享带宽、80G云盘)企业新老用户同享199元/年。文章详细对比了经济型e实例、u1/u2a/u2i、c9i/c9a等多款实例规格的性能特点与适用场景,涵盖按量付费及包年包月定价,用户可根据建站、企业后端、计算密集型等不同需求灵活选择,借助活动价格可大幅降低上云成本。
|
13天前
|
存储 缓存 关系型数据库
【MySQL】MySQL存储引擎:InnoDB vs MyISAM 核心区别、适用场景
本文系统剖析InnoDB与MyISAM两大MySQL存储引擎,涵盖定位、特性对比、底层原理、适用场景、选型决策及最佳实践六大维度,深度解读事务支持、锁机制、MVCC、索引架构、崩溃恢复等核心差异,助力面试、开发与运维高效决策。