[桌面端应用开发] 从零搭建基于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;
        }

    }

3. 结合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; } 是一致的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/635704.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux-驱动开发】

Linux-驱动开发 ■ Linux-应用程序对驱动程序的调用流程■ Linux-file_operations 结构体■ Linux-驱动模块的加载和卸载■ 1. 驱动编译进 Linux 内核中■ 2. 驱动编译成模块(Linux 下模块扩展名为.ko) ■ Linux-■ Linux-■ Linux-设备号■ Linux-设备号-分配■ 静态分配设备号…

【设计模式深度剖析】【2】【结构型】【装饰器模式】| 以去咖啡馆买咖啡为例 | 以穿衣服出门类比

&#x1f448;️上一篇:代理模式 目 录 装饰器模式定义英文原话直译如何理解呢&#xff1f;4个角色类图1. 抽象构件&#xff08;Component&#xff09;角色2. 具体构件&#xff08;Concrete Component&#xff09;角色3. 装饰&#xff08;Decorator&#xff09;角色4. 具体装饰…

5分钟在 VSCode 中使用 PlantUML 绘图

去年&#xff0c;写过一篇在 VSCode 中使用 PlantUML 的博客&#xff0c;那时候我嫌弃本地安装麻烦&#xff0c;所以采用的是在本地运行 docker 容器的方法部署的 PlantUML 服务端。不过&#xff0c;现在来看这样还必须依赖在本地手动启动 docker 容器&#xff08;如果有一个不…

7.类和对象

类和对象 当我们没有去了解过java的知识点中 不免产生一些问题&#xff1a; 什么是类&#xff1f;什么是对象&#xff1f; 记住一句话&#xff1a;在java当中 一切皆对象 类&#xff1a;是用来描述一个对象的 而对象是一个真正存在的实体 在Java这门纯面向对象的语言中 我们…

Nginx企业级负载均衡:技术详解系列(10)—— Nginx核心配置详解(HTTP配置块)

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 今天咱们聊聊Nginx核心配置中的HTTP配置块&#xff0c;这个配置块在我们的日常使用中极为常见&#xff0c;它的重要性不言而喻。 HTTP配置块在Nginx的配置架构中占据着核心地位&#xff0c;它直接关系到服务器如何处…

panic: concurrent write to websocket connection【golang、websocket】

文章目录 异常信息原由代码错误点 解决办法 异常信息 panic: concurrent write to websocket connection原由 golang 编写 websocket go版本&#xff1a;1.19 使用了第三方框架&#xff1a; https://github.com/gorilla/websocket/tree/main 代码 server.go // Copyright …

蓝桥楼赛第30期-Python-第三天赛题 从参数中提取信息题解

楼赛 第30期 Python 模块大比拼 提取用户输入信息 介绍 正则表达式&#xff08;英文为 Regular Expression&#xff0c;常简写为regex、regexp 或 RE&#xff09;&#xff0c;也叫规则表达式、正规表达式&#xff0c;是计算机科学的一个概念。 所谓“正则”&#xff0c;可以…

nssctf——web

[SWPUCTF 2021 新生赛]gift_F12 1.打开环境后&#xff0c;这里说要900多天会有flag&#xff0c;这是不可能的 2.f12查看源码&#xff0c;然后在html中查找flag &#xff08;在最上方的栏目中&#xff0c;或者按ctrlf&#xff09; [SWPUCTF 2021 新生赛]jicao 1.打开环境是一段…

数据结构(树)

1.树的概念和结构 树&#xff0c;顾名思义&#xff0c;它看起来像一棵树&#xff0c;是由n个结点组成的非线性的数据结构。 下面就是一颗树&#xff1a; 树的一些基本概念&#xff1a; 结点的度&#xff1a;一个结点含有的子树的个数称为该结点的度&#xff1b; 如上图&#…

Qt | QCalendarWidget 类(日历)

01、QCalendarWidget 类 1、QCalendarWidget 类是 QWidget 的直接子类,该类用于日历,见下图 02、QCalendarWidget 属性 ①、dateEditAcceptDelay:int 访问函数:int dateEditAcceptDelay()const; void setDateEditAcceptDelay(int) 获取和设置日期编辑器的延迟时间(以毫秒…

go routing 之 gorilla/mux

1. 背景 继续学习 go 2. 关于 routing 的学习 上一篇 go 用的库是&#xff1a;net/http &#xff0c;这次我们使用官方的库 github.com/gorilla/mux 来实现 routing。 3. demo示例 package mainimport ("fmt""net/http""github.com/gorilla/mux&…

设计模式11——代理模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 代理模式&#xff08;Proxy&am…

ATA-7020高压放大器原理介绍

高压放大器是一种电子设备&#xff0c;用于增加输入信号的幅度&#xff0c;使其输出具有更大的电压。它在各种领域中发挥着关键作用&#xff0c;尤其是在需要高电压信号的应用中&#xff0c;如声学、医学成像、科学研究等领域。 高压放大器工作原理介绍&#xff1a; 信号输入&a…

图像上下文学习|多模态基础模型中的多镜头情境学习

【原文】众所周知&#xff0c;大型语言模型在小样本上下文学习&#xff08;ICL&#xff09;方面非常有效。多模态基础模型的最新进展实现了前所未有的长上下文窗口&#xff0c;为探索其执行 ICL 的能力提供了机会&#xff0c;并提供了更多演示示例。在这项工作中&#xff0c;我…

go mod模式下,import gitlab中的项目

背景 为了go项目能够尽可能复用代码&#xff0c;把一些公用的工具类&#xff0c;公用的方法等放到共用包里统一管理。把共用包放到gitlab的私有仓库中。 遇到的问题 通过https方式&#xff0c;执行go get报了错误。 通过ssh方式&#xff0c;执行go get报了错误。 修改配置&am…

Android:使用Kotlin搭建MVC架构模式

一、简介Android MVC架构模式 M 层 model &#xff0c;负责处理数据&#xff0c;例如网络请求、数据变化 V 层 对应的是布局 C 层 Controller&#xff0c; 对应的是Activity&#xff0c;处理业务逻辑&#xff0c;包含V层的事情&#xff0c;还会做其他的事情&#xff0c;导致 ac…

WebRTC-SFU服务器-Janus部署【保姆级部署教程】

一、SFU WebRTC SFU(Selective Forwarding Unit)构架是一种通过服务器来路由和转发WebRTC客户端音视频数据流的方法。这种构架的核心特点是将服务器模拟成一个WebRTC的Peer客户端,从而实现了音视频流的直接转发。 在SFU构架中,服务器作为中心节点,但并不负责音视频流的混…

TG5032CGN TCXO 超高稳定10pin端子型适用于汽车动力转向控制器

TG5032CGN TCXO / VC-TCXO是一款应用广泛的晶振&#xff0c;具有超高稳定性&#xff0c;CMOS输出和使用晶体基振的削波正弦波输出形式。且有低相位噪声优势&#xff0c;是温补晶体振荡器(TCXO)和压控晶体振荡器(VCXO)结合的产物&#xff0c;具有TCXO和VCXO的共同优点&#xff0…

海山数据库(He3DB)代理ProxySQL使用详解:(一)架构说明与安装

一、ProxySQL介绍 1.1 简介 业界比较知名的MySQL代理&#xff0c;由ProxySQL LLC公司开发并提供专业的服务支持&#xff0c;基于GPLv3开源协议进行发布,大部分配置项可动态变更。后端的MySQL实例可根据用途配置到不同的hostgroup中&#xff0c;由ProxySQL基于7层网络协议,将来…

Python 实现Word (DOC或DOCX)与TXT文本格式互转

目录 引言 安装Python库 使用Python将Word转换为TXT文本格式 使用Python将TXT文本格式转换为Word 引言 Word文档和TXT文本文件是日常工作和生活中两种常见的文件格式&#xff0c;各有其特点和优势。Word文档能够保留丰富的格式设置&#xff0c;如字体、段落、表格、图片等…