Menu
CoddyTech

控制台 UI / 管理员界面

本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 66 课,共 70 课。

challenge icon

挑战

简单

让我们通过构建一个控制台界面来完成你的图书馆系统,把所有组件整合起来!你将创建一个管理界面,用于处理命令来管理图书馆,包括添加图书、注册用户、处理借阅操作以及搜索目录。

你将继续使用现有的项目结构:

  • Book.cs:保留你的 Book 类,其中包含 Id、Title、Author、IsAvailable,以及 Borrow() 和 Return() 方法。
  • User.cs:保留你的 User 类,其中包含借阅跟踪、MaxBooks 常量、CanBorrow(),以及用于管理已借图书的方法。
  • Library.cs:保留你的 Library 类,其中包含你已经编写的所有借阅逻辑和 LINQ 搜索方法。添加一个新的方法 GetAllBooks(),用于返回图书馆中的所有图书;再添加 GetAllUsers(),用于返回所有已注册用户。
  • Program.cs:你的控制台界面将在这里实现!你将构建一个命令处理器,用于读取命令并执行相应的图书馆操作。你可以把它看作图书馆系统的管理仪表板。

你的控制台界面应能处理以下命令:

  • ADD_BOOK|id|title|author:添加一本新图书,并输出 Added: {Title}
  • ADD_USER|name|memberId:注册一位新用户,并输出 Registered: {Name}
  • BORROW|bookId|memberId:处理借阅请求(使用现有的 BorrowBook 逻辑)
  • RETURN|bookId|memberId:处理归还请求(使用现有的 ReturnBook 逻辑)
  • SEARCH|type|value:搜索目录,其中 type 可以是 title、author、available 或 borrowed
  • STATUS:输出摘要,显示图书总数、可借图书数、用户总数和已借出图书总数

对于 STATUS 命令,请按以下格式输出摘要:

--- Library Status ---
Total Books: {count}
Available: {count}
Total Users: {count}
Books Borrowed: {count}

对于搜索结果,将每本图书按 {Title} by {Author} 的格式单独输出一行;如果没有结果,则输出 No books found。

你将收到以下输入:

  • 图书馆名称
  • 要处理的命令数量
  • 每条命令各占一行,格式如上所述

例如,输入如下:

Downtown Library
8
ADD_BOOK|B001|Clean Code|Robert Martin
ADD_BOOK|B002|The Pragmatic Programmer|David Thomas
ADD_USER|Alice|101
ADD_USER|Bob|102
BORROW|B001|101
SEARCH|available
BORROW|B002|102
STATUS

输出应为:

Added: Clean Code
Added: The Pragmatic Programmer
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
The Pragmatic Programmer by David Thomas
Bob borrowed The Pragmatic Programmer
--- Library Status ---
Total Books: 2
Available: 0
Total Users: 2
Books Borrowed: 2

你的控制台界面充当连接用户输入与结构清晰的图书馆组件的纽带。每条命令都会交由 Library 类中相应的方法处理,这展示了清晰的架构如何让构建用户界面变得简单直接!

亲手试试

using System;
using System.Collections.Generic;

namespace LibrarySystem
{
    class Program
    {
        public static void Main(string[] args)
        {
            // 读取库名称
            string libraryName = Console.ReadLine();
            
            // 用库名称创建一个 Library 实例
            Library library = new Library(libraryName);
            
            // 读取命令数量
            int numCommands = Convert.ToInt32(Console.ReadLine());
            
            // 处理每条命令
            for (int i = 0; i < numCommands; i++)
            {
                string commandLine = Console.ReadLine();
                string[] parts = commandLine.Split('|');
                string command = parts[0];
                
                // TODO: 处理 ADD_BOOK 命令
                // 格式:ADD_BOOK|id|title|author
                // 打印:Added: {title}
                
                // TODO: 处理 ADD_USER 命令
                // 格式:ADD_USER|name|memberId
                // 打印:Registered: {name}
                
                // TODO: 处理 BORROW 命令
                // 格式:BORROW|bookId|memberId
                // 打印 library.BorrowBook() 的结果
                
                // TODO: 处理 RETURN 命令
                // 格式:RETURN|bookId|memberId
                // 打印 library.ReturnBook() 的结果
                
                // TODO: 处理 SEARCH 命令
                // 格式:SEARCH|type|value(type 可以是 title、author、available 或 borrowed)
                // 将每本书打印为 "{Title} by {Author}" 或 "No books found"
                
                // TODO: 处理 STATUS 命令
                // 打印:
                // --- Library Status ---
                // Total Books: {count}
                // Available: {count}
                // Total Users: {count}
                // Books Borrowed: {count}
            }
        }
    }
}

面向对象编程中的所有课

自己练习: C# 在线编译器