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#编写SqlHelper类

    为了详细讲解“详解使用C#编写SqlHelper类”的完整攻略,我将从以下几个方面进行讨论。 什么是SqlHelper类? 为什么需要使用SqlHelper类? SqlHelper类的特点和使用方法。 两个使用示例。 什么是SqlHelper类? SqlHelper类是一个包含可以与数据库进行交互的方法的类。它是C#中一种常用的数据库编程方式。它支持基本的S…

    C# 2023年6月2日
    00
  • 解析使用enumerator模式简化异步操作的详解

    我很乐意为您讲解“解析使用enumerator模式简化异步操作的详解”的攻略。 什么是enumerator模式? enumerator是一个可以使多个异步操作变得更加简单和易于管理的模式,也被称为协程模式。Enumerator是一个实现IEnumerator接口的类,它包含了一个异步操作,当这个异步操作完成时,它会返回一个结果。使用enumerator模式可…

    C# 2023年6月6日
    00
  • 扩展 Entity Framework支持复杂的过滤条件(多个关键字模糊匹配)

    要扩展 Entity Framework 的过滤条件以支持复杂的过滤条件(如多个关键字的模糊匹配),需要用到 Lambda 表达式和 LINQ 功能。下面是完整的攻略: 1. 定义扩展方法 我们可以通过在静态类中定义扩展方法来扩展 Entity Framework 的过滤条件。这里我们定义一个名为 FilterByKeywords 的扩展方法: public…

    C# 2023年6月3日
    00
  • C# 中的partial 关键字详解

    C# 中的partial 关键字详解 在C#中,使用 partial 关键字可以将一个类、结构体、接口或者方法分为多个部分进行声明,这些部分可以分布在同一个源文件中,也可以分布在不同的文件中。 partial类 声明方式 在一个类的声明前添加 partial 关键字,该类即可被分为多个部分,示例代码如下: partial class MyClass { //…

    C# 2023年6月7日
    00
  • c# 单例模式的实现

    当在 C# 中开发应用程序时,善于使用设计模式是非常重要的。单例模式是一种常用的模式,它用于确保一个类只有一个实例,并提供全局访问点。 以下是实现单例模式的典型步骤: 步骤一:声明一个私有的构造函数 单例模式的首要目标是保证一个类只创建一个对象,并允许客户端代码访问实例。为了控制类的实例化,需要阻止类外部的代码调用构造函数。可以通过将构造函数的访问权限设置为…

    C# 2023年5月31日
    00
  • 在Winform框架界面中改变并存储界面皮肤样式的方法

    下面是在Winform框架中改变并存储界面皮肤样式的完整攻略: 1.创建皮肤风格文件 首先,需要准备一些用于表示不同皮肤风格的文件。在这里我们可以使用 JSON 文件来存储皮肤风格相关的属性,例如颜色、字体、大小等信息。具体来说,我们可以为每个皮肤风格创建一个以 .json 为后缀的文件,文件中包含了该皮肤的各项属性。 示例:下面是一个表示深色主题的 dar…

    C# 2023年6月3日
    00
  • C#中的分布式ID生成组件IDGen介绍并给出示例代码

    C#中的IDGen是一个C#实现的Twitter Snowflake算法的ID生成器,可以生成全局唯一的ID,支持高并发场景下的ID生成。在本篇文章中,我们将介绍IDGen的使用方法并提供相关的C#示例代码。 IDGen的介绍 IDGen是一款开源的分布式唯一ID生成器,支持多种ID生成算法,并且可以在高并发场景下快速生成全局唯一的ID。目前支持的ID生成算…

    C# 2023年4月24日
    00
  • 深入c# Func委托的详解

    深入c# Func委托的详解 什么是Func委托 Func委托是一个通用泛型委托,可以接受1至16个输入参数,并返回一个返回值。因为Func是一个泛型委托,所以可以用来创建适合各种输入和返回类型的委托。 Func是一个系统内建的委托类型,在System命名空间中定义,其语法如下: public delegate TResult Func<in T, o…

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