C#实现航班预订系统

C#实现航班预订系统完整攻略

目录

简介

航班预订系统是指通过计算机网络,提供适当的航班信息和相应的预订服务,让用户能够方便地进行航班查询和预订。在本文中,我们将使用C#语言实现一个简单的航班预订系统。

基本功能

这个航班预订系统具有以下基本功能:

  1. 用户可以以一种用户友好的方式查询航班信息。
  2. 用户可以选择要预订的航班,并进行预订。
  3. 用户可以查看预订的历史记录。
  4. 管理员可以管理航班信息和预订记录。

技术栈

本文中,我们将使用以下技术来实现这个航班预订系统:

  • C#编程语言
  • .NET框架(包括.NET Core和.NET Framework)
  • ASP.NET Core和ASP.NET MVC框架
  • Entity Framework Core
  • SQL Server数据库

实现步骤

下面是实现这个航班预订系统的详细步骤。

步骤1:创建数据库

我们需要创建一个数据库,用于保存航班信息和预订记录。我们可以使用SQL Server管理工具进行创建。下面是一个简单的SQL语句,为您展示如何创建一个名为“FlightBooking”的数据库。

CREATE DATABASE FlightBooking;

步骤2:创建数据表

我们需要创建两个数据表,一个用于保存航班信息,另一个用于保存预订记录。下面是这两个表的结构。

航班表(Flight)

列名 数据类型 说明
ID int 航班ID
FlightNumber varchar(50) 航班号
FromCity varchar(50) 始发城市
ToCity varchar(50) 目的地城市
DepartureTime datetime 出发时间
ArrivalTime datetime 到达时间
Duration int 飞行时长
Price decimal 价格
CREATE TABLE Flight (
  ID int PRIMARY KEY,
  FlightNumber varchar(50) NOT NULL,
  FromCity varchar(50) NOT NULL,
  ToCity varchar(50) NOT NULL,
  DepartureTime datetime NOT NULL,
  ArrivalTime datetime NOT NULL,
  Duration int NOT NULL,
  Price decimal NOT NULL
);

预订记录表(Booking)

列名 数据类型 说明
ID int 记录ID
FlightID int 航班ID
PassengerName varchar(50) 乘客姓名
BookedSeats int 预订的座位数
BookingTime datetime 预订时间
CREATE TABLE Booking (
  ID int PRIMARY KEY,
  FlightID int NOT NULL,
  PassengerName varchar(50) NOT NULL,
  BookedSeats int NOT NULL,
  BookingTime datetime NOT NULL,
  FOREIGN KEY (FlightID) REFERENCES Flight (ID)
);

步骤3:创建C#项目

我们可以使用Visual Studio来创建一个ASP.NET Core Web应用程序项目。在创建项目时,请选择MVC项目模板。这将创建一个带有控制器,视图和模型的项目。

步骤4:实现模型

我们需要实现两个模型:Flight和Booking。这些模型将映射到上面创建的Flight和Booking表。

public class Flight
{
    public int ID { get; set; }
    public string FlightNumber { get; set; }
    public string FromCity { get; set; }
    public string ToCity { get; set; }
    public DateTime DepartureTime { get; set; }
    public DateTime ArrivalTime { get; set; }
    public int Duration { get; set; }
    public decimal Price { get; set; }
}

public class Booking
{
    public int ID { get; set; }
    public int FlightID { get; set; }
    public string PassengerName { get; set; }
    public int BookedSeats { get; set; }
    public DateTime BookingTime { get; set; }
}

步骤5:实现数据访问

我们可以使用Entity Framework Core来访问我们的数据库。我们需要实现一个DbContext,以及一个带有增删改查功能的FlightBookingRepository。

public class FlightBookingDbContext : DbContext
{
    public FlightBookingDbContext(DbContextOptions<FlightBookingDbContext> options)
        : base(options)
    {
    }

    public DbSet<Flight> Flights { get; set; }
    public DbSet<Booking> Bookings { get; set; }
}

public class FlightBookingRepository
{
    private readonly FlightBookingDbContext _dbContext;

    public FlightBookingRepository(FlightBookingDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public async Task<List<Flight>> GetFlightsAsync()
    {
        return await _dbContext.Flights.ToListAsync();
    }

    public async Task<Flight> GetFlightAsync(int id)
    {
        return await _dbContext.Flights.FindAsync(id);
    }

    public async Task<int> BookFlightAsync(int flightId, string passengerName, int bookedSeats)
    {
        var flight = await _dbContext.Flights.FindAsync(flightId);

        if (flight == null)
        {
            return -1; // invalid flight id
        }

        if (bookedSeats > 20 || flight.BookedSeats + bookedSeats > 20)
        {
            return -2; // too many seats
        }

        flight.BookedSeats += bookedSeats;

        var booking = new Booking
        {
            FlightID = flightId,
            PassengerName = passengerName,
            BookedSeats = bookedSeats,
            BookingTime = DateTime.Now
        };

        _dbContext.Bookings.Add(booking);

        await _dbContext.SaveChangesAsync();

        return booking.ID;
    }

    public async Task<List<Booking>> GetBookingsAsync()
    {
        return await _dbContext.Bookings.Include(b => b.Flight).ToListAsync();
    }

    public async Task<List<Booking>> GetBookingsForFlightAsync(int flightId)
    {
        return await _dbContext.Bookings.Include(b => b.Flight).Where(b => b.FlightID == flightId).ToListAsync();
    }
}

步骤6:实现控制器

我们需要实现两个控制器:FlightsController和BookingsController。这些控制器将处理用户请求,并将它们传递给相应的服务(即FlightBookingRepository),以供处理。

public class FlightsController : Controller
{
    private readonly FlightBookingRepository _repository;

    public FlightsController(FlightBookingRepository repository)
    {
        _repository = repository;
    }

    public async Task<IActionResult> Index()
    {
        var flights = await _repository.GetFlightsAsync();

        return View(flights);
    }

    public async Task<IActionResult> Book(int id)
    {
        var flight = await _repository.GetFlightAsync(id);

        if (flight == null)
        {
            return NotFound();
        }

        return View(flight);
    }

    [HttpPost]
    public async Task<IActionResult> Book(int flightId, string passengerName, int bookedSeats)
    {
        var result = await _repository.BookFlightAsync(flightId, passengerName, bookedSeats);

        if (result == -1)
        {
            ModelState.AddModelError("", "Invalid flight ID.");
        }
        else if (result == -2)
        {
            ModelState.AddModelError("", "Too many seats.");
        }

        if (!ModelState.IsValid)
        {
            var flight = await _repository.GetFlightAsync(flightId);

            if (flight == null)
            {
                return NotFound();
            }

            return View(flight);
        }

        return RedirectToAction("Index");
    }
}

public class BookingsController : Controller
{
    private readonly FlightBookingRepository _repository;

    public BookingsController(FlightBookingRepository repository)
    {
        _repository = repository;
    }

    public async Task<IActionResult> Index()
    {
        var bookings = await _repository.GetBookingsAsync();

        return View(bookings);
    }

    public async Task<IActionResult> Detail(int flightId)
    {
        var bookings = await _repository.GetBookingsForFlightAsync(flightId);

        return View(bookings);
    }
}

步骤7:实现视图

我们需要实现一些视图,以展示查询航班信息和预订记录的界面。下面是一些示例视图。

主页(Index.cshtml)

@model List<Flight>

@foreach (var flight in Model)
{
    <div>
        <a href="@Url.Action("Book", new { id = flight.ID })">@flight.FlightNumber</a> 
        from @flight.FromCity to @flight.ToCity
        on @flight.DepartureTime.ToShortDateString() @flight.DepartureTime.ToShortTimeString()
        for @flight.Duration minutes
        $@flight.Price per seat
        (booked seats: @flight.BookedSeats)
    </div>
}

预订页(Book.cshtml)

@model Flight

<h2>@Model.FlightNumber from @Model.FromCity to @Model.ToCity</h2>

<form method="post">
    <div>
        <label for="passengerName">Name:</label>
        <input type="text" id="passengerName" name="passengerName" />
    </div>
    <div>
        <label for="bookedSeats">Seats:</label>
        <input type="number" id="bookedSeats" name="bookedSeats" min="1" max="20" />
    </div>
    <button type="submit">Submit</button>
</form>

<div>
    <a href="@Url.Action("Index")">Back to list</a>
</div>

预订记录页(Index.cshtml)

@model List<Booking>

@foreach (var booking in Model)
{
    <div>
        <a href="@Url.Action("Detail", new { flightId = booking.FlightID })">@booking.PassengerName</a>
        booked @booking.BookedSeats seats on
        @booking.Flight.FlightNumber
        (from @booking.Flight.FromCity to @booking.Flight.ToCity on @booking.Flight.DepartureTime.ToShortDateString())
        at @booking.BookingTime.ToShortDateString() @booking.BookingTime.ToShortTimeString()
    </div>
}

预订记录详情页(Detail.cshtml)

@model List<Booking>

<h2>Booking Detail</h2>

<table>
    <tr>
        <th>Passenger Name</th>
        <th>Seats</th>
    </tr>

    @foreach (var booking in Model)
    {
        <tr>
            <td>@booking.PassengerName</td>
            <td>@booking.BookedSeats</td>
        </tr>
    }
</table>

<div>
    <a href="@Url.Action("Index")">Back to list</a>
</div>

步骤8:运行应用程序

我们可以直接在Visual Studio中运行这个应用程序,或者使用命令行运行。

以上就是C#实现一个简单的航班预订系统的完整攻略。如果您想深入了解,可以参考Microsoft官方文档。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现航班预订系统 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#实现的算24点游戏算法实例分析

    C#实现的算24点游戏算法实例分析 什么是算24点游戏? 算24点游戏是一种益智游戏,要求玩家根据给定的4个数字,通过加、减、乘、除等数学运算,最终得到结果为24的解。 实现算法需要掌握的知识 算数运算符:加法、减法、乘法、除法 基础数据类型:整型、浮点型 数组:存储4个数字 递归算法:遍历所有可能的数字组合 算法实现步骤 输入4个数字 遍历所有可能的数字排…

    C# 2023年6月1日
    00
  • C# StringBuilder和string

    C#中的StringBuilder和string都是字符串类型,但它们有一些不同的特点。本篇文章将详细讲解它们的区别以及在实际开发中的应用。 StringBuilder StringBuilder是一个可变的字符串类,使用它可以方便地进行字符串拼接和修改操作。相对于string类型,StringBuilder在频繁修改字符串时可以提供更好的性能表现。 创建S…

    C# 2023年6月8日
    00
  • C# 创建报表过程详解

    标题:C# 创建报表过程详解 1. 介绍 在C#中,我们可以使用ReportViewer控件来创建报表。ReportViewer控件是Visual Studio自带的,使用它可以在Web和Winform应用程序中显示报表。本文将介绍如何使用ReportViewer控件创建报表。 2. 步骤 2.1 安装ReportViewer控件 在Visual Studi…

    C# 2023年6月2日
    00
  • C#中ZipHelper 压缩和解压帮助类

    下面我将为您详细讲解“C#中ZipHelper压缩和解压帮助类”的完整攻略。 1. 概述 ZipHelper是一个C#开发的压缩和解压缩帮助类,使用简单方便,目前已经被广泛应用。下面介绍ZipHelper的基本使用方法及示例。 2. 安装 要使用ZipHelper,需要下载NuGet包“ICSharpCode.SharpZipLib”。可以通过NuGet P…

    C# 2023年5月15日
    00
  • Unity命令行打包WebGL的示例代码

    有关Unity命令行打包WebGL的完整攻略,可以按照以下步骤进行: 步骤一:安装Unity和WebGL插件 在开始打包之前,需要确保电脑上已经安装了Unity和WebGL插件。如果没有安装过,可以前往Unity官网进行下载和安装。 步骤二:创建Unity项目并设置好WebGL平台 在安装完成后,打开Unity并创建一个新项目,然后前往Build Setti…

    C# 2023年5月31日
    00
  • C#中委托的进一步理解

    在C#中,委托是一种特殊的类型,它是一种可以存储对其他方法的引用(或类似指针的实体),并且可以调用这些方法的对象。委托可以像一般函数一样调用,并且在函数调用时会自动通知它所负责的所有方法去执行。 在C#中,委托可以用来实现回调机制,将一个委托对象作为参数传递给另一个函数,这样,当另一个函数完成任务后,就可以调用这个委托来通知回调函数。 委托属于引用类型,它可…

    C# 2023年6月6日
    00
  • jquery+ajax+C#实现无刷新操作数据库数据的简单实例

    下面我将为你详细讲解“jquery+ajax+C#实现无刷新操作数据库数据的简单实例”的完整攻略。 1. 准备工作 在开始前,你需要先准备好以下工作: 一台装有IIS、SQL Server等环境的Windows服务器。 一份C#项目,其中包含与数据库交互的代码。 一个HTML页面,用于调用Ajax和展示数据。 2. 实现步骤 2.1 配置Web.config…

    C# 2023年5月15日
    00
  • C#对文件/文件夹操作代码汇总

    关于”C#对文件/文件夹操作代码汇总”的攻略,主要包含以下内容: 1.文件夹操作 创建文件夹 使用System.IO.Directory 类的CreateDirectory()方法可以创建一个新的文件夹。代码实例: string path = @"C:\MyDirectory"; if (!Directory.Exists(path)) …

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部