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. 运行测试

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

新增或编辑页面

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

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...