当前位置:首页 > 技术 > 正文内容

基于Spring Boot与MyBatis-Plus的航空订票系统架构设计与实现

访客 技术 2026年6月7日 1

系统架构概述

航空客运订票系统旨在为旅客提供便捷的航班查询、机票预订及订单管理服务,同时为管理员提供后台数据维护功能。本系统采用前后端分离架构,后端基于Spring Boot框架构建RESTful API,结合MyBatis-Plus简化持久层操作,并使用MySQL作为核心关系型数据库,确保系统在高并发场景下的数据一致性与响应速度。

核心技术栈解析

Spring Boot 框架

Spring Boot 是一种用于简化 Spring 应用程序初始搭建与开发过程的框架。它通过"约定优于配置"的核心理念,大幅减少了传统 Spring 项目中繁琐的 XML 配置文件。该框架内置了 Tomcat、Jetty 等 Servlet 容器,使得应用能够以独立 Jar 包的形式直接运行,无需依赖外部 Web 服务器。此外,其提供的 Starter 依赖管理机制和自动装配特性,使得开发者能够以极低的成本集成各类主流中间件与第三方组件,专注于核心业务逻辑的实现。

MySQL 数据库

MySQL 是一款成熟且广泛应用的开源关系型数据库管理系统。在航空订票系统中,其 InnoDB 存储引擎提供了对 ACID 事务的完整支持以及行级锁机制,这对于处理机票库存扣减、订单支付等并发要求极高的业务场景至关重要。MySQL 具备优异的查询优化器和索引机制,能够保障海量航班数据与用户订单数据的高效检索与持久化存储。

系统核心功能展示

以下为系统前端部分核心业务模块的界面展示,包含航班信息检索与用户后台管理视图:

航班信息检索界面 后台管理数据视图

核心业务代码实现

用户服务层实现

在业务逻辑层,通过继承 MyBatis-Plus 的 ServiceImpl 快速获得基础 CRUD 能力,并利用 LambdaQueryWrapper 构建类型安全的条件查询,优化了传统的分页与列表检索逻辑。

package com.flight.booking.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.flight.booking.entity.SysAccount;
import com.flight.booking.mapper.SysAccountMapper;
import com.flight.booking.service.ISysAccountService;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class SysAccountServiceImpl extends ServiceImpl<SysAccountMapper, SysAccount> implements ISysAccountService {

    @Override
    public IPage<SysAccount> fetchPagedAccounts(Map<String, Object> queryParams) {
        int currentPage = (int) queryParams.getOrDefault("current", 1);
        int pageSize = (int) queryParams.getOrDefault("size", 10);
        
        Page<SysAccount> pageParam = new Page<>(currentPage, pageSize);
        LambdaQueryWrapper<SysAccount> queryWrapper = new LambdaQueryWrapper<>();
        
        return this.page(pageParam, queryWrapper);
    }
}

Web拦截器与静态资源配置

在 Web 配置层,摒弃了覆盖默认配置的 WebMvcConfigurationSupport,转而实现 WebMvcConfigurer 接口。通过依赖注入的方式配置 JWT 鉴权拦截器,并重新映射静态资源的访问路径,以适配前后端分离部署或特定的前端资源目录结构。

package com.flight.booking.config;

import com.flight.booking.interceptor.JwtAuthInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private final JwtAuthInterceptor jwtAuthInterceptor;

    public WebMvcConfig(JwtAuthInterceptor jwtAuthInterceptor) {
        this.jwtAuthInterceptor = jwtAuthInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtAuthInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/auth/login", "/api/auth/register");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/assets/**")
                .addResourceLocations("classpath:/static/assets/")
                .addResourceLocations("classpath:/public/uploads/");
    }
}

数据库持久层设计

系统采用独立的令牌表来管理用户的登录状态与鉴权信息。通过优化字段命名规范、引入 InnoDB 引擎并添加必要的索引,提升了令牌校验与过期清理的执行效率。

DROP TABLE IF EXISTS `sys_auth_token`;
CREATE TABLE `sys_auth_token` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint(20) NOT NULL COMMENT '关联用户ID',
  `user_name` varchar(64) NOT NULL COMMENT '登录账号',
  `target_table` varchar(64) DEFAULT NULL COMMENT '关联业务表',
  `role_code` varchar(32) DEFAULT NULL COMMENT '角色标识',
  `auth_token` varchar(255) NOT NULL COMMENT '鉴权令牌',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `expire_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '失效时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_auth_token` (`auth_token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统鉴权令牌表';

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。