ASP.NET Core+Element+SQL Server开发校园图书管理系统(三)
创始人
2024-05-22 16:55:45
0

随着技术的进步,跨平台开发已经成为了标配,在此大背景下,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与数据库进行映射。如下所示:

namespace CLMS.Entity
{/// /// 图书馆实体/// public class LibraryEntity{/// /// 唯一标识/// public int Id { get; set; }/// /// 图书馆名称/// public string? Name { get; set; }/// /// 图书室名称/// public string? SubName { get; set; }/// /// 位置/// public string? Location { get; set; }/// /// 管理员/// public string? Manager { get; set; }/// /// 创建时间/// public DateTime CreateTime { get; set; }/// /// 当前登录的账号的ID/// public int CreateUser { get; set; }/// /// 最后编辑时间/// public DateTime LastEditTime { get; set; }/// /// 最后修改人/// public int LastEditUser { get; set; }}
}

3. 书室页面布局

书室管理,主要用户查询,新增,修改,删除书室等基本操作,页面布局源码如下所示:

4. 书室页面数据交互

数据交互通过JS脚本进行,书写格式和VUE2.0保持一致,在页面启动时,加载所有的书室信息,并绑定到el-table对象,所以需要在mounted函数中增加调用向服务器端发出请求,当用户新增或编辑保存时,通过axios发送请求到服务端接口。

5. 书室控制器逻辑LibraryController

控制器主要用于响应用户的请求,与数据库交互,并返回执行的结果信息。

namespace CLMS.Host.Controllers
{public class LibraryController : Controller{private DataContext dataContext;public LibraryController(DataContext context){dataContext = context;}public IActionResult Index(){return View();}/// /// 获取符合条件的查询/// /// /// /// /// /// [HttpGet]public PagedRequest Query(string Name, string SubName, int pageNum, int pageSize){Name = string.IsNullOrEmpty(Name) ? string.Empty : Name;SubName = string.IsNullOrEmpty( SubName) ? string.Empty:SubName;var entities = dataContext.Librarys.Where(r => r.Name.Contains(Name) && r.SubName.Contains(SubName));var total = entities.Count();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();return new PagedRequest(){count = total,items = dtos,};}/// /// 查询所有信息/// /// [HttpGet]public List QueryAll() {var dtos = dataContext.Librarys.Select(r=> new Library() { Id = r.Id, Name = r.Name, SubName = r.SubName}).ToList();return dtos;}[Consumes("application/json")][HttpPost]public Msg Add([FromBody] Library library){Msg msg = new Msg();if (library == null){msg.code = 1;msg.message = "对象为空";return msg;}else{var userId= HttpContext.Session.GetInt32("UserId");if (library.Id > 0){//更新var entity = dataContext.Librarys.Where(r => r.Id == library.Id).FirstOrDefault();if (entity != null){entity.Name = library.Name;entity.SubName = library.SubName;entity.Location = library.Location;entity.Manager= library.Manager;entity.LastEditUser = userId.GetValueOrDefault();entity.LastEditTime = DateTime.Now;dataContext.Librarys.Update(entity);dataContext.SaveChanges();}else {msg.code = 1;msg.message = "修改失败";return msg;}}else{//新增var entity = new LibraryEntity(){Id = library.Id,Name = library.Name,SubName = library.SubName,Location = library.Location,Manager = library.Manager,CreateTime = DateTime.Now,CreateUser = userId.GetValueOrDefault(),LastEditTime = DateTime.Now,LastEditUser = userId.GetValueOrDefault(),};dataContext.Librarys.Add(entity);dataContext.SaveChanges();}msg.code = 0;msg.message = "success";return msg;}}[Consumes("application/json")][HttpPost]public Msg Delete([FromBody] Library library){Msg msg = new Msg();if (library == null){msg.code = 1;msg.message = "对象为空";return msg;}else{if (library.Id > 0){var entity = dataContext.Librarys.Where(r => r.Id == library.Id).FirstOrDefault();if (entity != null){dataContext.Librarys.Remove(entity);dataContext.SaveChanges();msg.code = 0;msg.message = "success";}else{msg.code = 1;msg.message = "对象不存在或已被删除";}}else{msg.code = 1;msg.message = "对象Id小于0";}return msg;}}}
}

6. 书室功能运行测试

经过以上几个步骤,即可完成书室管理的基本操作,主要包括书室的查询,新增,编辑,删除,已经分页等功能,如下所示:

书室功能新增或编辑页面

书架管理

书架管理是在书室管理的基础之上,进步细化书架的具体位置,方便用户查找书籍。

1. 书架数据表结构

书架表主要包括Id(唯一标识),LibraryId(书室表的唯一标识),Row(行),Column(排)等几个字段。如下所示:

2. 书架数据表实体类

数据表实体类和数据表一一对应,主要通过EntityFrameword与数据库进行映射。如下所示:

namespace CLMS.Entity
{/// /// 阅览架/// public class BookRackEntity{/// /// 唯一标识/// public int Id { get; set; }/// /// 图书室ID/// public int LibraryId { get; set; }/// /// 排/// public int Row { get; set; }/// /// 列/// public int Column { get; set; }/// /// 描述/// public string Description { get; set; }/// /// 创建时间/// public DateTime CreateTime { get; set; }/// /// 当前登录的账号的ID/// public int CreateUser { get; set; }/// /// 最后编辑时间/// public DateTime LastEditTime { get; set; }/// /// 最后修改人/// public int LastEditUser { get; set; }}
}

3. 书架页面布局

书架管理需要关系书室信息,即哪一个书室的第几行,第几列,以下拉框的形式呈现。如下所示:

4. 书架数据交互

数据交互通过JS脚本进行,书写格式和VUE2.0保持一致,在页面启动时,加载所有的书架信息,并绑定到el-table对象,所以需要在mounted函数中增加调用向服务器端发出请求,当用户新增或编辑保存时,通过axios发送请求到服务端接口。

5. 书架控制器逻辑BookRackController

控制器主要用于响应用户的请求,与数据库交互,并返回执行的结果信息。

namespace CLMS.Host.Controllers
{public class BookRackController : Controller{private DataContext dataContext;public BookRackController(DataContext context){dataContext = context;}public IActionResult Index(){return View();}/// /// 获取符合条件的查询/// /// /// /// /// /// [HttpGet]public PagedRequest Query(string Name, string SubName, int pageNum, int pageSize){Name = string.IsNullOrEmpty(Name) ? string.Empty : Name;SubName = string.IsNullOrEmpty(SubName) ? string.Empty : SubName;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 });var total = entities.Count();var dtos = entities.Skip((pageNum - 1) * pageSize).Take(pageSize).ToList();return new PagedRequest(){count = total,items = dtos,};}[Consumes("application/json")][HttpPost]public Msg Add([FromBody] BookRack bookRack){Msg msg = new Msg();if (bookRack == null){msg.code = 1;msg.message = "对象为空";return msg;}else{var userId = HttpContext.Session.GetInt32("UserId");if (bookRack.Id > 0){//更新var entity = dataContext.BookRacks.Where(r => r.Id == bookRack.Id).FirstOrDefault();if (entity != null){entity.LibraryId = bookRack.LibraryId;entity.Row = bookRack.Row;entity.Column = bookRack.Column;entity.Description = bookRack.Description;entity.LastEditUser = userId.GetValueOrDefault();entity.LastEditTime = DateTime.Now;dataContext.BookRacks.Update(entity);dataContext.SaveChanges();}else{msg.code = 1;msg.message = "修改失败";return msg;}}else{//新增var entity = new BookRackEntity(){Id = bookRack.Id,LibraryId = bookRack.LibraryId,Row = bookRack.Row,Column = bookRack.Column,Description = bookRack.Description,CreateTime = DateTime.Now,CreateUser = userId.GetValueOrDefault(),LastEditTime = DateTime.Now,LastEditUser = userId.GetValueOrDefault(),};dataContext.BookRacks.Add(entity);dataContext.SaveChanges();}msg.code = 0;msg.message = "success";return msg;}}[Consumes("application/json")][HttpPost]public Msg Delete([FromBody] BookRack bookRack){Msg msg = new Msg();if (bookRack == null){msg.code = 1;msg.message = "对象为空";return msg;}else{if (bookRack.Id > 0){var entity = dataContext.BookRacks.Where(r => r.Id == bookRack.Id).FirstOrDefault();if (entity != null){dataContext.BookRacks.Remove(entity);dataContext.SaveChanges();msg.code = 0;msg.message = "success";}else{msg.code = 1;msg.message = "对象不存在或已被删除";}}else{msg.code = 1;msg.message = "对象Id小于0";}return msg;}}}
}

6. 运行测试

经过以上几个步骤,即可完成书架管理的基本操作,主要包括书架的查询,新增,编辑,删除,已经分页等功能,如下所示:

新增或编辑页面

 以上就是校园图书管理系统的书室管理及书架管理功能实现,功能正在开发完善中,后续功能再继续介绍。旨在抛砖引玉,一起学习,共同进步。

相关内容

热门资讯

安卓手机系统流畅版,极致性能与... 你有没有发现,最近你的安卓手机用起来是不是特别顺滑?没错,就是那种点屏幕就立刻响应的感觉,简直让人爱...
forest安卓系统换到苹果,... 你有没有想过,手机操作系统就像是我们生活中的不同道路,有时候,你可能觉得一条路走得太久了,想要换一条...
华为鸿蒙系统安卓平板,开启智能... 亲爱的读者们,你是否也像我一样,对科技圈的新鲜事儿充满好奇?今天,我要和你聊聊一个最近在科技圈掀起波...
安卓系统藏族软件下载,精选安卓... 安卓系统藏族软件下载:探索藏族文化的数字新篇章在数字化时代,手机已经成为我们生活中不可或缺的一部分。...
显示安卓系统耗电大,深度剖析原... 手机电量总是不够用?是不是觉得安卓系统耗电特别大?别急,今天就来给你揭秘安卓系统耗电的秘密,让你手机...
抽取原装安卓系统驱动,深度挖掘... 你有没有遇到过这种情况?手机里的安卓系统突然卡顿,或者某个应用突然罢工,这时候你是不是想给它来个“大...
安卓系统手机游戏排行,热门游戏... 你有没有发现,最近你的手机里是不是又多了一款游戏?没错,安卓系统手机游戏排行又更新了!今天,就让我带...
安卓系统叫AR 特效,安卓系统... 你知道吗?最近在安卓系统上出现了一个超级酷炫的新功能,它就是AR特效!是不是听起来就让人兴奋不已?那...
安卓系统特有的功能,解锁智能生... 你知道吗?安卓系统这个家伙,简直就是智能手机界的“全能选手”。它不仅拥有丰富的应用市场,还能给你带来...
iqoo 安卓系统王者跳帧,王... 最近有没有发现你的iqoo手机在玩王者荣耀时突然卡顿,画面跳帧,简直让人抓狂啊!别急,今天就来给你揭...
安卓系统平板画图,创意无限的艺... 你有没有想过,用平板画图竟然也能这么有趣呢?尤其是当你手握安卓系统平板的时候,那感觉简直就像拥有了整...
安卓系统韩文变成中文,安卓系统... 你是不是也遇到过这种情况?手机里突然冒出了韩文,而你却一头雾水,完全看不懂?别急,今天就来给你详细解...
国内邮箱注册安卓系统,轻松掌握... 你有没有想过,为什么你的手机里会有那么多邮箱呢?是不是每次注册新账号,都感觉像是在进行一场数字版的“...
苹果系统和安卓系统合作,跨界合... 你知道吗?最近科技圈可是炸开了锅,因为苹果系统和安卓系统竟然要联手合作啦!这可不是闹着玩的,两个在智...
安卓系统怎么篡改位置,轻松伪装... 你有没有想过,手机里的位置信息竟然也能被篡改?没错,就是那个我们平时用来导航、找餐馆、定位好友的安卓...
kindle 刷原生安卓系统,... 亲爱的读者们,你是否也有过这样的经历:拥有一台Kindle,却因为系统不够流畅而感到烦恼?别担心,今...
安卓点歌系统连电脑,打造个性化... 你有没有想过,你的安卓手机里的点歌系统竟然可以和电脑无缝连接呢?这听起来是不是很神奇?没错,今天就要...
那个电视搭载安卓系统,智能娱乐... 你有没有想过,家里的电视竟然也能搭载安卓系统?没错,就是那个曾经只存在于手机和平板电脑上的操作系统,...
安卓系统反黄软件,净化网络环境 你有没有发现,随着智能手机的普及,我们每天的生活越来越离不开这个小小的屏幕了。但是,你知道吗?在这个...
安卓怎么测试系统好坏,安卓系统... 你有没有想过,你的安卓手机是不是真的像你想象中那么强大呢?别急,今天就来给你揭秘,怎么测试安卓系统的...