最新要闻
- 天天资讯:卖爆了!特斯拉拟提高上海工厂产量:新一轮大降价要来?
- 【世界新视野】独占高频版骁龙8 Gen2!三星Galaxy S23/S23+发布:5699元起
- 世界今热点:顶配1.32万元!三星Galaxy S23 Ultra正式发布:2亿像素无敌
- “九转大肠”原综艺:比吃答辩还要抽象10倍
- 144MB缓存秒所有!AMD锐龙7000X3D上市时间、价格公布
- 环球信息:小米年货节终极战报出炉:全渠道支付金额破178亿!
- 今日快讯:Intel Arc显卡驱动DX9游戏性能累计提升43%!性价比秒杀RTX 3060
- 每日看点!路虎在中国混不下去了
- 世界新消息丨国美电器董事长发文“反思”国美失势了:核心要务是活下去
- 1岁萌娃躺地耍赖父母转身离开 这招对90后不管用:网友点赞
- 天天速递!谁最靠谱?四大品牌23万块硬盘最新故障率报告公布:希捷让人看不懂
- 骁龙8+性能被榨干了!一加Ace 2散热拉满:极致流畅
- 【时快讯】《狂飙》大结局!高启强手机穿帮:提前两年用上iPhone 8 Plus
- 《狂飙》的艺术总监是张译:本人主演电影票房破200亿
- 环球关注:国内第一大加速器里程碑诞生!面积约合20余个足球场
- 环球视讯!《流浪地球2》导演郭帆:希望能为科幻电影蹚一条路
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)
随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP.NET Core也应运而生。本文主要基于ASP.NET Core+Element+Sql Server开发一个校园图书管理系统为例,简述基于MVC三层架构开发的常见知识点,前两篇文章简单介绍了如何搭建开发框架,登录功能以及主页面功能的实现,本篇文章继续讲解书室以及书架相关功能的开发,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点
在本示例中,应用最多的就是如何Element中提供的组件,和控制器中业务逻辑处理,涉及知识点如下所示:
【资料图】
- MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式,其中Controller(控制器)处理输入(写入数据库记录)。控制器Controller,是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
- Element组件库,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。可以大大提高开发效率,减少工作量。在主页面中,主要用到如下几种:
- 表单控件el-form,由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据到后台。
- 列表控件el-table,用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。主要用户显示结构化列表的数据。
- 分页控件el-pagination,当数据量过多时,使用分页分解数据。
- 弹出窗口el-dialog,在保留当前页面状态的情况下,告知用户并承载相关操作。主要用于弹出新建或编辑窗口。
- axios组件,是一个基于promise 的网络请求库,axios本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范。在本示例中,所有的前后端交互,均是通过axios库。
功能介绍
书室管理和书架管理,主要用于管理书籍的存放位置,及对书室和书架的CRUD(增删改查)等基本操作。每一个书室都有很多书架,并根据分类存放不同书籍,所以书室ID是书架ID的外键。两者之间存在对应关系。下面逐一进行介绍。
书室管理
书室管理就是对书室数据表的增删改查操作,相对比较独立,操作起来也比较简单。
1. 书室数据表结构
书室表主要包括Id(唯一标识),Name(图书馆名称),SubName(书室名称),Location(位置),Manager(管理员)等几个字段,具体如下所示
2. 书室数据表实体类
数据表实体类和数据表一一对应,主要通过EntityFrameword与数据库进行映射。如下所示:
1 namespace CLMS.Entity 2 { 3 ///4 /// 图书馆实体 5 /// 6 public class LibraryEntity 7 { 8 ///9 /// 唯一标识10 /// 11 public int Id { get; set; }12 13 ///14 /// 图书馆名称15 /// 16 public string? Name { get; set; }17 18 ///19 /// 图书室名称20 /// 21 public string? SubName { get; set; }22 23 ///24 /// 位置25 /// 26 public string? Location { get; set; }27 28 ///29 /// 管理员30 /// 31 public string? Manager { get; set; }32 33 ///34 /// 创建时间35 /// 36 public DateTime CreateTime { get; set; }37 38 ///39 /// 当前登录的账号的ID40 /// 41 public int CreateUser { get; set; }42 43 ///44 /// 最后编辑时间45 /// 46 public DateTime LastEditTime { get; set; }47 48 ///49 /// 最后修改人50 /// 51 public int LastEditUser { get; set; }52 }53 }
3. 书室页面布局
书室管理,主要用户查询,新增,修改,删除书室等基本操作,页面布局源码如下所示:
12 34 7书室管理 5书室管理 68 21 229 1110 12 1413 15 17查询 1618 20新增 1923 3524 25 26 27 28 29 30 34编辑 31删除 32 3336 37 56 5738 51 5539 4140 42 4443 45 4746 48 5049
4. 书室页面数据交互
数据交互通过JS脚本进行,书写格式和VUE2.0保持一致,在页面启动时,加载所有的书室信息,并绑定到el-table对象,所以需要在mounted函数中增加调用向服务器端发出请求,当用户新增或编辑保存时,通过axios发送请求到服务端接口。
1 <script> 2 var app= new Vue({ 3 el: "#app", 4 data:function() { 5 return { 6 queryCondition:{ 7 Name: "", 8 SubName: "", 9 }, 10 formLabelWidth: "120px", 11 addOrEditForm:{ 12 ID:0, 13 Name: "", 14 SubName: "", 15 Location:"", 16 Manager:"" 17 }, 18 total:0, 19 pageSize:20, 20 currentPage:1, 21 dialogFormVisible: false, 22 tableData: [] 23 } 24 }, 25 mounted:function(){ 26 this.query(1); 27 }, 28 methods: { 29 handleOpen(key, keyPath) { 30 console.log(key, keyPath); 31 }, 32 handleClose(key, keyPath) { 33 console.log(key, keyPath); 34 }, 35 formatter(row, column) { 36 return row.address; 37 }, 38 handleQuery(){ 39 this.query(1); 40 console.log("query"); 41 }, 42 handlePageChanged(val){ 43 this.query(val); 44 }, 45 handlePrevClick(val){ 46 //this.query(this.currentPage); 47 }, 48 handleNextClick(val){ 49 //this.query(this.currentPage); 50 }, 51 handleEdit(index,row){ 52 console.log("当前index="+index); 53 console.log(row); 54 this.addOrEditForm.Id=row.Id; 55 this.addOrEditForm.Name=row.Name; 56 this.addOrEditForm.SubName=row.SubName; 57 this.addOrEditForm.Location=row.Location; 58 this.addOrEditForm.Manager=row.Manager; 59 this.dialogFormVisible=true; 60 }, 61 handleDelete(index,row){ 62 console.log("当前index="+index); 63 console.log(row); 64 this.$confirm("确定要删除编号为"+row.Id+"的书室吗?", "提示", { 65 confirmButtonText: "确定", 66 cancelButtonText: "取消", 67 type: "warning" 68 }).then(() => { 69 var that=this; 70 axios.post("/Library/Delete", { 71 Id:row.Id 72 }).then(function (response) { 73 if(response.status==200){ 74 var msg = response.data; 75 console.log(msg); 76 if(msg.code=="0"){ 77 //刷新页面 78 that.$message({ 79 type: "success", 80 message: "删除成功!" 81 }); 82 that.query(1); 83 }else{ 84 that.$message.error(msg.message); 85 } 86 } 87 console.log(response); 88 }).catch(function (error) { 89 that.$message.error(error); 90 }); 91 console.log("delete"); 92 }).catch(() => { 93 this.$message({ 94 type: "info", 95 message: "已取消删除" 96 }); 97 }); 98 }, 99 handleAdd(){100 this.addOrEditForm.Id=0;101 this.addOrEditForm.Name="";102 this.addOrEditForm.SubName="";103 this.addOrEditForm.Location="";104 this.addOrEditForm.Manager="";105 this.dialogFormVisible=true;106 console.log("add");107 },108 handleSave(){109 var that=this;110 axios.post("/Library/Add", {111 Id:this.addOrEditForm.Id,112 Name:this.addOrEditForm.Name,113 SubName:this.addOrEditForm.SubName,114 Location:this.addOrEditForm.Location,115 Manager:this.addOrEditForm.Manager116 }).then(function (response) {117 if(response.status==200){118 var msg = response.data;119 console.log(msg);120 if(msg.code=="0"){121 that.dialogFormVisible=false;122 //刷新页面123 that.query(1);124 }else{125 window.alert(msg.message);126 }127 console.log(that.dialogFormVisible);128 }129 console.log(response);130 }).catch(function (error) {131 console.log(error);132 });133 console.log("save");134 },135 query(pageNum){136 var that = this;137 this.tableData=[];138 console.log("query");139 axios.get("/Library/Query",{params: {140 Name:this.queryCondition.Name,141 SubName:this.queryCondition.SubName,142 PageSize:this.pageSize,143 PageNum:pageNum144 }}).then(function (response) {145 if(response.status==200){146 var data = response.data;147 var count=data.count;148 that.total = count;149 for (let i = 0; i < data.items.length; i++) {150 that.tableData.push({151 Id: data.items[i].id,152 Name: data.items[i].name,153 SubName: data.items[i].subName,154 Location: data.items[i].location,155 Manager:data.items[i].manager,156 CreateTime: data.items[i].createTime,157 });158 }159 }160 console.log(that.tableData);161 console.log(response);162 }).catch(function (error) {163 console.log(error);164 });165 }166 }167 });168 </script>
5. 书室控制器逻辑LibraryController
控制器主要用于响应用户的请求,与数据库交互,并返回执行的结果信息。
1 namespace CLMS.Host.Controllers 2 { 3 public class LibraryController : Controller 4 { 5 private DataContext dataContext; 6 7 public LibraryController(DataContext context) 8 { 9 dataContext = context; 10 } 11 12 public IActionResult Index() 13 { 14 return View(); 15 } 16 17 ///18 /// 获取符合条件的查询 19 /// 20 /// 21 /// 22 /// 23 /// 24 ///25 [HttpGet] 26 public PagedRequest Query(string Name, string SubName, int pageNum, int pageSize) 27 { 28 Name = string.IsNullOrEmpty(Name) ? string.Empty : Name; 29 SubName = string.IsNullOrEmpty( SubName) ? string.Empty:SubName; 30 31 var entities = dataContext.Librarys.Where(r => r.Name.Contains(Name) && r.SubName.Contains(SubName)); 32 var total = entities.Count(); 33 var dtos = entities.Skip((pageNum - 1) * pageSize).Take(pageSize).Select(r => new Library() { Id = r.Id, Name = r.Name, SubName=r.SubName,Location=r.Location,Manager=r.Manager, CreateTime = r.CreateTime }).ToList(); 34 return new PagedRequest () 35 { 36 count = total, 37 items = dtos, 38 }; 39 } 40 41 /// 42 /// 查询所有信息 43 /// 44 ///45 [HttpGet] 46 public List QueryAll() { 47 var dtos = dataContext.Librarys.Select(r=> new Library() { Id = r.Id, Name = r.Name, SubName = r.SubName}).ToList(); 48 return dtos; 49 } 50 51 [Consumes("application/json")] 52 [HttpPost] 53 public Msg Add([FromBody] Library library) 54 { 55 Msg msg = new Msg(); 56 if (library == null) 57 { 58 msg.code = 1; 59 msg.message = "对象为空"; 60 return msg; 61 } 62 else 63 { 64 var userId= HttpContext.Session.GetInt32("UserId"); 65 66 if (library.Id > 0) 67 { 68 //更新 69 var entity = dataContext.Librarys.Where(r => r.Id == library.Id).FirstOrDefault(); 70 if (entity != null) 71 { 72 entity.Name = library.Name; 73 entity.SubName = library.SubName; 74 entity.Location = library.Location; 75 entity.Manager= library.Manager; 76 entity.LastEditUser = userId.GetValueOrDefault(); 77 entity.LastEditTime = DateTime.Now; 78 dataContext.Librarys.Update(entity); 79 dataContext.SaveChanges(); 80 } 81 else { 82 msg.code = 1; 83 msg.message = "修改失败"; 84 return msg; 85 } 86 } 87 else 88 { 89 //新增 90 var entity = new LibraryEntity() 91 { 92 Id = library.Id, 93 Name = library.Name, 94 SubName = library.SubName, 95 Location = library.Location, 96 Manager = library.Manager, 97 CreateTime = DateTime.Now, 98 CreateUser = userId.GetValueOrDefault(), 99 LastEditTime = DateTime.Now,100 LastEditUser = userId.GetValueOrDefault(),101 };102 dataContext.Librarys.Add(entity);103 dataContext.SaveChanges();104 }105 msg.code = 0;106 msg.message = "success";107 return msg;108 }109 }110 111 [Consumes("application/json")]112 [HttpPost]113 public Msg Delete([FromBody] Library library)114 {115 Msg msg = new Msg();116 if (library == null)117 {118 msg.code = 1;119 msg.message = "对象为空";120 return msg;121 }122 else123 {124 if (library.Id > 0)125 {126 var entity = dataContext.Librarys.Where(r => r.Id == library.Id).FirstOrDefault();127 if (entity != null)128 {129 dataContext.Librarys.Remove(entity);130 dataContext.SaveChanges();131 msg.code = 0;132 msg.message = "success";133 }134 else135 {136 msg.code = 1;137 msg.message = "对象不存在或已被删除";138 }139 }140 else141 {142 143 msg.code = 1;144 msg.message = "对象Id小于0";145 }146 return msg;147 }148 }149 }150 }
6. 书室功能运行测试
经过以上几个步骤,即可完成书室管理的基本操作,主要包括书室的查询,新增,编辑,删除,已经分页等功能,如下所示:
书室功能新增或编辑页面
书架管理
书架管理是在书室管理的基础之上,进步细化书架的具体位置,方便用户查找书籍。
1. 书架数据表结构
书架表主要包括Id(唯一标识),LibraryId(书室表的唯一标识),Row(行),Column(排)等几个字段。如下所示:
2. 书架数据表实体类
数据表实体类和数据表一一对应,主要通过EntityFrameword与数据库进行映射。如下所示:
1 namespace CLMS.Entity 2 { 3 ///4 /// 阅览架 5 /// 6 public class BookRackEntity 7 { 8 ///9 /// 唯一标识10 /// 11 public int Id { get; set; }12 13 ///14 /// 图书室ID15 /// 16 public int LibraryId { get; set; }17 18 ///19 /// 排20 /// 21 public int Row { get; set; }22 23 ///24 /// 列25 /// 26 public int Column { get; set; }27 28 ///29 /// 描述30 /// 31 public string Description { get; set; }32 33 ///34 /// 创建时间35 /// 36 public DateTime CreateTime { get; set; }37 38 ///39 /// 当前登录的账号的ID40 /// 41 public int CreateUser { get; set; }42 43 ///44 /// 最后编辑时间45 /// 46 public DateTime LastEditTime { get; set; }47 48 ///49 /// 最后修改人50 /// 51 public int LastEditUser { get; set; }52 }53 }
3. 书架页面布局
书架管理需要关系书室信息,即哪一个书室的第几行,第几列,以下拉框的形式呈现。如下所示:
12 34 7书室管理 5书架管理 68 21 229 1110 12 1413 15 17查询 1618 20新增 1923 3624 25 26 27 28 29 30 31 35编辑 32删除 33 3437 38 64 6539 59 6340 4941 4846 47 50 5251 53 5554 56 5857
4. 书架数据交互
数据交互通过JS脚本进行,书写格式和VUE2.0保持一致,在页面启动时,加载所有的书架信息,并绑定到el-table对象,所以需要在mounted函数中增加调用向服务器端发出请求,当用户新增或编辑保存时,通过axios发送请求到服务端接口。
1 <script> 2 var app= new Vue({ 3 el: "#app", 4 data:function() { 5 return { 6 queryCondition:{ 7 Name: "", 8 SubName: "", 9 }, 10 addOrEditForm:{ 11 Id:0, 12 libraryId:"", 13 Row: "", 14 Column: "", 15 Description:"", 16 }, 17 formLabelWidth: "120px", 18 tableData: [], 19 librarys:[], 20 total:0, 21 pageSize:10, 22 currentPage:1, 23 dialogFormVisible: false, 24 } 25 }, 26 mounted:function(){ 27 this.query(1); 28 }, 29 methods: { 30 handleOpen(key, keyPath) { 31 console.log(key, keyPath); 32 }, 33 handleClose(key, keyPath) { 34 console.log(key, keyPath); 35 }, 36 formatter(row, column) { 37 return row.address; 38 }, 39 handleQuery(){ 40 this.query(1); 41 console.log("query"); 42 }, 43 handlePageChanged(val){ 44 this.query(val); 45 }, 46 handlePrevClick(val){ 47 //this.query(val); 48 }, 49 handleNextClick(val){ 50 //this.query(val); 51 }, 52 handleEdit(index,row){ 53 var that=this; 54 that.librarys=[]; 55 that.addOrEditForm.Id=0; 56 axios.get("/Library/QueryAll",{params: {}}).then(function (response) { 57 if(response.status==200){ 58 var data = response.data; 59 for (let i = 0; i < data.length; i++) { 60 that.librarys.push({ 61 Id: data[i].id, 62 Label: data[i].name+"-"+data[i].subName 63 }); 64 } 65 that.dialogFormVisible=true; 66 } 67 console.log(that.librarys); 68 console.log(response); 69 }).catch(function (error) { 70 console.log(error); 71 }); 72 console.log("当前index="+index); 73 console.log(row); 74 this.addOrEditForm.Id=row.Id; 75 this.addOrEditForm.libraryId=row.libraryId; 76 this.addOrEditForm.Row=row.Row; 77 this.addOrEditForm.Column=row.Column; 78 this.addOrEditForm.Description=row.Description; 79 this.dialogFormVisible=true; 80 }, 81 handleDelete(index,row){ 82 console.log("当前index="+index); 83 console.log(row); 84 this.$confirm("确定要删除编号为"+row.Id+"的书架吗?", "提示", { 85 confirmButtonText: "确定", 86 cancelButtonText: "取消", 87 type: "warning" 88 }).then(() => { 89 var that=this; 90 axios.post("/BookRack/Delete", { 91 Id:row.Id 92 }).then(function (response) { 93 if(response.status==200){ 94 var msg = response.data; 95 console.log(msg); 96 if(msg.code=="0"){ 97 //刷新页面 98 that.$message({ 99 type: "success",100 message: "删除成功!"101 });102 that.query(1);103 }else{104 that.$message.error(msg.message);105 }106 }107 console.log(response);108 }).catch(function (error) {109 that.$message.error(error);110 });111 console.log("delete");112 }).catch(() => {113 this.$message({114 type: "info",115 message: "已取消删除"116 }); 117 });118 },119 handleAdd(){120 var that=this;121 that.librarys=[];122 that.addOrEditForm.Id=0;123 that.addOrEditForm.libraryId="";124 that.addOrEditForm.Row= "";125 that.addOrEditForm.Column= "";126 that.addOrEditForm.Description="";127 axios.get("/Library/QueryAll",{params: {}}).then(function (response) {128 if(response.status==200){129 var data = response.data;130 for (let i = 0; i < data.length; i++) {131 that.librarys.push({132 Id: data[i].id,133 Label: data[i].name+"-"+data[i].subName134 });135 }136 that.dialogFormVisible=true;137 }138 console.log(that.librarys);139 console.log(response);140 }).catch(function (error) {141 console.log(error);142 });143 144 console.log("add");145 },146 handleSave(){147 var that=this;148 axios.post("/BookRack/Add", {149 Id:this.addOrEditForm.Id,150 LibraryId:this.addOrEditForm.libraryId,151 Row:this.addOrEditForm.Row,152 Column:this.addOrEditForm.Column,153 Description:this.addOrEditForm.Description,154 }).then(function (response) {155 if(response.status==200){156 var msg = response.data;157 console.log(msg);158 if(msg.code=="0"){159 that.dialogFormVisible=false;160 //刷新页面161 that.query(1);162 }else{163 window.alert(msg.message);164 }165 console.log(that.dialogFormVisible);166 }167 console.log(response);168 }).catch(function (error) {169 console.log(error);170 });171 console.log("save");172 },173 query(pageNum){174 var that = this;175 this.tableData=[];176 console.log("query");177 axios.get("/BookRack/Query",{params: {178 Name:this.queryCondition.Name,179 SubName:this.queryCondition.SubName,180 PageSize:this.pageSize,181 PageNum:pageNum182 }}).then(function (response) {183 if(response.status==200){184 var data = response.data;185 var count=data.count;186 that.total = count;187 for (let i = 0; i < data.items.length; i++) {188 that.tableData.push({189 Id: data.items[i].id,190 libraryId:data.items[i].libraryId,191 Name: data.items[i].name,192 SubName: data.items[i].subName,193 Row : data.items[i].row,194 Column : data.items[i].column,195 Location : data.items[i].location,196 Description:data.items[i].description,197 CreateTime: data.items[i].createTime,198 });199 }200 }201 console.log(that.tableData);202 console.log(response);203 }).catch(function (error) {204 console.log(error);205 });206 }207 }208 });209 </script>
5. 书架控制器逻辑BookRackController
控制器主要用于响应用户的请求,与数据库交互,并返回执行的结果信息。
1 namespace CLMS.Host.Controllers 2 { 3 public class BookRackController : Controller 4 { 5 private DataContext dataContext; 6 7 public BookRackController(DataContext context) 8 { 9 dataContext = context; 10 } 11 12 public IActionResult Index() 13 { 14 return View(); 15 } 16 17 ///18 /// 获取符合条件的查询 19 /// 20 /// 21 /// 22 /// 23 /// 24 ///25 [HttpGet] 26 public PagedRequest Query(string Name, string SubName, int pageNum, int pageSize) 27 { 28 Name = string.IsNullOrEmpty(Name) ? string.Empty : Name; 29 SubName = string.IsNullOrEmpty(SubName) ? string.Empty : SubName; 30 31 var entities = dataContext.Librarys.Where(r => r.Name.Contains(Name) && r.SubName.Contains(SubName)).Join(dataContext.BookRacks,l=>l.Id,b=>b.LibraryId,(l,b) =>new BookRack() {Name=l.Name,SubName=l.SubName,Location=l.Location,LibraryId=b.LibraryId,Id=b.Id,Row=b.Row,Column=b.Column,Description=b.Description,CreateTime=b.CreateTime }); 32 var total = entities.Count(); 33 var dtos = entities.Skip((pageNum - 1) * pageSize).Take(pageSize).ToList(); 34 return new PagedRequest () 35 { 36 count = total, 37 items = dtos, 38 }; 39 } 40 41 [Consumes("application/json")] 42 [HttpPost] 43 public Msg Add([FromBody] BookRack bookRack) 44 { 45 Msg msg = new Msg(); 46 if (bookRack == null) 47 { 48 msg.code = 1; 49 msg.message = "对象为空"; 50 return msg; 51 } 52 else 53 { 54 var userId = HttpContext.Session.GetInt32("UserId"); 55 56 if (bookRack.Id > 0) 57 { 58 //更新 59 var entity = dataContext.BookRacks.Where(r => r.Id == bookRack.Id).FirstOrDefault(); 60 if (entity != null) 61 { 62 entity.LibraryId = bookRack.LibraryId; 63 entity.Row = bookRack.Row; 64 entity.Column = bookRack.Column; 65 entity.Description = bookRack.Description; 66 entity.LastEditUser = userId.GetValueOrDefault(); 67 entity.LastEditTime = DateTime.Now; 68 dataContext.BookRacks.Update(entity); 69 dataContext.SaveChanges(); 70 } 71 else 72 { 73 msg.code = 1; 74 msg.message = "修改失败"; 75 return msg; 76 } 77 } 78 else 79 { 80 //新增 81 var entity = new BookRackEntity() 82 { 83 Id = bookRack.Id, 84 LibraryId = bookRack.LibraryId, 85 Row = bookRack.Row, 86 Column = bookRack.Column, 87 Description = bookRack.Description, 88 CreateTime = DateTime.Now, 89 CreateUser = userId.GetValueOrDefault(), 90 LastEditTime = DateTime.Now, 91 LastEditUser = userId.GetValueOrDefault(), 92 }; 93 dataContext.BookRacks.Add(entity); 94 dataContext.SaveChanges(); 95 } 96 msg.code = 0; 97 msg.message = "success"; 98 return msg; 99 }100 }101 102 [Consumes("application/json")]103 [HttpPost]104 public Msg Delete([FromBody] BookRack bookRack)105 {106 Msg msg = new Msg();107 if (bookRack == null)108 {109 msg.code = 1;110 msg.message = "对象为空";111 return msg;112 }113 else114 {115 if (bookRack.Id > 0)116 {117 var entity = dataContext.BookRacks.Where(r => r.Id == bookRack.Id).FirstOrDefault();118 if (entity != null)119 {120 dataContext.BookRacks.Remove(entity);121 dataContext.SaveChanges();122 msg.code = 0;123 msg.message = "success";124 }125 else126 {127 msg.code = 1;128 msg.message = "对象不存在或已被删除";129 }130 }131 else132 {133 134 msg.code = 1;135 msg.message = "对象Id小于0";136 }137 return msg;138 }139 }140 }141 }
6. 运行测试
经过以上几个步骤,即可完成书架管理的基本操作,主要包括书架的查询,新增,编辑,删除,已经分页等功能,如下所示:
新增或编辑页面
以上就是校园图书管理系统的书室管理及书架管理功能实现,功能正在开发完善中,后续功能再继续介绍。旨在抛砖引玉,一起学习,共同进步。
-
ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)
随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP NETCore也应运而生。本文主要基于ASP ...
来源: -
Blazor入门100天 : 身份验证和授权 (3) - DB改Sqlite
目录 1 **建立默认带身份验证Blazor程序** 2 角色 组件 特性 过程逻辑 3 DB改Sqlite 4 将自定义...
来源: ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)
Blazor入门100天 : 身份验证和授权 (3) - DB改Sqlite
天天资讯:卖爆了!特斯拉拟提高上海工厂产量:新一轮大降价要来?
【世界新视野】独占高频版骁龙8 Gen2!三星Galaxy S23/S23+发布:5699元起
世界今热点:顶配1.32万元!三星Galaxy S23 Ultra正式发布:2亿像素无敌
“九转大肠”原综艺:比吃答辩还要抽象10倍
144MB缓存秒所有!AMD锐龙7000X3D上市时间、价格公布
天天热资讯!关于STM32CubeIDE无法正常启动GDB服务端的解决办法
世界要闻:【算法训练营day36】LeetCode435. 无重叠区间 LeetCode763. 划分字母区间 LeetCode56. 合并区间
环球信息:小米年货节终极战报出炉:全渠道支付金额破178亿!
今日快讯:Intel Arc显卡驱动DX9游戏性能累计提升43%!性价比秒杀RTX 3060
每日看点!路虎在中国混不下去了
环球新消息丨【缓存】有关HTTP缓存的总结
如何使用单纯的`WebAssembly`
世界新消息丨国美电器董事长发文“反思”国美失势了:核心要务是活下去
1岁萌娃躺地耍赖父母转身离开 这招对90后不管用:网友点赞
天天速递!谁最靠谱?四大品牌23万块硬盘最新故障率报告公布:希捷让人看不懂
Blazor入门100天 : 身份验证和授权 (1)
2023牛客寒假算法基础集训营5
Spring:AOP
世界观察:试用ChatGPT
骁龙8+性能被榨干了!一加Ace 2散热拉满:极致流畅
【时快讯】《狂飙》大结局!高启强手机穿帮:提前两年用上iPhone 8 Plus
《狂飙》的艺术总监是张译:本人主演电影票房破200亿
环球关注:国内第一大加速器里程碑诞生!面积约合20余个足球场
环球视讯!《流浪地球2》导演郭帆:希望能为科幻电影蹚一条路
玩《原神》最爽的手机!一加Ace 2超10万人预约
环球今日报丨宏碁推出TravelMate B系列笔记本:Intel N系列超低功耗U
游客偷带食物喂兔子致大批死亡:还喂发烂叶子 遭网友疯狂谴责
全球速递!海尔发布博越G43系列笔记本:搭载国产X86 CPU
今日精选:尴尬一幕:近年来论文数量激增 但科技界没有创新 3大原因
环球微资讯!300人研发三年!腾讯自研开放世界生存手游《黎明觉醒:生机》定档
今日聚焦!女子价值近20万元的钻戒丢失在高铁站 后续来了
VS Winform程序制作安装包
【世界聚看点】FluentReader 高颜值的rss阅读器
全球热头条丨易基因|细菌全基因组甲基化纳米孔测序(ONT):技术推介
每日简讯:我在京东做研发 | 揭秘支撑京东万人规模技术人员协作的行云DevOps平台
环球热推荐:再探前端低代码的“野路子”
美国一公司计划复活灭绝的渡渡鸟:还有猛犸象
PC最坏的日子快过去了 苏妈放言:AMD即将触底反弹
环球快讯:500块的产品只要10元 小米商城BUG价遭爆单 后续来了:退单返券
全球微动态丨256G不够了!博主买的小米12S Pro 512G已用掉300多G:光微信就70G
快讯:官方回应小爱下线山东话等方言识别 :无需专门设置也能听懂
记录--原生 canvas 如何实现大屏?
环球关注:鲁大师1月新机性能/流畅榜发布:一加11无悬念夺冠
全球资讯:剧毒可致死!澳大利亚失踪放射性胶囊被寻回:“大海捞针”式搜寻
【报资讯】女子宝娟嗓20年疑似癔症:16岁突然变哑、嗓子却没问题
《流浪地球3》粮食稳了?中科院合成淀粉蛋白新突破
环球今热点:动物园猴子打架输了逃到狮子园:结果好险
Java多线程:Future和FutureTask
【全球时快讯】MySQL-JDBC反序列化分析
快报:市监局回应12.4万保时捷遭抢购后下架:规模较大 正加紧调查
每日快讯!下饭神器:乌江榨菜30袋19.9元大促
快消息!魅族20就快来了!已有魅友抢先体验:称“感觉不错”
焦点快看:故障率惊人!三星昔日旗舰SSD 980 Pro严重翻车 用户投诉多到爆官方出手修复
世界快播:雷军对日本任天堂公司欣赏至极:推崇其为“世界的主宰”
全球新动态:如何将使用中的域名平滑迁移到京东云?(以原域名注册、域名解析都在万网为例)
环球简讯:最新最常用的Windows/office激活工具
世界今热点:HTTP学习笔记3-HTTP报文
关注:【深读】网络测控系统时钟同步PTP时间同步服务器
环球快报:Git 客户端基本使用及新手常见问题
“造假”作弊频发 ChatGPT官方鉴别器紧急发布!不想却遭遇群嘲
15万!特斯拉新车Model Q到底有吗:网友喊话如果这外形必冲?
世界热点!终于告别祖传67W!小米13 Ultra升级90W快充
环球热资讯!咋想的 雪佛兰SUV加油站里试图插队:男女肉身阻挡他车通行
每日看点!三年亏损170亿 昔日新能源车一哥“北汽蓝谷”跌下神坛
分享会上狂吹MySQL的4大索引结构,没想到大家的鉴赏能力如此的~~~~
“靠服装就能抗菌抗病毒” 真有效还是智商税?
每日快报!大爷撞上奥迪老伴下车后秒晕倒 指责对方为啥停路边:交警到场结局舒适
环球观察:别想歪了!最新研究称西地那非“伟哥”真的能延长男性寿命
【算法训练营day35】LeetCode860. 柠檬水找零 LeetCode406. 根据身高重建队列 LeetCode452. 用最少数量的箭引爆气球
MAUI新生6.4-集合内容类控件难点:CollectionView
今日最新!5万年一遇!绿色“天外来客”正靠近地球:有望肉眼观测
网易发布暴雪游戏退款说明:退款申请截止到6月30日
这才是过年聚会的家 游戏区、棋牌区、动画片区 网友:太和谐了
世界微头条丨三大运营商合力:我国有11亿5G用户!4G用户瑟瑟发抖 求别降速
全球最资讯丨大型国有银行采购摩尔线程国产显卡!造型首次公开
【世界新要闻】try catch finally,try里有return,finally还执行么?
基于k8s的zookeeper搭建
读Java8函数式编程笔记07_设计和架构的原则
20万能买到?极氪003最新预告:3米级加速秒杀百万超跑
滚导和盘托出未来规划 超人新片定档2025年
全球观察:12.4万买下保时捷帕纳梅拉 涉事博主:无成本新车营销成功案例
3层果肉 层层爆浆 榴莲西施榴莲千层蛋糕6寸:两盒69.9元
环球最资讯丨博主怒斥极氪汽车站不起来 居然致敬燃油车奥迪Q3
三星s3370手机有触控笔吗?三星s3370手机参数
怎么删除地址栏里的网址记录?如何恢复删除的网址记录?
tdscdma手机怎么样?tdscdma手机铃声静音怎么解除?
魅族m8什么时候上市的?魅族m8手机参数
All Share Play是什么意思?All Share Play功能是什么?
一劳永逸打一地名是什么?一劳永逸和一蹴而就的区别是什么?
怒晴湘西讲的是什么故事?怒晴湘西大结局是什么?
阳光大道是什么意思?阳光大道打一个生肖是什么?
世界聚焦:linux服务器运行java项目, 监控查看内存、储存空间和cpu占用率
热点!火山引擎 DataTester:0 代码也能实施 A/B 测试的实验平台
世界滚动:一看就懂!任务提交的资源判断在Taier中的实践
全球热文:全球首个面向遥感任务设计的亿级视觉Transformer大模型
萝卜喝醉了会变成什么?脑筋急转弯大全
南国新川是什么意思?南国新川在哪里?
可测水温、室温、体温 一机多用:可孚红外电子体温枪29.9元发车