ASP.NETCore打造一个简单的图书馆管理系统(八)学生借阅/预约/查询书籍事务NanaseRuri

《ProASP.NETMVC5》、《锋利的jQuery》

此系列皆使用VS2017+C#作为开发环境。如果有什么问题或者意见欢迎在留言区进行留言。

本章内容:自定义布局页、自定义EditorFor模板、EF多对多数据的更新

一、更新模型

同时由于书籍和学生存在多对多的关系——一本书可被多人预约,而一个人可以借阅多本书,因此在此更新模型使书籍与学生有多对多的关系。

此处仅展示模型的修改,控制器方面的修改请在查看源码:

引入中间导航类:

这里新增的AppointingDateTime用于将借阅的书籍以及预约的书籍进行区分。

1publicclassAppointmentOrLending2{3publicBookBook{get;set;}4publicstringBookId{get;set;}5publicStudentInfoStudent{get;set;}6publicstringStudentId{get;set;}7publicDateTimeAppointingDateTime{get;set;}8}

Student模型改动

1publicclassStudent:IdentityUser2{3///

4///学号5///6[ProtectedPersonalData]7[RegularExpression("[UIA]\\d{9}")]8publicoverridestringUserName{get;set;}910[StringLength(14,MinimumLength=11)]publicoverridestringPhoneNumber{get;set;}1112publicstringName{get;set;}13publicDegreesDegree{get;set;}14publicintMaxBooksNumber{get;set;}15}ViewCode

添加新模型StudentInfo:

1publicclassStudentInfo2{3[Key]4publicstringUserName{get;set;}56[Required]7publicstringName{get;set;}89///

10///学位,用来限制借书数目11///12[Required]13publicDegreesDegree{get;set;}1415///16///最大借书数目17///18[Required]19publicintMaxBooksNumber{get;set;}2021///22///已借图书23///24publicICollectionKeepingBooks{get;set;}2526publicstringAppointingBookBarCode{get;set;}2728[StringLength(14,MinimumLength=11)]29publicstringPhoneNumber{get;set;}3031///32///罚款33///34publicdecimalFine{get;set;}35}

在借书信息处添加学生信息和中间类的表,同时在此指定中间类的外键——指定其外键由学生学号和书籍条形码共同组成,需要重写DbContext父类的OnModelCreating方法使其覆盖对应表格在EF的默认生成方式:

1publicclassLendingInfoDbContext:DbContext2{3publicLendingInfoDbContext(DbContextOptionsoptions):base(options)4{5}67publicDbSetBooks{get;set;}8publicDbSetBooksDetail{get;set;}9publicDbSetBookshelves{get;set;}10publicDbSetRecommendedBooks{get;set;}11publicDbSetStudents{get;set;}12publicDbSetAppointmentOrLendings{get;set;}1314protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder)15{16base.OnModelCreating(modelBuilder);17modelBuilder.Entity()18.HasKey(c=>new{c.BookId,c.StudentId});19}20}

然后例行的更新数据库:

cdlibrarydemoadd-migrationAddStudents-cLibraryDemo.Data.LendingInfoDbContextupdate-database-cLibraryDemo.Data.LendingInfoDbContext

在原BookInitiator中对Students表进行初始化:

1if(!context.Students.Any())2{3IEnumerableinitialStudents=new[]4{5newStudentInfo()6{7UserName="U201600001",8Name="Nanase",9PhoneNumber="12345678910",10Degree=Degrees.CollegeStudent,11MaxBooksNumber=10,12},13newStudentInfo()14{15UserName="U201600002",16Name="Ruri",17PhoneNumber="12345678911",18Degree=Degrees.DoctorateDegree,19MaxBooksNumber=1520}21};2223IEnumerableinitialAdmins=new[]24{25newStudentInfo()26{27UserName="A000000000",28Name="Admin0000",29PhoneNumber="12345678912",30Degree=Degrees.CollegeStudent,31MaxBooksNumber=2032},33newStudentInfo()34{35UserName="A000000001",36Name="Admin0001",37PhoneNumber="12345678910",38Degree=Degrees.CollegeStudent,39MaxBooksNumber=2040},41};42foreach(varstudentininitialStudents)43{44context.Students.Add(student);45awaitcontext.SaveChangesAsync();46}47foreach(varadminininitialAdmins)48{49context.Students.Add(admin);50awaitcontext.SaveChangesAsync();51}52}

二、自定义布局页

在ASP.NET中,默认将HTML页面的body元素一部分抽出来,该部分称作RenderBody;然后将这部分放到一个布局即大体页面框架中即可完成对同一系列的页面进行精简的布局实现。

默认布局页为_Layout.cshtml,可在视图文件夹中根目录或各个控制器视图目录的_ViewStart.cshtml修改默认布局页,或者在每个Razor页面的开头中指定布局页:

1@{2ViewData["Title"]="EditLendingInfo";3Layout="_LendingLayout";4}

之前一直使用的是VS的默认布局页,现在以该默认布局页为基础,添加自己所需要的信息:

现在大体框架:

除了默认的RenderBody外,可以指定特定的部分放在页面的不同地方,在布局页中使用@RenderSection("SectionName"):

1@RenderSection("SectionName")

且在视图页中使用指定特定的节@sectionSectionName{};

1@sectionSectionName{23};则该视图页中的SectionName部分会被提取出来放到布局页对应的位置。

三、管理员编辑借阅信息

动作方法:

在此对数据库的表格使用Include方法使EF应用其导航属性以获得KeepingBooks列表,否则使用Student对象KeepingBooks属性只会返回空。

将BookState枚举提取成分部视图_BookStatePartial:

1@usingLibraryDemo.Models.DomainModels2@modelBook34@Html.LabelFor(b=>b.State)5@Html.DropDownListFor(b=>b.State,Enum.GetValues(typeof(BookState)).Cast().Select(state=>6{7stringenumVal=Enum.GetName(typeof(BookState),state);8stringdisplayVal;9switch(enumVal)10{11case"Normal":12displayVal="可借阅";13break;14case"Readonly":15displayVal="馆内阅览";16break;17case"Borrowed":18displayVal="已借出";19break;20case"ReBorrowed":21displayVal="被续借";22break;23case"Appointed":24displayVal="被预约";25break;26default:27displayVal="";28break;29}30returnnewSelectListItem()31{32Text=displayVal,33Value=enumVal,34Selected=Model.State.ToString()==enumVal35};36}))37

Html.DisplayFor方法是ASP.NET内置对各种属性进行展示的方法,可以在项目的Views文件夹中的Shared文件夹创建对应类型的Editor模板供其使用:

在此创建一个DateTime.cshtml,于是我们使用Html.DisplayFor用于展示DateTime数据时只会显示年份/月份/天数:

1@modelDateTime23@Model.ToString("yyyy/M/dd")

视图中使用partialTagHelper指定其name为_BookStatePartial以应用分部视图:

结果:

四、查看个人信息

1[Authorize]2publicasyncTaskPersonalInfo()3{4StudentInfostudent=await_lendingInfoDbContext.Students.Include(s=>s.KeepingBooks).ThenInclude(k=>k.Book)5.FirstOrDefaultAsync(s=>s.UserName==User.Identity.Name);6decimalfine=0;7foreach(varbookinstudent.KeepingBooks.Where(b=>b.Book.MatureTimeb.BarCode==student.AppointingBookBarCode)18};19returnView(model);20}

视图:

五、借阅书籍

由于暂时未有获取二维码的接口,仅通过直接访问Lending模拟借阅:

六、续借书籍

1[Authorize]2[HttpPost]3publicasyncTaskReBorrow(IEnumerablebarcodes)4{5StringBuilderborrowSuccess=newStringBuilder();6StringBuilderborrowFail=newStringBuilder();7borrowSuccess.Append("成功续借书籍:");8borrowFail.Append("续借失败书籍:");9foreach(varbarcodeinbarcodes)10{11BookreBorrowBook=_lendingInfoDbContext.Books.FirstOrDefault(b=>b.BarCode==barcode);12if(reBorrowBook!=null)13{14if(reBorrowBook.State==BookState.Borrowed&&DateTime.Now-reBorrowBook.MatureTime.Date<=TimeSpan.FromDays(3))15{16reBorrowBook.State=BookState.ReBorrowed;17reBorrowBook.BorrowTime=DateTime.Now.Date;18reBorrowBook.MatureTime=DateTime.Now.Date+TimeSpan.FromDays(28);19borrowSuccess.Append($"《{reBorrowBook.Name}》、");20}21else22{23borrowFail.Append($"《{reBorrowBook.Name}》、");24}25}26}27borrowSuccess.AppendLine(borrowFail.ToString());28await_lendingInfoDbContext.SaveChangesAsync();29TempData["message"]=borrowSuccess.ToString();30returnRedirectToAction("PersonalInfo");31}

七、查询书籍

修改之前的Search方法使其通过当前用户的身份返回不同页面,以及在_LendingInfoLayout中添加搜索框部分:

1publicasyncTaskSearch(stringkeyWord,stringvalue)2{3BookDetailsbookDetails=newBookDetails();4switch(keyWord)5{6case"Name":7bookDetails=await_lendingInfoDbContext.BooksDetail.AsNoTracking().FirstOrDefaultAsync(b=>b.Name==value);8break;9case"ISBN":10bookDetails=await_lendingInfoDbContext.BooksDetail.AsNoTracking().FirstOrDefaultAsync(b=>b.ISBN==value);11break;12case"FetchBookNumber":13bookDetails=await_lendingInfoDbContext.BooksDetail.AsNoTracking().FirstOrDefaultAsync(b=>b.FetchBookNumber==value);14break;15}1617if(bookDetails!=null)18{19if(User.Identity.IsAuthenticated&&User.IsInRole("Admin"))20{21returnRedirectToAction("EditBookDetails",new{isbn=bookDetails.ISBN});22}23else24{25returnRedirectToAction("Detail",new{isbn=bookDetails.ISBN});26}27}2829TempData["message"]="找不到该书籍";30returnRedirectToAction("BookDetails");31}

THE END
1.项目实战C#实现图书馆信息管理系统c#图书馆系统本项目是要开发一个图书馆管理系统,通过这个系统处理常见的图书馆业务。这个系统主要功能是:(1)有客户端(借阅者使用)和管理端(图书馆管理员和系统管理员使用)。(2)借阅者可以对于图书馆里面存在的图书进行借阅图书、归还图书等基本操作。(3)借阅者可以对于图书馆里面的图书的书号、种类、书名关键字等信息进行查询。https://blog.csdn.net/U2396573637/article/details/140561687
2.自己做“图书馆借还系统”(免写程序/能管会员/查书况/自动算逾期金)说明:本篇教学文中制作出来的“借还书系统”现在已经可以在 Ragic应用商店中直接安装啰!可以到功能捷径 > 应用商店 > 生活应用 > 找到“借还书系统”范本直接安装,相关说明请参阅这篇文章。 谈到“图书馆”这个词,我以前想到的,多半是大厅挑高、仰之弥高,藏书量动辄几十万,好多年没踏进去的那种学校 / 政府https://www.ragic.com.cn/intl/zh-CN/blog/331/no-code-library-management-setup
3.图书馆管理信息系统12篇(全文)此系统基于.NET Framework2.0,开发语言使用C#。 1 系统逻辑结构设计 由于图书馆的信息流动主要是在图书馆内部和在用户和图书馆之间,而这系统的面向人群分两大群:图书馆工作人员和读者。因此把系统分为两部分,一部分面向图书馆工作人员,称为图书馆信息管理系统,另一部分面向读者等想查询图书信息的人,称为图书馆信息查https://www.99xueshu.com/w/ikey83ul2gs1.html
4.电子图书借阅系统价格批发价格优质货源免费查询更多电子图书借阅系统价格详细参数、实时报价、行情走势、优质商品批发/供应信息等,您还可以发布询价信息。https://b2b.baidu.com/slist/7c2e1e1a0475032074211d0d067c047a75127138
5.基于Python图书借阅系统Django图书馆管理系统(源码调试+讲解+文档基于Python的图书借阅系统,选用B/S模式,应用django技术, MySQL为后台数据库。系统主要包括首页,个人中心,用户管理,图书馆管理,图书信息管理,图书类型管理,借阅信息管理,归还信息管理,续借信息管理,罚金信息管理,留言板管理,系统管理等功能模块。基于Python的图书借阅系统的设计与实现的设计思想如下: ?https://www.jianshu.com/p/355aeaca4a4a
6.湖南理工学院数字图书馆借阅系统的设计与开发的便利,利于图书馆管理员管理图书馆借阅的相关事务,方便人们借阅书籍。数字图书馆借阅系统主要采用C#, ASP.NET,SqlServer,VisualStudio为开发平台,系统页面简洁大方,操作简单,便于维护。 关键词图书馆管理VisualStudioSQLServer数字化 第1章绪论 1.1课题背景及课题意义 https://m.book118.com/html/2024/0322/8076065036006050.shtm
7.图书管理系统设计与实现图书馆借阅管理系统目前被广泛应用于学校、工业、商业、企业、事业等单位。尤其是那些较大型的图书馆还采用了大型数据库开发的软件,部分大型图书馆也使用Foxpro、SQL Server等。而基于sqlserver数据库,asp.net技术的多数是中小型图书馆。但在大多数不发达国家,基于SQL Server数据库的图书馆管理信息系统应用得很广泛。但是https://www.360wenmi.com/f/file63vsn7c9.html
8.图书馆管理系统完整代码+数据库一个完整的C#图书馆管理系统源代码,窗体程序代码很适合初学者的学习看研究。 C# ADO.NET 管理系统2013-09-04 上传大小:9.00MB 所需:50积分/C币 javaswing图书馆管理系统源代码+数据库模型 javaswing图书馆管理系统源代码+数据库模型 ?确保系统具有良好的系统性能,友好的用户界面。 ?较高的处理效率,便于使用https://www.iteye.com/resource/u011619223-6211565
9.C#制作图书管理系统简介:本文讲解使用C#类和对象,来制作一个图书管理系统。 算法思路 设计思路如下: 创建Book类:这个类表示图书,包含图书的属性(例如标题、作者)以及一个标识图书是否可借阅的布尔值属性。可以根据需要添加其他属性和方法。 创建Library类:这个类表示图书馆或图书管理系统,负责管理图书的借还操作。它应该包含一个图书列表https://developer.aliyun.com/article/1421605
10.python图书馆借阅管理系统网盘图书馆管理系统python代码python图书馆借阅管理系统网盘 图书馆管理系统python代码 源代码下载地址: bin/start.py """ 项目启动入口 """ import os import sys #将项目的根目录,添加到sys.path中2 sys.path.append(os.path.dirname(os.path.dirname(__file__))) from core import srchttps://blog.51cto.com/u_16099185/8852895
11.C#图书管理系统(源代码+数据库+系统流程图)老谢C#于 2024-11-21 上传 【实例简介】 本课题主要的任务是实现图书管理的系统化、规范化和自动化,实现对图书资料的集中统一的管理。本系统主要实现对图书馆信息的管理,主要功能为管理有关读者、图书、借阅、查询、删除和管理员的信息等。 (1) 管理员对功能的需求: https://www.haolizi.net/example/view_171888.html
12.学生信息管理系统的用例图和图书管理系统系统分析及用例图[通俗易图书馆向每一个借阅者发放图书证,图书证中包含每一个借阅者的编号和个人信息。系统通过一个单独的程序为借阅者提供服务,不需要管理人员的干预,这些服务包括提供查询图书信息、查询个人信息服务和预定图书服务等。 当借阅者需要借阅书籍、归还书籍时需要通过图书管理员进行,也就是说借阅者不直接与系统交互,而是图书管理https://cloud.tencent.com/developer/article/2091279
13.基于ASP.NET技术的图书管理系统的设计与实现图书管理员们不仅要对数量庞大的图书信息进行管理,随时更新图书信息,还需要频繁地处理复杂的读者信息与图书借阅信息。如果继续采用传统的人工处理数据的方法,既费时又费力,并且容易出错。如今图书馆管理系统相对于以前已经有了很大的改善,但是随着经济技术的不断发展,图书馆的功能应该逐渐增加,为读者带来更好的使用体验。https://mall.cnki.net/magazine/article/CMFD/1019008455.nh.htm
14.图书管理系统需求分析及用例图状态图数据流图图书馆管理信息系统的用例图和类图类图图书管理系统主要管理对象是图书,系统的用户包括,借阅者,图书管理员。该系统主要设计的类包括:Book (代表一本书)、Borrower (借阅者)和 Worker(图书管理员)。 其中Borrower和Book之间为关联关系,Borrower和Book存在关联关系。类图如下:用例图主要用户有管理员和借阅者:管理员可以接https://www.pianshen.com/article/8392777416/
15.年度工作总结15篇目前,学院图书馆由本人一人负责相关管理工作,面对大量学生、教师等借阅图书人员的增加,困难可想而知,本人克服重重困难,履顺工作思路,使图书馆借阅工作保持了良好的学习环境,真正做到让每一个借阅人员,高兴而来,满意而归,较好的完成了20xx年工作任务。 二、严格规范图书管理系统,提高工作效率。https://www.oh100.com/a/202206/4790705.html