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.教材系统腾讯云开发者社区?教材管理系统需求说明书? ?引言? 教材管理仓库在正常运营中面对大量教材书籍、教材信息以及订购信息,学生信息、发放书等信息。现有的人工记录方法既效率低又错误过多,大大影响了教材仓库的正常管理工作。因此需要对教材资源、学生信息、订购信息、发放书等进行管理,及时了解各个环节中信息的变更,有利用管理效率https://cloud.tencent.com/developer/article/2478896
2.关于《教育类资源库》数据库的通知图书信息中心各位读者:为满足我校师生使用教育类资源,我们整理了部分教育类免费资源,特别是对教师教育类师生和有意向考取教师资格证的同学,我们也整理了中小学教育平台,欢迎大家使用。 图书信息中心 2024.12.16多媒体类教育资源资 源链 接简 介1国家智慧教育中小学平台hthttps://www.xxgc.edu.cn/xxzx/info/1017/1782.htm
3.资源动态丨杰程?专升本数据库试用通知学习档案:实时记录每个人的课程学习过程、试卷试题练习情况。 能力评估:对学习数据进行综合统计,对个人学习状况进行分析提示。 04 使用说明 登录方式: 方式1: https://www.jiecedu.net 方式2:点击图书馆官网-馆藏与资源-试用资源 方式3:移动端关注或者扫描“杰https://mp.weixin.qq.com/s?__biz=MzI4OTg3ODQwNQ==&mid=2247512894&idx=2&sn=073b4bef5e87507a71f76b6a7c02b579&chksm=ed85961827b4c743a802c5e7c225d7a713d34ae86bd1fd7bcf322cab9c50f6fdc764f6562894&scene=27
4.2025教材巡展网上行大揭秘:53925次点击,396139种教材等你选!随着科技的发展,教育资源也迎来了全新的变革。2025全国教材巡展网上行活动于2024年11月21日正式启动,为教师们提供了一个全新的教材信息交流平台。 活动亮点: 170家出版社参与:此次巡展汇聚了科学出版社、清华大学出版社、北京大学出版社等170家知名出版社,涵盖了各个学科领域的教材资源。 https://m.sohu.com/a/839847026_121956425
5.关于开通试用“工程科技数字图书馆”资源库的通知“工程科技数字图书馆”是机械工业出版社开发和运营的专业类电子出版物发布平台,为用户提供在线内容检索和阅读服务。 二、资源类型 图书:17000+专业图书,年更新800-1500个品种;期刊:20种品牌专业期刊,工业领域顶级期刊群,约2140期;手册:400+种专业手册工具书;数字化手册近200种;丛书:系列丛书9个;(独有资源)年鉴:https://lib.yctei.cn/2024/1210/c34a57035/pagem.htm
6.第十五章教育木耳镇志重庆市渝北区图书馆1984年前称谓为木耳区文教组,设立在木耳区公所内,有文教干事和会计各1人,负责全区6个乡的教育管理工作。1984年秋季,经江北县教育局行文改名为江北县木耳教育管理办公室,设教办主任、会计各1人,中、小、幼、成教教研员负责辖区6个乡教育系统人事财务等行政管理和教学业务管理工作。1993年底因撤区建镇,区教办随之https://www.cqybtsg.org.cn/index.php?c=article&id=1312
7.读书分享活动的总结(通用20篇)开展读书活动,有利于大学生充分利用图书馆,广泛吸收人类优秀文化,在读书活动中加强社会实践和科学实践,使大学生在知识、能力和素养方面得到协调发展。开展读书活动,有利于增强大学生的创新精神,营造浓厚的校园文化氛围,提高办学品位,是迎奥运、树新风的良好表现。悠悠书香,点点墨趣,书传真知,笔墨传神,汕头大学学生社团https://www.yuwenmi.com/fanwen/zongjie/3657888.html
8.利津县人民政府县政府办公室文件利津县人民政府办公室关于做好建议:为进一步提升我县的城市水平、生活品质及沿黄经济带的发展,建议加快推进滨河大道东延至东津黄河大桥的工程建设,进一步优化全县路网结构,改善交通环境,方便周边居民出行,从而达到产业、城市、人之间有活力、持续向上发展的模式,把我县建设成为宜居、宜业,环境优美的滨河城市。 http://www.lijin.gov.cn/art/2022/4/20/art_266491_531.html
9.读书活动总结(精选21篇)学校的图书馆每周三向我们开放一次,这一天,班级的两位图书管理员代替同学们向学校借书,他们欢欢喜喜地借走自己喜欢的书。这一天我班利用每周一的写字课时间我们用来交流推荐图书。 3、举行“好书换着看”的活动。我们“读书吧”的儿童读物是流动的,学生每借走一本书要拿出自己的一本书来换(家里有困难的孩子不强https://www.jy135.com/huodongzongjie/974818.html
10.个人工作计划模板15篇④每天下班前的一个钟对当天的客户信息登记的登记进行查阅,若发现未及时处理的要进行处理。 3、钥匙的管理:将未收楼的或托管的装修钥匙按单元的顺序摆放整齐(1)建立班级图书角,发动每个学生至少带来两本书,使图书角拥有一定数量的书籍。通过开展“献两本看多本”的活动,丰富学生的阅读资源。 https://www.unjs.com/fanwenwang/gzjh/20220119182541_4691913.html
11.图书馆馆长年终工作总结(通用13篇)今年以来,在全体馆员的共同努力下,在学校领导的全面支持、关心下,图书馆本着一切为读者服务的宗旨,围绕优化服务、拓展图书馆教育和信息的功能,从读者服务、业务管理、读书活动、提高人员素质入手,通过一年扎扎实实的努力,圆满地完成了xx年的各项工作。 一、优化基础服务 https://mip.wenshubang.com/gongzuozongjie/nianzhonggongzuozongjie/2625537.html
12.个人事迹材料15篇在这些活动开展期间,学校除了大力营造氛围以外,重点是引导学生开展和参与活动,对各类活动进行评价,评出书香班级,读书之星,读书征文评比,给学校图书馆建设献一计等。 4.利用业余时间认真学习业务知识,不断进行思想教育,端正服务态度 平时我也是边工作,边学习,不断提高专业理论水平和工作实践能力。在图书室管理中既注重“https://www.oh100.com/a/202212/5720006.html
13.课堂支撑范文12篇(全文)具体来讲, 选择教学内容时, 教师要依据课程标准, 突出学科特点, 分析教学对象, 开发课程资源, 把教材内容重新组合, 使零散的知识围绕一条主线而问题化、层次化。组织教学活动时, 通过一定的教学手段, 借助学生原有的经验和认知发展的脉络建构知识, 将教材中显性的、静态的知识变为学生学习的动态信息, 使学生的原https://www.99xueshu.com/w/ikeydqrwduh9.html
14.学会工作总结15篇精我们围绕“服务、完善、创造、发展”的指导思想,健全和完善了《建筑工程学院团总支学生会会议制度》、《建筑工程学院团总支学生会财务管理制度》、《建筑工程学院团总支学生会奖惩制度》、《建筑工程学院团总支学生会考核制度》等几项规章制度,使团学会工作更加制度化、规范化、科学化。https://www.pinda.com/zhichang/gongzuozongjie/432618.html
15.湖北教育学院经济与管理学院教师在繁忙教学之余不辍笔耕,近年来,正式出版著作50多本,在各级刊物上公开发表学术论文数(师范类)、信息管理与信息系统专业、计算机应用技术专业、计算机多媒体技术专业、计算机网络技术专业、1、图书馆 2、档案馆 3、实验中心 4、教育技术中心 产业服务部门 1、资产经营管理公司(经营性资产管理https://baike.sogou.com/v7714244.htm