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日

相关文章

  • CefSharp如何进行页面的缩放(Ctrl+滚轮)

    CefSharp是基于Chromium开发的一种.NET WinForms或WPF控件,可用于将HTML、CSS和JavaScript呈现为.NET应用程序的UI。如果您想要在CefSharp中实现页面缩放功能,您可以遵循以下步骤: 方法一:使用JS注入实现缩放功能 该方法使用JS代码在页面上注入脚本,实现页面缩放的功能。它不需要在C#代码中进行更改。 在C…

    C# 2023年6月6日
    00
  • c# datetime方法应用介绍

    C# DateTime方法应用介绍 在C#中,DateTime是处理日期时间的一个非常重要的类型。它可以用来表示某一时刻的具体日期和时间,也可以通过计算帮助我们实现许多实际应用中的时间处理功能。本文将介绍DateTime常用的方法,以及如何使用这些方法进行日期时间的相关操作。 获取当前时间 我们可以使用DateTime.Now方法获取当前时间。该方法返回系统…

    C# 2023年6月1日
    00
  • C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    C#实现WebSocket协议客户端和服务器websocketsharp组件实例解析 WebSocket是一种在单个TCP连接上进行全双工通信的协议,它可以在客户端和服务器之间进行实时数据交换。WebSocket协议支持使用HTTP协议作为握手协议建立连接,随后进行数据传输。 websocketsharp是一种C# WebSocket客户端和服务器实现,它提…

    C# 2023年5月15日
    00
  • C#序列化与反序列化实例

    让我来为你详细讲解C#序列化与反序列化实例的完整攻略。 什么是C#序列化与反序列化? C#序列化与反序列化是指将C#的对象序列化成二进制字节流,并将其存储在磁盘或通过网络发送到其他计算机,同时,反序列化是指反过来将二进制字节流反序列化为C#对象。这样做的好处是可以方便地将对象跨平台传输和存储。 如何实现C#序列化与反序列化? C#提供了两种序列化方式:二进制…

    C# 2023年6月1日
    00
  • asp.net C#实现下载文件的六种方法实例

    下面是详细讲解“asp.net C#实现下载文件的六种方法实例”的完整攻略: 1. 使用Response.TransmitFile方法实现下载文件 在ASP.NET中,使用Response对象较常见地实现文件的下载。其中,使用Response.TransmitFile方法可以直接将文件传输出去,下载速度较快。代码如下: protected void BtnD…

    C# 2023年6月1日
    00
  • C#获取计算机硬件与操作系统的相关信息

    获取计算机硬件与操作系统的相关信息是C#开发中非常常见的任务之一。以下是一些获取相关信息的代码片段和方法。 获取计算机主机名 可以通过 Environment.MachineName 属性获取当前计算机的主机名。可以像这样使用: string hostname = Environment.MachineName; Console.WriteLine(&quo…

    C# 2023年6月7日
    00
  • C#调用微信接口的相关代码

    关于C#调用微信接口的代码,我们可以通过微信官方提供的开发者文档来进行了解和学习。具体流程可以按照以下步骤操作: 1.注册微信开放平台账号并创建应用 在微信公众平台官网上注册开放平台账号,并创建一个应用。在创建应用时,需要提供应用名称、应用类型和应用描述。同时,需要获取到应用的AppID和AppSecret,这是后续调用微信接口时所必须要使用到的。 2.使用…

    C# 2023年5月31日
    00
  • C# 如何调用SAP RFC

    调用SAP系统的功能,需要使用SAP提供的RFC接口,而C#语言则可以通过SAP .Net Connector来实现RFC调用操作。 以下是调用SAP RFC的详细攻略: 步骤一:安装SAP .Net Connector 访问SAP服务市场网站(https://support.sap.com)下载并安装SAP .Net Connector,这是使用C#调用R…

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