旅游业是国民经济的重要组成部分,随着人们生活水平的提高和互联网技术的发展,在线旅游预订已成为主流出游方式。一个功能完善的旅游管理系统,能够帮助旅行社高效管理旅游产品、订单和客户信息,提升运营效率和客户满意度。
本教程将采用前后端分离的架构,使用PHP(Laravel框架)作为后端语言,Vue 3作为前端框架,MySQL作为数据库,从零开始构建一个功能完整的旅游管理系统。
系统功能概述:
用户端功能:
用户注册、登录、JWT认证
旅游线路浏览、分类筛选、关键词搜索、线路详情
线路预订、订单管理
个人中心、收藏线路
管理端功能:
旅游线路管理(添加、编辑、删除、上下架)
订单管理(查看订单、确认订单、取消订单)
分类管理(添加、编辑、删除)
数据统计(订单统计、销售排行)
技术栈说明:
本教程将详细介绍旅游管理系统的完整开发流程,涵盖数据库设计、后端API开发、前端界面实现、项目部署等各个环节,每段代码都配有详细的注释说明。
第一部分:系统架构与数据库设计
1.1 系统架构图
┌─────────────────────────────────────────────────────────────────┐
│ 用户浏览器 │
│ (Chrome/Firefox/Safari) │
└─────────────────────────┬───────────────────────────────────────┘
│ HTTP/HTTPS
▼
┌─────────────────────────────────────────────────────────────────┐
│ Nginx / Apache │
│ (静态资源 + 反向代理) │
└─────────────────────────┬───────────────────────────────────────┘
│
┌─────────────┴─────────────┐
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────────────────────┐
│ 前端 (Vue 3) │ │ 后端 (Laravel) │
│ port: 5173 │──API─→│ + JWT认证 + 业务逻辑 │
└─────────────────────┘ │ port: 8000 │
└─────────────────┬───────────────────┘
│
▼
┌─────────────────────────────────────┐
│ MySQL 数据库 │
│ 用户表 | 线路表 | 订单表 | 分类表 │
└─────────────────────────────────────┘
1.2 API接口设计
在设计系统之前,先梳理所有需要的API接口:


1.3 数据库设计
1.3.1 创建数据库
-- 创建旅游管理系统数据库
CREATE DATABASE IF NOT EXISTS travel_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE travel_db;
1.3.2 用户表(users)
用户表存储系统所有用户信息,包括普通用户和管理员。密码使用Laravel的Hash门面进行加密存储,确保安全性。
CREATE TABLE `users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` VARCHAR(50) NOT NULL COMMENT '用户名,唯一',
`email` VARCHAR(100) NOT NULL COMMENT '邮箱,唯一',
`password` VARCHAR(255) NOT NULL COMMENT '密码,Hash加密',
`name` VARCHAR(50) COMMENT '真实姓名',
`phone` VARCHAR(20) COMMENT '手机号',
`avatar` VARCHAR(500) COMMENT '头像URL',
`role` ENUM('admin', 'user') NOT NULL DEFAULT 'user' COMMENT '角色:admin管理员 user普通用户',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`email_verified_at` TIMESTAMP NULL COMMENT '邮箱验证时间',
`remember_token` VARCHAR(100) NULL COMMENT '记住我令牌',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
UNIQUE KEY `uk_email` (`email`),
KEY `idx_role` (`role`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
1.3.3 旅游分类表(categories)
旅游分类表支持多级分类,可以按国内游、出境游、周边游等维度组织线路。
CREATE TABLE `categories` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`parent_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父分类ID',
`name` VARCHAR(50) NOT NULL COMMENT '分类名称',
`slug` VARCHAR(50) NOT NULL COMMENT '分类别名,用于URL',
`description` VARCHAR(255) COMMENT '分类描述',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序序号',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_slug` (`slug`),
KEY `idx_parent_id` (`parent_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='旅游分类表';
1.3.4 旅游线路表(tours)
旅游线路表是系统的核心,存储所有旅游产品的详细信息。
CREATE TABLE `tours` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '线路ID',
`category_id` BIGINT UNSIGNED NOT NULL COMMENT '分类ID',
`name` VARCHAR(200) NOT NULL COMMENT '线路名称',
`slug` VARCHAR(200) NOT NULL COMMENT '线路别名,用于SEO',
`subtitle` VARCHAR(500) COMMENT '副标题',
`days` INT NOT NULL DEFAULT 1 COMMENT '行程天数',
`price` DECIMAL(10,2) NOT NULL COMMENT '成人价格',
`child_price` DECIMAL(10,2) DEFAULT 0 COMMENT '儿童价格',
`stock` INT NOT NULL DEFAULT 0 COMMENT '可预订数量',
`sold_count` INT NOT NULL DEFAULT 0 COMMENT '已售数量',
`main_image` VARCHAR(500) COMMENT '主图URL',
`images` TEXT COMMENT '多图展示,JSON格式',
`departure_city` VARCHAR(50) COMMENT '出发城市',
`destination_city` VARCHAR(50) COMMENT '目的地城市',
`transport` VARCHAR(50) COMMENT '交通工具(飞机/高铁/大巴)',
`accommodation` VARCHAR(50) COMMENT '住宿标准(三星/四星/五星)',
`meal_plan` VARCHAR(100) COMMENT '餐食安排',
`itinerary` LONGTEXT COMMENT '行程安排(富文本)',
`description` TEXT COMMENT '线路简介',
`features` TEXT COMMENT '线路特色',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0下架 1上架',
`is_featured` TINYINT NOT NULL DEFAULT 0 COMMENT '是否推荐:0否 1是',
`view_count` INT NOT NULL DEFAULT 0 COMMENT '浏览次数',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_slug` (`slug`),
KEY `idx_category_id` (`category_id`),
KEY `idx_status` (`status`),
KEY `idx_price` (`price`),
KEY `idx_is_featured` (`is_featured`),
KEY `idx_departure_city` (`departure_city`),
FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='旅游线路表';
1.3.4 订单表(orders)
订单表存储用户预订旅游线路的订单信息,记录预订状态和支付情况。
CREATE TABLE `orders` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号(唯一)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`tour_id` BIGINT UNSIGNED NOT NULL COMMENT '旅游线路ID',
`tour_name` VARCHAR(200) NOT NULL COMMENT '线路名称(快照)',
`tour_price` DECIMAL(10,2) NOT NULL COMMENT '线路单价(快照)',
`departure_date` DATE NOT NULL COMMENT '出发日期',
`adult_count` INT NOT NULL DEFAULT 1 COMMENT '成人数量',
`child_count` INT NOT NULL DEFAULT 0 COMMENT '儿童数量',
`total_amount` DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
`contact_name` VARCHAR(50) NOT NULL COMMENT '联系人姓名',
`contact_phone` VARCHAR(20) NOT NULL COMMENT '联系人电话',
`contact_email` VARCHAR(100) COMMENT '联系人邮箱',
`remark` VARCHAR(500) COMMENT '订单备注',
`order_status` TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态:0待确认 1已确认 2已取消 3已完成',
`payment_status` TINYINT NOT NULL DEFAULT 0 COMMENT '支付状态:0未支付 1已支付',
`payment_time` TIMESTAMP NULL COMMENT '支付时间',
`confirm_time` TIMESTAMP NULL COMMENT '确认时间',
`cancel_time` TIMESTAMP NULL COMMENT '取消时间',
`complete_time` TIMESTAMP NULL COMMENT '完成时间',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_tour_id` (`tour_id`),
KEY `idx_order_status` (`order_status`),
KEY `idx_departure_date` (`departure_date`),
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`tour_id`) REFERENCES `tours`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
1.3.6 收藏表(favorites)
收藏表记录用户收藏的旅游线路,方便用户快速找到感兴趣的线路。
CREATE TABLE `favorites` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
`tour_id` BIGINT UNSIGNED NOT NULL COMMENT '线路ID',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_tour` (`user_id`, `tour_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_tour_id` (`tour_id`),
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE,
FOREIGN KEY (`tour_id`) REFERENCES `tours`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='收藏表';
1.3.7 插入初始化数据
j-- 插入管理员账户(密码:admin123)
-- 注意:实际使用时Laravel会自动加密密码
INSERT INTO `users` (`username`, `email`, `password`, `name`, `role`) VALUES
('admin', 'admin@travel.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '系统管理员', 'admin');
-- 插入测试用户(密码:123456)
INSERT INTO `users` (`username`, `email`, `password`, `name`, `phone`, `role`) VALUES
('test', 'test@travel.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '测试用户', '13800138000', 'user');
-- 插入旅游分类数据
INSERT INTO `categories` (`name`, `slug`, `sort_order`) VALUES
('国内游', 'domestic', 1),
('出境游', 'abroad', 2),
('周边游', 'suburb', 3),
('亲子游', 'family', 4),
('蜜月游', 'honeymoon', 5);
-- 插入旅游线路数据
INSERT INTO `tours` (`category_id`, `name`, `slug`, `days`, `price`, `stock`, `departure_city`, `destination_city`, `transport`, `accommodation`, `description`) VALUES
(1, '云南昆明-大理-丽江6日游', 'yunnan-6days', 6, 3280.00, 50, '全国各地', '云南', '飞机+高铁', '四星级酒店', '体验云南少数民族风情,游览玉龙雪山、洱海、丽江古城'),
(1, '海南三亚5日海滨度假', 'sanya-5days', 5, 2680.00, 80, '全国各地', '三亚', '飞机', '海边度假酒店', '阳光沙滩,海鲜大餐,蜈支洲岛潜水'),
(2, '日本东京-大阪6日游', 'japan-6days', 6, 6880.00, 30, '上海/北京', '东京、大阪', '飞机', '四星级酒店', '游览富士山、迪士尼乐园、心斋桥购物'),
(3, '长沙周边2日游', 'changsha-2days', 2, 598.00, 100, '长沙', '张家界', '大巴', '舒适型酒店', '玻璃桥、天门山、凤凰古城夜游');