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.常见问题预约 2024-12-05 您好,我馆入馆不需要预约。 安装“首都图书馆在线阅读控件” 2024-12-03 您好,如果您要阅读古籍资源,需在历史阅览室(A座1层)内阅读。 推荐上架复利王 2024-12-02 您好,推荐图书请发送邮件至邮箱dzjs@clcn.net.cn。 为什么我的身份证后六位密码不对呀 https://www.clcn.net.cn/consult/default/detail
2.新闻聚焦# 无需预约随时来 # 明亮、舒适、静谧 来罗湖区图书馆自习可太香了 在这里你可以安静地阅读、思考 享受自学的乐趣 安静的学习空间+浓厚的书香氛围 遍布罗湖各个街道、社区的悠·图书馆 绝对是学习“充电”的好去处 家门口自习,你值得拥有! ↑ 温馨提示:一人一座,不要随便占座哦~ https://szlhlib.org.cn/information/19280
3.杭州市萧山图书馆4.若临时离座,请在线上选择临时“锁定座位”,限时30分钟,返回后需选择“解锁座位”,若超时未回,将视为自动放弃。 5.读者在确定预约的同时,默认承诺遵守我馆相关管理规定。 二、座位预约步骤: 1.打开“浙里办”点击搜索栏 2.搜索“萧山文旅红” 3.点击选择“图书馆预约”,了解“预约细则” https://www.xslib.com.cn/index/xtxx/2024/12/13/14206.htm
4.图书馆预约显示用户未授权网络运行不畅。图书馆座位预约系统是方便人们选座位的系统,不用担心去图书馆看书没有座位的问题。图书馆预约显示用户未授权是网络运行不畅,检查网络是否良好,然后重新授权,等待一会就好了。https://zhidao.baidu.com/question/592791740435728845.html
5.数字化校园建设实施方案(通用10篇)图书管理系统:图书馆一方面将自己原有的资源数字化,同时引进更多的电子图书、电子期刊以及网络数据库,并建立网络化的图书管理系统,为全校师生乃至校园外的学生提供全天候服务(包括检索、预约、传递、浏览、信息服务等)。 图书信息及管理的数字化系统由数据处理、查询、查重、统计打印、验收及数据维护、超期书查询、信函订https://www.ruiwen.com/fangan/5312564.html
6.永泰县第一中学智慧校园平台设备采购项目附件a2单位负责人授权书 1、企业(银行、保险、石油石化、电力、电信等行业除外)、事业单位和社会团体法人的“单位负责人”指法定代表人,即与实际提交的“营业执照等证明文件”载明的一致。2、银行、保险、石油石化、电力、电信等行业:以法人身份参加投标的,“单位负责人”指法定代表人,即与实际提交的“营业执照等证明文http://zfcg.fuzhou.gov.cn/upload/document/20221007/51041840cf4f449a8128879a4737b365.html
7.复课开学我校图书馆预约入馆系统使用说明天津城建大学【复课开学】我校图书馆预约入馆系统使用说明 温馨提示:在浏览“【复课开学】我校图书馆预约入馆系统使用说明”的时候,遇到了一点问题,该内容由用户上传,目前的状态为内容正在审核中。 对本文进行反馈,可以加快审核进度或“点击这里”前往其他网站查看。https://www.027art.com/tianjinbenke/HTML/7881228.html
8.河南工业大学图书馆简介河南工业大学图书馆地址→MAIGOO百科先后引进了RFID自助借还书系统、阅览座位预约系统、虚拟化电脑终端、十个多媒体触控屏综合信息发布平台,并建设了2个新技术创新体验区、1个3D影视欣赏室,目的在于开阔学生视野,在传统图书馆中注入现代化元素。 依托莲花街校区中心馆现代化的办馆条件,图书馆文献检索课、新生入学教育、馆藏资源推荐、数据库利用培训、https://www.maigoo.com/citiao/217239.html
9.书店管理系统系统帮助手册功能扩展:未来可以考虑引入更多智能化功能,如推荐系统、数据分析功能等,以便更好地服务于用户需求。 移动端支持:随着移动设备的普及,可以开发移动应用,以便用户随时随地访问图书馆资源,增强用户的便利性。 系统安全性提升:持续关注系统的安全性,确保用户数据的保护与隐私的安全,同时加强权限管理,防止未授权的访问。 用户https://blog.csdn.net/aa33677/article/details/143054748
10.网络管理规范范文6篇(全文)图书馆局域网的上网用户应采用登录方式上网,这样,未授权的用户就不能注册上网操作。系统管理员对馆内经常上网的工作人员根据其工作性质,每人设定一个账户和密码,对于临时的网络用户和公用用户(如检索机)可设置一个公用账号,并严格控制操作权限。当用户较多时,可以把用户分成几个组,对每个组分别设置权限控制和管理,这样https://www.99xueshu.com/w/filedxihdnvc.html
11.智慧图书馆空间服务白皮书.docx智能预约自助服务终端 215 56. 标签转换自助服务终端 215 57. 无感借阅通道 215 第 5 章 索引 215 13 第 1 章 图书馆智慧空间服务 1.1.智慧图书馆与智慧空间服务智慧图书馆是把各种智能技术运用到图书馆运营、管理、服务及数据中而形 成的一种智能化的图书馆, 是智能技术与高度自动化管理的数字图书馆的有机https://max.book118.com/html/2023/1021/6122042142005243.shtm
12.Create广州图创图书馆集群管理系统存在未授权访问.md·chunhua69 changes: 69 additions & 0 deletions 69 广州图创图书馆集群管理系统存在未授权访问.md Original file line numberDiff line numberDiff line change @@ -0,0 +1,69 @@ ## 广州图创图书馆集群管理系统存在未授权访问 广州图创图书馆集群管理系统是一款为图书馆设计的综合性管理软件。它能够实现对图书、读https://github.com/chunhualiu/POC/commit/1bee2419a7cfe1f174deb686425d87a148765a7e
13.天津大学讲座信息网(精选14篇)主讲题目:美好生活与休闲文化 讲座时间:2018-06-30 09:30:00 讲座地点:湖北省图书馆长江报告厅 主讲人简介: 楼含松,中文系教授,博士生导师,浙江大学人文学院党委书记兼副院长。 篇3:天津大学讲座信息网 5月14日下午, 山东省委党校组织信息技术专业讲座, 山东省经信委廉凯副主任应省委党校邀请, 为省委党校处级干https://www.360wenmi.com/f/filegw56c66k.html
14.上海市育鹰学校“基于“基于教学改革融合信息技术的新型教与学学校目前建设了图书馆系统、云课堂、教学资源库等业务系统,满足多媒体信息制作和宣传、数字创意课程的建设和实施。 我校以市级课题《指向学生学习方式转化的“数字创意”课程建设的实践研究》为抓手,建立了数字创意课程群,引导师生在数字化作品的创作过程中进行教和学,依托信息化工具,让学生在学习电脑技能的基础上,创作http://www.yuying.edu.sh.cn/info/1076/8592.htm