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

简介: 教程来源 http://unbgv.cn 本教程基于Laravel+Vue3+MySQL,从零构建前后端分离的旅游管理系统,涵盖用户/管理双端功能、JWT认证、多级分类、线路预订、订单统计等核心模块,并详解数据库设计与全栈开发流程。

旅游业是国民经济的重要组成部分,随着人们生活水平的提高和互联网技术的发展,在线旅游预订已成为主流出游方式。一个功能完善的旅游管理系统,能够帮助旅行社高效管理旅游产品、订单和客户信息,提升运营效率和客户满意度。

本教程将采用前后端分离的架构,使用PHP(Laravel框架)作为后端语言,Vue 3作为前端框架,MySQL作为数据库,从零开始构建一个功能完整的旅游管理系统。

系统功能概述:

用户端功能:

用户注册、登录、JWT认证

旅游线路浏览、分类筛选、关键词搜索、线路详情

线路预订、订单管理

个人中心、收藏线路

管理端功能:

旅游线路管理(添加、编辑、删除、上下架)

订单管理(查看订单、确认订单、取消订单)

分类管理(添加、编辑、删除)

数据统计(订单统计、销售排行)

技术栈说明:
image.png
本教程将详细介绍旅游管理系统的完整开发流程,涵盖数据库设计、后端API开发、前端界面实现、项目部署等各个环节,每段代码都配有详细的注释说明。

第一部分:系统架构与数据库设计

1.1 系统架构图

┌─────────────────────────────────────────────────────────────────┐
│                         用户浏览器                              │
│                   (Chrome/Firefox/Safari)                       │
└─────────────────────────┬───────────────────────────────────────┘
                          │ HTTP/HTTPS
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                      Nginx / Apache                             │
│                      (静态资源 + 反向代理)                        │
└─────────────────────────┬───────────────────────────────────────┘
                          │
            ┌─────────────┴─────────────┐
            │                           │
            ▼                           ▼
┌─────────────────────┐     ┌─────────────────────────────────────┐
│   前端 (Vue 3)       │     │         后端 (Laravel)              │
│   port: 5173        │──API─→│   + JWT认证 + 业务逻辑              │
└─────────────────────┘     │   port: 8000                        │
                            └─────────────────┬───────────────────┘
                                              │
                                              ▼
                            ┌─────────────────────────────────────┐
                            │            MySQL 数据库              │
                            │   用户表 | 线路表 | 订单表 | 分类表    │
                            └─────────────────────────────────────┘

1.2 API接口设计
在设计系统之前,先梳理所有需要的API接口:
image.png
image.png
image.png
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, '长沙', '张家界', '大巴', '舒适型酒店', '玻璃桥、天门山、凤凰古城夜游');

来源:
http://htnus.cn

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