[桌面端应用开发] 从零搭建基于Caliburn的图书馆管理系统(C#合集)

图书馆系统要求:

你是一家新市图书馆的经理。 图书馆拥有大量藏书和不断增长的会员。 为了使图书馆管理更加容易,现在创建一个图书馆管理系统。 图书馆管理系统应具备以下功能:

1.图书管理:系统应该能够向图书馆添加新图书。 每本书都有唯一的书名、作者和 ISBN 号。 系统还应该能够显示和更新有关特定书籍的信息。

2.会员管理:系统应该能够向图书馆添加新的会员。 每个会员都有唯一的姓名和会员号。 系统还应该能够显示和更新有关特定成员的信息。

3、图书借还:系统应该能够向会员借书。 图书借阅时,应标记为"已借",并在借阅图书列表中列出借阅该图书的会员。 该系统还应该能够管理图书的归还。

4.(可选)报告:系统应该能够生成报告,例如借阅的书籍数量、最受欢迎的书籍、活跃会员数量等。

图书管理系统设计:

Book和User分别拥有了不同的属性,而Library实现了User和Book类之间的数据共享,比如用户能从Book类中获取图书信息

1.在Bootstrapper.cs中写入需要引用或者共享的class或library:

注意:整个Bootstrapper.cs文件,是负责应用程序初始化(用Application Library构建)

其中Bootstrapper.cs的configure函数非常非常重要,可以用来:

  • 注册视图模型 通过调用Container.RegisterTypeForNavigation方法,将视图模型与视图进行关联。这样在导航到特定视图时,相应的视图模型也会被自动创建。
  • 注册服务 使用Unity容器(或其他依赖注入容器)注册应用程序所需的各种服务,如数据访问服务、日志服务、配置服务等。这些服务可以在整个应用程序中共享和重用。
  • 配置区域(Regions) 为应用程序中的区域(如菜单、工具栏、主内容区等)注册相应的行为,例如注册导航服务、事件聚合等。
  • 配置模块目录 设置模块目录的位置,用于查找和加载应用程序的模块。
  • 配置设置 配置全局设置,如设置Shell窗口的启动位置、大小等。
  • 注册事件聚合器 注册一个事件聚合器,用于发布和订阅跨模块的事件。
  • 初始化Shell 配置应用程序的Shell,作为主窗口显示。
那要共享的class或library是什么呢?
  • 需要共享的所有数据逻辑(包含各个业务模块):

  • 比如当我们建立一个图书馆系统,我们希望用户在自己用户界面能看到自己借书情况,在书籍页面可以看到书籍的在借状态,也就是说书籍信息和用户信息要实现共享,那如何实现呢?

  • Bootstrapper.cs中的configure函数中引入,以保证实现数据信息的共享:

    <BookViewModel>();
    <UserViewModel>();
    <library>();

  • 还包括其他页面的信息共享,主视图(ShellViewModel),header视图(HeaderViewModel)

          protected override void Configure()
          {
              base.Configure();
              this.container.Singleton<Library>();
              this.container.Singleton<BookViewModel>();
              this.container.Singleton<UserViewModel>();
              this.container.Singleton<IStatusBar, StatusBarViewModel>();
              this.container.Singleton<IHeader, HeaderViewModel>();
              this.container.Singleton<IShell, ShellViewModel>();
              this.container.PerRequest<OptionsDialogViewModel>();
             
          }
    
2. 分别创建Book和User的类(class)

Book类: 每本书都有唯一的书名、作者和 ISBN 号。 系统还应该能够显示和更新有关特定书籍的信息。注意,因为书名是唯一的,所以会定义在constructor里。

namespace LibraryManagementSystem.Basics
{
    /// <summary>
    /// Implements a class to 
    /// </summary>
    public class Book
    {

        #region Fields

        #endregion

        #region Constructor
        /// <summary>
        ///  Initiates a class of the type <see cref="Book"/> 
        /// </summary>
        public Book(string title)
        {
            this.Title = title;
        }
        #endregion

        #region Properties
        public string Title { get; set; }
        public string Author { get; set; }
        public string ISBN { get; set; }
        public Status BookStatus { get; set; }


        #endregion
        /// <summary>
        /// 
        /// </summary>
      
        #region  Methods

        #endregion
        public bool SetBookStatus(Status status)
        {
            this.BookStatus = status;
            return true;
        }
    }

User类,每个会员都有唯一的姓名和会员号。

namespace LibraryManagementSystem.Basics
{
    /// <summary>
    /// Implements a class to 
    /// </summary>
    public class User
    {

        #region Fields

        #endregion

        #region Constructor
        /// <summary>
        ///  Initiates a class of the type <see cref="User"/> 
        /// </summary>
        public User(string name)
        {
            this.Name = name;
        }
        #endregion

        #region Properties

        public string Name { get; set; }
        public Book BorrowedBook { get; set; }
        public int UserID { get; set; }
}

定义library,让Book和User之间的数据实现共享,以及Book和User之间的编辑和删改操作都放在这里

namespace LibraryManagementSystem.Basics
{
    /// <summary>
    /// Implements a class to 
    /// </summary>
    public class Library
    {



        #region Constructor

        public Library()
        {
            this.Books = new ObservableCollection<Book>();
            this.Users = new ObservableCollection<User>();
        }


        #region Properties

        public ObservableCollection<User> Users { get; set; }


        public ObservableCollection<Book> Books { get; set; }





        #region  Methods
        public bool AddOneBook(string title, string author, string isbn, Status status)
        {
            if (Books == null)
            {
                Books = new ObservableCollection<Book>();
            }

            var newBook = new Book(title)
            {
                Author = author,
                ISBN = isbn,
                BookStatus = status
            };

            Books.Add(newBook);
            return true;
        }




        public bool SetOneBook(Book book, string newTitle, string newISBN, string newAuthor, Status newStatus)
        {
            if (Books == null || Books.Count == 0)
            {
                return false;
            }
            book.ISBN = newISBN;
            book.Author = newAuthor;
            book.BookStatus = newStatus;
            return true;
        }

        public bool DeleteSelectedBook(Book book)
        {
            if (book == null)
            {
                return false;
            }
            if(!Books.Contains(book)||Books == null)
            {
                return false;
            }
            Books.Remove(book);
            book = null;
            return true;
        }



        ///User
        ///
        public bool AddOneUser(string name, int userID, Book borrowedBook)
        {
            if (Users == null)
            {
                Users = new ObservableCollection<User>();
            }

            var newUser = new User(name)
            {
                UserID = userID,
                BorrowedBook = borrowedBook,
            };

            Users.Add(newUser);
            return true;
        }

        public bool DeleteSelectedUser(User user)
        {
            if (user == null)
            {
                return false;
            }
            if (!Users.Contains(user) || Users == null)
            {
                return false;
            }
            Users.Remove(user);
            user = null;
            return true;
        }

        public ObservableCollection<Book> GetAllBooks()
        {
            return Books;
        }

    }
  1. 结合BookView和UserView的视图

在BookViewModel中回溯该函数:

    public class BookViewModel: ViewAware
    {

        #region Fields
    
        #endregion

        #region Constructor

        public BookViewModel(Library library)
        {
            this.Library = library;
            this.NewBook = new Book("");
            StatusList = new ObservableCollection<Status>(Enum.GetValues(typeof(Status)).Cast<Status>());
        }
        #endregion

        #region Properties

        public Book NewBook { get; set; }
      
        public ObservableCollection<Status> StatusList { get; set; }
        public Library Library { get; set; }
        public Book SelectedBook { get; set; }
   


        #endregion

        #region  Methods
        public bool AddOneBook()
        {
            return Library.AddOneBook(this.NewBook.Title,this.NewBook.Author,this.NewBook.ISBN,this.NewBook.BookStatus);
        }

        public string GetOneBook(string title)
        {
            return Library.GetOneBook(title);
        }

        //public bool SetOneBook(Book book, string newTitle, string newAuthor, string newISBN, Status newStatus)
        //{
        //    return Library.SetOneBook(book, newTitle, newAuthor, newISBN, newStatus);
        //}

        public bool SetOneBook(Book book, string newTitle, string newAuthor, string newISBN, Status newStatus)
        {
            return Library.SetOneBook(book, newTitle, newAuthor, newISBN, newStatus);
        }

        public bool DeleteSelectedBook()
        {
            return Library.DeleteSelectedBook(SelectedBook);
        }


        #endregion
    }

在UserViewModel中回溯增删的函数:

    public class UserViewModel : ViewAware
    {

        #region Fields
        private Library library;
        #endregion

        #region Constructor
        /// <summary>
        ///  Initiates a class of the type <see cref="UserViewModel"/> 
        /// </summary>
        public UserViewModel(Library library)
        {
            this.Library = library;
            this.NewUser = new User("");
            this.SelectedUser = this.NewUser;
            this.AllBooks = new ObservableCollection<Book>(); // Initialize AllBooks
        }
        #endregion

        #region Properties

        public User NewUser { get; set; }
        public User SelectedUser { get; set; }
        public Library Library { get { return library; } set { library = value; } }
        public ObservableCollection<Book> AllBooks { get; set; }
        public Book SelectedBook { get; set; }

        #endregion

        #region  Methods
        public bool AddOneUser()
        {
            return Library.AddOneUser(this.NewUser.Name, this.NewUser.UserID, SelectedBook);
        }

        public bool DeleteSelectedUser()
        {
            return Library.DeleteSelectedUser(SelectedUser);
        }

将两个视图显示到一个页面

            <ux:InplaceTabBar  Grid.Row="1" >

                <TabItem Header="{x:Static res:Resources.ViewBooks}" >
                    <Book:BookView  x:Name="BookVM"/>
                </TabItem>

                <TabItem Header="{x:Static res:Resources.ViewUsers}" >
                    <User:UserView  x:Name="UserVM"/>
                </TabItem>


            </ux:InplaceTabBar>

注意:

定义

private Library library;

public Library Library { get { return library; } set { library = value; } }

和 public Library SelectedLibrary { get; set; } 是一致的

相关推荐
雷神乐乐10 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|14 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘33 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
morris13140 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
我要洋人死1 小时前
导航栏及下拉菜单的实现
前端·css·css3
科技探秘人1 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人1 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR1 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word