5.4 API接口测试详解
5.4.1 使用Postman测试接口
准备工作:
下载并安装Postman
创建新的Collection命名为“旅游管理系统”
创建环境变量:
接口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 完整的功能测试流程
以下是完整的测试用例清单,建议按照此清单逐项测试:




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密钥未生成
# 错误信息
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: