翼度科技»论坛 编程开发 .net 查看内容

ASP.NET Core+Element+SQL Server开发校园图书管理系统(四)

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
随着技术的进步,跨平台开发已经成为了标配,在此大背景下,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库。
功能介绍

本文主要介绍书籍管理和借还管理两个功能,如下所示:

  • 图书管理,主要包括书籍的检索,新增,修改,删除等基本功能,另外书籍的存放位置和书架ID相关,书架又与书室相关,所有相对比较复杂。
  • 借还管理,主要根据用于输入或扫描的ISBN号,进行借阅以及归还,主要记录借阅人,借阅时间,借阅经手人,归还时间,归还经手人等信息。
图书管理

1. Book表结构

图书管理,主要是对Book表的CRUD操作,表结构如下所示:

 
 其中BookRackId为书架ID,与BookRack表的外键。
2. Book表实体类

Book表实体类是数据表的数据映射,和数据表一一对应,如下所示:
  1. 1 namespace CLMS.Entity
  2. 2 {
  3. 3     /// <summary>
  4. 4     /// 图书实体
  5. 5     /// </summary>
  6. 6     public class BookEntity
  7. 7     {
  8. 8         /// <summary>
  9. 9         /// 唯一标识
  10. 10         /// </summary>
  11. 11         public int Id { get; set; }
  12. 12
  13. 13         /// <summary>
  14. 14         /// 图书编号
  15. 15         /// </summary>
  16. 16         public string ISBN { get; set; }
  17. 17
  18. 18         /// <summary>
  19. 19         /// 图书名称
  20. 20         /// </summary>
  21. 21         public string Name { get; set; }
  22. 22
  23. 23         /// <summary>
  24. 24         /// 图书作者
  25. 25         /// </summary>
  26. 26         public string Author { get; set; }
  27. 27
  28. 28         /// <summary>
  29. 29         /// 图书出版社
  30. 30         /// </summary>
  31. 31         public string Publisher { get; set; }
  32. 32
  33. 33         /// <summary>
  34. 34         /// 出版时间
  35. 35         /// </summary>
  36. 36         public DateTime PublishDate { get; set; }
  37. 37
  38. 38         /// <summary>
  39. 39         /// 图书类型
  40. 40         /// </summary>
  41. 41         public string BookType { get; set; }
  42. 42
  43. 43         /// <summary>
  44. 44         /// 描述
  45. 45         /// </summary>
  46. 46         public string Description { get; set; }
  47. 47
  48. 48         /// <summary>
  49. 49         /// 书架ID
  50. 50         /// </summary>
  51. 51         public long BookRackId { get; set; }
  52. 52
  53. 53         /// <summary>
  54. 54         /// 创建时间
  55. 55         /// </summary>
  56. 56         public DateTime CreateTime { get; set; }
  57. 57
  58. 58         /// <summary>
  59. 59         /// 当前登录的账号的ID
  60. 60         /// </summary>
  61. 61         public int CreateUser { get; set; }
  62. 62
  63. 63         /// <summary>
  64. 64         /// 最后编辑时间
  65. 65         /// </summary>
  66. 66         public DateTime? LastEditTime { get; set; }
  67. 67
  68. 68         /// <summary>
  69. 69         /// 最后修改人
  70. 70         /// </summary>
  71. 71         public int LastEditUser { get; set; }
  72. 72     }
  73. 73 }
复制代码
3. 图书管理页面布局

图书管理页面主要包括对书籍的查询,新增,编辑,删除等操作,页面布局如下所示:
  1.   1
  2.   2     <template>
  3.   3         <el-breadcrumb separator-class="el-icon-arrow-right">
  4.   4             <el-breadcrumb-item>图书管理</el-breadcrumb-item>
  5.   5             <el-breadcrumb-item>图书管理</el-breadcrumb-item>
  6.   6         </el-breadcrumb>
  7.   7         <el-form :inline="true" :model="queryCondition" class="demo-form-inline" style="margin-top: 10px; border: solid;border-width: 1px;border-color: #ebeef5;padding: 10px;">
  8.   8             <el-form-item label="书籍名称">
  9.   9                 <el-input v-model="queryCondition.Name" placeholder="书籍名称"></el-input>
  10. 10             </el-form-item>
  11. 11             <el-form-item label="出版社">
  12. 12                 <el-input v-model="queryCondition.Publisher" placeholder="出版社"></el-input>
  13. 13             </el-form-item>
  14. 14             <el-form-item>
  15. 15                 <el-button type="primary" v-on:click="handleQuery">查询</el-button>
  16. 16             </el-form-item>
  17. 17             <el-form-item>
  18. 18                 <el-button type="primary" v-on:click="handleAdd">新增</el-button>
  19. 19             </el-form-item>
  20. 20         </el-form>
  21. 21         
  22. 22         <el-table :data="tableData" style="width: 100%" border :default-sort="{prop: 'date', order: 'descending'}">
  23. 23             <el-table-column type="expand">
  24. 24               <template slot-scope="props">
  25. 25                 <el-form label-position="left" inline class="demo-table-expand">
  26. 26                   <el-form-item label="图书馆">
  27. 27                     <span>{{ props.row.LibraryName }}</span>
  28. 28                   </el-form-item>
  29. 29                   <el-form-item label="图书室">
  30. 30                     <span>{{ props.row.LibrarySubName }}</span>
  31. 31                   </el-form-item>
  32. 32                   <el-form-item label="排">
  33. 33                     <span>{{ props.row.Row }}</span>
  34. 34                   </el-form-item>
  35. 35                   <el-form-item label="列">
  36. 36                     <span>{{ props.row.Column }}</span>
  37. 37                   </el-form-item>
  38. 38                 </el-form>
  39. 39               </template>
  40. 40             </el-table-column>
  41. 41             <el-table-column prop="ISBN" label="ISBN" sortable ></el-table-column>
  42. 42             <el-table-column prop="Name" label="书籍名称" sortable ></el-table-column>
  43. 43             <el-table-column prop="Author" label="作者" sortable ></el-table-column>
  44. 44             <el-table-column prop="Publisher" label="出版社" sortable ></el-table-column>
  45. 45             <el-table-column prop="BookType" label="书籍类型" sortable ></el-table-column>
  46. 46             <el-table-column prop="CreateTime" label="上架时间" sortable ></el-table-column>
  47. 47             <el-table-column label="操作">
  48. 48                 <template slot-scope="scope">
  49. 49                     <el-button size="medium" type="primary" plain v-on:click="handleEdit(scope.$index,scope.row)">编辑</el-button>
  50. 50                     <el-button size="medium" type="danger" v-on:click="handleDelete(scope.$index,scope.row)">删除</el-button>
  51. 51                 </template>
  52. 52             </el-table-column>
  53. 53         </el-table>
  54. 54         <el-pagination background layout="prev, pager, next" :page-size="pageSize" :current-page="currentPage" :total="total" style="margin-top:10px;" v-on:current-change="handlePageChanged" v-on:prev-click="handlePrevClick" v-on:next-click="handleNextClick"></el-pagination>
  55. 55         <el-dialog title="书籍信息" :visible.sync="dialogFormVisible">
  56. 56           <el-form :model="addOrEditForm">
  57. 57             <el-form-item label="ISBN" :label-width="formLabelWidth">
  58. 58               <el-input v-model="addOrEditForm.ISBN" autocomplete="off"></el-input>
  59. 59             </el-form-item>
  60. 60             <el-form-item label="书籍名称" :label-width="formLabelWidth">
  61. 61               <el-input v-model="addOrEditForm.Name" autocomplete="off"></el-input>
  62. 62             </el-form-item>
  63. 63             <el-form-item label="书籍作者" :label-width="formLabelWidth">
  64. 64               <el-input v-model="addOrEditForm.Author" autocomplete="off"></el-input>
  65. 65             </el-form-item>
  66. 66             <el-form-item label="出版社" :label-width="formLabelWidth">
  67. 67               <el-input v-model="addOrEditForm.Publisher" autocomplete="off"></el-input>
  68. 68             </el-form-item>
  69. 69             <el-form-item label="出版时间" :label-width="formLabelWidth">
  70. 70               <el-date-picker v-model="addOrEditForm.PublishDate" type="date" placeholder="选择日期"></el-date-picker>
  71. 71             </el-form-item>
  72. 72             <el-form-item label="书籍类型" :label-width="formLabelWidth">
  73. 73               <el-select v-model="addOrEditForm.BookType" placeholder="请选择书籍类型">
  74. 74                 <el-option label="技术类" value="技术类"></el-option>
  75. 75                 <el-option label="科普类" value="科普类"></el-option>
  76. 76                 <el-option label="文学类" value="文学类"></el-option>
  77. 77                 <el-option label="社科类" value="社科类"></el-option>
  78. 78                 <el-option label="语言类" value="语言类"></el-option>
  79. 79               </el-select>
  80. 80             </el-form-item>
  81. 81             <el-form-item label="书籍描述" :label-width="formLabelWidth">
  82. 82               <el-input v-model="addOrEditForm.Description" autocomplete="off"></el-input>
  83. 83             </el-form-item>
  84. 84             <el-form-item label="存放位置" :label-width="formLabelWidth">
  85. 85               <el-tag v-model="addOrEditForm.Location" style="vertical-align:middle;">{{addOrEditForm.Location}}</el-tag>
  86. 86               <el-button icon="el-icon-place" circle v-on:click="handleLocation"></el-button>
  87. 87             </el-form-item>
  88. 88           </el-form>
  89. 89           
  90. 90             <el-button v-on:click="dialogFormVisible = false">取 消</el-button>
  91. 91             <el-button type="primary" v-on:click="handleSave">确 定</el-button>
  92. 92           
  93. 93           <el-dialog title="位置信息" :visible.sync="dialogLocationVisible">
  94. 94                <el-table :data="locationData" style="width: 100%" highlight-current-row border :default-sort="{prop: 'date', order: 'descending'}" v-on:current-change="handleLocationCurrentChange">
  95. 95                     <el-table-column prop="Name" label="图书馆" sortable ></el-table-column>
  96. 96                     <el-table-column prop="SubName" label="图书室" sortable ></el-table-column>
  97. 97                     <el-table-column prop="Row" label="排" sortable ></el-table-column>
  98. 98                     <el-table-column prop="Column" label="列" sortable ></el-table-column>
  99. 99                     <el-table-column prop="Description" label="描述" sortable ></el-table-column>
  100. 100                </el-table>
  101. 101                <el-pagination background layout="prev, pager, next" :page-size="locationPageSize" :current-page="locationCurrentPage" :total="locationTotal" style="margin-top:10px;" v-on:current-change="handleLocationPageChanged" v-on:prev-click="handleLocationPrevClick" v-on:next-click="handleLocationNextClick"></el-pagination>
  102. 102               
  103. 103                 <el-button v-on:click="dialogLocationVisible = false">取 消</el-button>
  104. 104                 <el-button type="primary" v-on:click="handleLocationSave">确 定</el-button>
  105. 105               
  106. 106            </el-dialog>
  107. 107         </el-dialog>
  108. 108         
  109. 109     </template>
  110. 110
复制代码
4. 图书管理数据交互

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

控制器主要用于响应用户的请求,与数据库交互,并返回执行的结果信息。
  1.   1 namespace CLMS.Host.Controllers
  2.   2 {
  3.   3     public class BookController : Controller
  4.   4     {
  5.   5         private DataContext dataContext;
  6.   6
  7.   7         public BookController(DataContext context) {
  8.   8             dataContext = context;
  9.   9         }
  10. 10
  11. 11         public IActionResult Index()
  12. 12         {
  13. 13             return View();
  14. 14         }
  15. 15
  16. 16         /// <summary>
  17. 17         /// 获取符合条件的查询
  18. 18         /// </summary>
  19. 19         /// <param name="Name"></param>
  20. 20         /// <param name="Publisher"></param>
  21. 21         /// <param name="pageNum"></param>
  22. 22         /// <param name="pageSize"></param>
  23. 23         /// <returns></returns>
  24. 24         [HttpGet]
  25. 25         public PagedRequest<Book> Query(string Name, string Publisher, int pageNum, int pageSize)
  26. 26         {
  27. 27             Name = string.IsNullOrEmpty(Name) ? string.Empty : Name;
  28. 28             Publisher = string.IsNullOrEmpty(Publisher) ? string.Empty : Publisher;
  29. 29             var bookEntities = dataContext.Books.Where(r => r.Name.Contains(Name) && r.Publisher.Contains(Publisher));
  30. 30             var total = bookEntities.Count();
  31. 31             var bookDtos = bookEntities.Skip((pageNum - 1) * pageSize).Take(pageSize).Select(r => new Book() { Id = r.Id, ISBN = r.ISBN, Name = r.Name, Author = r.Author, Publisher = r.Publisher, BookType = r.BookType,BookRackId=r.BookRackId,PublishDate=r.PublishDate, CreateTime = r.CreateTime,Description=r.Description }).ToList();
  32. 32
  33. 33             //位置
  34. 34             var bookRackIds = bookDtos.Select(r => r.BookRackId).ToList();
  35. 35             var locations = dataContext.BookRacks.Where(r => bookRackIds.Contains(r.Id)).Join(dataContext.Librarys, b => b.LibraryId, l => l.Id, (b, l) => 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 }).ToList();
  36. 36
  37. 37             bookDtos.ForEach(r => {
  38. 38                 var location = locations.FirstOrDefault(l => l.Id == r.BookRackId);
  39. 39                 if (location != null) {
  40. 40                     r.LibraryName = location.Name;
  41. 41                     r.LibrarySubName=location.SubName;
  42. 42                     r.Row=location.Row;
  43. 43                     r.Column=location.Column;
  44. 44                 }
  45. 45             });
  46. 46             //
  47. 47             return new PagedRequest<Book>()
  48. 48             {
  49. 49                 count = total,
  50. 50                 items = bookDtos,
  51. 51             };
  52. 52         }
  53. 53
  54. 54         [Consumes("application/json")]
  55. 55         [HttpPost]
  56. 56         public Msg Add([FromBody] Book book)
  57. 57         {
  58. 58             Msg msg = new Msg();
  59. 59             if (book == null)
  60. 60             {
  61. 61                 msg.code = 1;
  62. 62                 msg.message = "对象为空";
  63. 63                 return msg;
  64. 64             }
  65. 65             else
  66. 66             {
  67. 67                 var userId = HttpContext.Session.GetInt32("UserId");
  68. 68
  69. 69                 if (book.Id > 0)
  70. 70                 {
  71. 71                     //更新
  72. 72                     var entity = dataContext.Books.Where(r => r.Id == book.Id).FirstOrDefault();
  73. 73                     if (entity != null)
  74. 74                     {
  75. 75                         entity.BookRackId = book.BookRackId;
  76. 76                         entity.Author = book.Author;
  77. 77                         entity.Publisher = book.Publisher;
  78. 78                         entity.Description = book.Description;
  79. 79                         entity.BookType = book.BookType;
  80. 80                         entity.ISBN = book.ISBN;
  81. 81                         entity.Name = book.Name;
  82. 82                         entity.LastEditUser = userId.GetValueOrDefault();
  83. 83                         entity.LastEditTime = DateTime.Now;
  84. 84                         dataContext.Books.Update(entity);
  85. 85                         dataContext.SaveChanges();
  86. 86                     }
  87. 87                     else
  88. 88                     {
  89. 89                         msg.code = 1;
  90. 90                         msg.message = "修改失败";
  91. 91                         return msg;
  92. 92                     }
  93. 93                 }
  94. 94                 else
  95. 95                 {
  96. 96                     //新增
  97. 97                     var entity = new BookEntity()
  98. 98                     {
  99. 99                         BookRackId = book.BookRackId,
  100. 100                         Author = book.Author,
  101. 101                         Publisher = book.Publisher,
  102. 102                         PublishDate = book.PublishDate,
  103. 103                         Description = book.Description,
  104. 104                         BookType = book.BookType,
  105. 105                         ISBN = book.ISBN,
  106. 106                         Name = book.Name,
  107. 107                         CreateTime = DateTime.Now,
  108. 108                         CreateUser = userId.GetValueOrDefault(),
  109. 109                         LastEditTime = DateTime.Now,
  110. 110                         LastEditUser = userId.GetValueOrDefault(),
  111. 111                     };
  112. 112                     dataContext.Books.Add(entity);
  113. 113                     dataContext.SaveChanges();
  114. 114                 }
  115. 115                 msg.code = 0;
  116. 116                 msg.message = "success";
  117. 117                 return msg;
  118. 118             }
  119. 119         }
  120. 120
  121. 121         [Consumes("application/json")]
  122. 122         [HttpPost]
  123. 123         public Msg Delete([FromBody] Book book) {
  124. 124             Msg msg = new Msg();
  125. 125             if (book == null)
  126. 126             {
  127. 127                 msg.code = 1;
  128. 128                 msg.message = "对象为空";
  129. 129                 return msg;
  130. 130             }
  131. 131             else
  132. 132             {
  133. 133                 if (book.Id > 0)
  134. 134                 {
  135. 135                     var entity = dataContext.Books.Where(r => r.Id == book.Id).FirstOrDefault();
  136. 136                     if (entity != null)
  137. 137                     {
  138. 138                         dataContext.Books.Remove(entity);
  139. 139                         dataContext.SaveChanges();
  140. 140                         msg.code = 0;
  141. 141                         msg.message = "success";
  142. 142                     }
  143. 143                     else {
  144. 144                         msg.code = 1;
  145. 145                         msg.message = "对象不存在或已被删除";
  146. 146                     }
  147. 147                 }
  148. 148                 else {
  149. 149
  150. 150                     msg.code = 1;
  151. 151                     msg.message = "对象Id小于0";
  152. 152                 }
  153. 153                 return msg;
  154. 154             }
  155. 155         }
  156. 156     }
  157. 157 }
复制代码
6. 图书管理功能测试

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

图书借还

1. 图书借还数据表结构

图书借还包括图书的借阅和归还,两个功能,主要记录借阅人,借阅时间,归还时间,以及经手人,数据表结构如下所示:

 
2. 图书借还实体类

数据表实体类和数据表一一对应,主要通过EntityFrameword与数据库进行映射。如下所示:
  1. 1 namespace CLMS.Entity
  2. 2 {
  3. 3     /// <summary>
  4. 4     /// 借还记录
  5. 5     /// </summary>
  6. 6     public class CirculateEntity
  7. 7     {
  8. 8         /// <summary>
  9. 9         /// 唯一标识
  10. 10         /// </summary>
  11. 11         public int Id { get; set; }
  12. 12
  13. 13         /// <summary>
  14. 14         /// 图书标识
  15. 15         /// </summary>
  16. 16         public int BookId { get; set; }
  17. 17
  18. 18         /// <summary>
  19. 19         /// 是否归还
  20. 20         /// </summary>
  21. 21         public bool IsReturn { get; set; }
  22. 22
  23. 23         /// <summary>
  24. 24         /// 借阅人
  25. 25         /// </summary>
  26. 26         public string BorrowUser { get; set; }
  27. 27
  28. 28         /// <summary>
  29. 29         /// 借阅时间
  30. 30         /// </summary>
  31. 31         public DateTime BorrowTime { get; set; }
  32. 32
  33. 33         /// <summary>
  34. 34         /// 借阅确认人
  35. 35         /// </summary>
  36. 36         public string BorrowConfirmor { get; set; }
  37. 37
  38. 38         /// <summary>
  39. 39         /// 归还时间
  40. 40         /// </summary>
  41. 41         public DateTime? ReturnTime { get; set; }
  42. 42
  43. 43         /// <summary>
  44. 44         /// 归还确认人
  45. 45         /// </summary>
  46. 46         public string? ReturnConfirmor { get; set; }
  47. 47     }
  48. 48 }
复制代码
3. 图书借还页面布局

图书借还主要包括信息查询,借阅和归还等功能,页面布局如下所示:
  1. 1
  2. 2     <template>
  3. 3         <el-breadcrumb separator-class="el-icon-arrow-right">
  4. 4             <el-breadcrumb-item>图书管理</el-breadcrumb-item>
  5. 5             <el-breadcrumb-item>图书借阅及归还</el-breadcrumb-item>
  6. 6         </el-breadcrumb>
  7. 7         <el-form :inline="true" :model="queryCondition" class="demo-form-inline" style="margin-top: 10px; border: solid;border-width: 1px;border-color: #ebeef5;padding: 10px;">
  8. 8             <el-form-item label="书籍名称">
  9. 9                 <el-input v-model="queryCondition.Name" placeholder="书籍名称"></el-input>
  10. 10             </el-form-item>
  11. 11             <el-form-item>
  12. 12                 <el-button type="primary" v-on:click="handleQuery">查询</el-button>
  13. 13             </el-form-item>
  14. 14              <el-form-item>
  15. 15                 <el-button type="primary" v-on:click="handleBorrow">借阅</el-button>
  16. 16             </el-form-item>
  17. 17             <el-form-item>
  18. 18                 <el-button type="primary" v-on:click="handleReturn">归还</el-button>
  19. 19             </el-form-item>
  20. 20         </el-form>
  21. 21         <el-table :data="tableData" style="width: 100%" border :default-sort="{prop: 'BorrowTime', order: 'descending'}">
  22. 22             <el-table-column prop="Name" label="书籍名称" sortable ></el-table-column>
  23. 23             <el-table-column prop="ISBN" label="ISBN" sortable ></el-table-column>
  24. 24             <el-table-column prop="BorrowUser" label="借阅人" sortable ></el-table-column>
  25. 25             <el-table-column prop="BorrowTime" label="借阅时间" sortable ></el-table-column>
  26. 26             <el-table-column prop="BorrowConfirmor" label="借阅经手人" sortable ></el-table-column>
  27. 27             <el-table-column prop="IsReturn" label="是否归还" sortable ></el-table-column>
  28. 28             <el-table-column prop="ReturnTime" label="归还时间" sortable ></el-table-column>
  29. 29             <el-table-column prop="ReturnConfirmor" label="归还经手人" sortable ></el-table-column>
  30. 30         </el-table>
  31. 31         <el-pagination background layout="prev, pager, next" :page-size="pageSize" :current-page="currentPage" :total="total" style="margin-top:10px;" v-on:current-change="handlePageChanged" v-on:prev-click="handlePrevClick" v-on:next-click="handleNextClick"></el-pagination>
  32. 32         <el-dialog title="借阅信息" :visible.sync="dialogFormBorrowVisible">
  33. 33             <el-form :model="borrowForm">
  34. 34                 <el-form-item label="ISBN" :label-width="formLabelWidth">
  35. 35                   <el-input v-model="borrowForm.ISBN" autocomplete="off"></el-input>
  36. 36                 </el-form-item>
  37. 37                 <el-form-item label="书籍名称" :label-width="formLabelWidth">
  38. 38                   <el-input v-model="borrowForm.Name" autocomplete="off"></el-input>
  39. 39                 </el-form-item>
  40. 40                 <el-form-item label="借阅人" :label-width="formLabelWidth">
  41. 41                   <el-input v-model="borrowForm.BorrowUser" autocomplete="off"></el-input>
  42. 42                 </el-form-item>
  43. 43             </el-form>
  44. 44            
  45. 45                 <el-button v-on:click="dialogFormBorrowVisible = false">取 消</el-button>
  46. 46                 <el-button type="primary" v-on:click="handleSaveBorrow">确 定</el-button>
  47. 47            
  48. 48         </el-dialog>
  49. 49         <el-dialog title="归还信息" :visible.sync="dialogFormReturnVisible">
  50. 50             <el-form :model="returnForm">
  51. 51                 <el-form-item label="ISBN" :label-width="formLabelWidth">
  52. 52                   <el-input v-model="returnForm.ISBN" autocomplete="off"></el-input>
  53. 53                 </el-form-item>
  54. 54                 <el-form-item label="书籍名称" :label-width="formLabelWidth">
  55. 55                   <el-input v-model="returnForm.Name" autocomplete="off"></el-input>
  56. 56                 </el-form-item>
  57. 57             </el-form>
  58. 58            
  59. 59                 <el-button v-on:click="dialogFormReturnVisible = false">取 消</el-button>
  60. 60                 <el-button type="primary" v-on:click="handleSaveReturn">确 定</el-button>
  61. 61            
  62. 62         </el-dialog>
  63. 63     </template>
  64. 64
复制代码
4. 图书借还数据交互

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

控制器主要用于响应用户的请求,与数据库交互,并返回执行的结果信息。
  1.   1 namespace CLMS.Host.Controllers
  2.   2 {
  3.   3     /// <summary>
  4.   4     /// 借还管理
  5.   5     /// </summary>
  6.   6     public class CirculateController : Controller
  7.   7     {
  8.   8         private DataContext dataContext;
  9.   9
  10. 10         public CirculateController(DataContext context)
  11. 11         {
  12. 12             dataContext = context;
  13. 13         }
  14. 14
  15. 15         public IActionResult Index()
  16. 16         {
  17. 17             return View();
  18. 18         }
  19. 19
  20. 20         [HttpGet]
  21. 21         public PagedRequest<Circulate> Query(string Name, int pageNum, int pageSize)
  22. 22         {
  23. 23             Name = string.IsNullOrEmpty(Name) ? string.Empty : Name;
  24. 24             var dtos = dataContext.Circulates.Join(dataContext.Books, c => c.BookId, b => b.Id, (c, b) => new Circulate()
  25. 25             {
  26. 26                 Id = c.Id,
  27. 27                 Name = b.Name,
  28. 28                 BookId = c.BookId,
  29. 29                 BorrowConfirmor = c.BorrowConfirmor,
  30. 30                 BorrowTime = c.BorrowTime,
  31. 31                 BorrowUser = c.BorrowUser,
  32. 32                 ISBN = b.ISBN,
  33. 33                 IsReturn = c.IsReturn,
  34. 34                 ReturnConfirmor = c.ReturnConfirmor,
  35. 35                 ReturnTime = c.ReturnTime,
  36. 36             }).Where(r=>r.Name.Contains(Name));
  37. 37             var total = dtos.Count();
  38. 38             var dtos2 = dtos.Skip((pageNum - 1) * pageSize).Take(pageSize).ToList();
  39. 39             //
  40. 40             return new PagedRequest<Circulate>()
  41. 41             {
  42. 42                 count = total,
  43. 43                 items = dtos2,
  44. 44             };
  45. 45         }
  46. 46
  47. 47         [Consumes("application/json")]
  48. 48         [HttpPost]
  49. 49         public Msg Borrow([FromBody]Borrow borrow) {
  50. 50             Msg msg = new Msg();
  51. 51             if (borrow == null || string.IsNullOrEmpty(borrow.ISBN))
  52. 52             {
  53. 53                 msg.code = 1;
  54. 54                 msg.message = "书籍为空";
  55. 55                 return msg;
  56. 56             }
  57. 57             var book = dataContext.Books.FirstOrDefault(r => r.ISBN == borrow.ISBN);
  58. 58             if (book == null)
  59. 59             {
  60. 60                 msg.code = 1;
  61. 61                 msg.message = "ISBN有误";
  62. 62                 return msg;
  63. 63             }
  64. 64             var entity = dataContext.Circulates.FirstOrDefault(r => r.BookId == book.Id && r.IsReturn == false);
  65. 65             if (entity != null)
  66. 66             {
  67. 67                 msg.code = 1;
  68. 68                 msg.message = "书籍已被借阅";
  69. 69                 return msg;
  70. 70             }
  71. 71             var userId = HttpContext.Session.GetInt32("UserId");
  72. 72             if (userId < 0) {
  73. 73                 msg.code = 1;
  74. 74                 msg.message = "尚未登录";
  75. 75                 return msg;
  76. 76             }
  77. 77             var borrorConfirmor = dataContext.Users.FirstOrDefault(r => r.Id == userId)?.NickName;
  78. 78             var entity2  = new CirculateEntity()
  79. 79             {
  80. 80                 Id = 0,
  81. 81                 BookId = book.Id,
  82. 82                 IsReturn = false,
  83. 83                 BorrowTime = DateTime.Now,
  84. 84                 BorrowUser=borrow.BorrowUser,
  85. 85                 BorrowConfirmor= borrorConfirmor,
  86. 86             };
  87. 87             this.dataContext.Circulates.Add(entity2);
  88. 88             this.dataContext.SaveChanges();
  89. 89             msg.code = 0;
  90. 90             msg.message = "success";
  91. 91             return msg;
  92. 92         }
  93. 93
  94. 94         /// <summary>
  95. 95         /// 归还
  96. 96         /// </summary>
  97. 97         /// <param name="returns"></param>
  98. 98         /// <returns></returns>
  99. 99         [Consumes("application/json")]
  100. 100         [HttpPost]
  101. 101         public Msg Return([FromBody] Return returns) {
  102. 102             Msg msg = new Msg();
  103. 103             if (returns == null || string.IsNullOrEmpty(returns.ISBN))
  104. 104             {
  105. 105                 msg.code = 1;
  106. 106                 msg.message = "书籍为空";
  107. 107                 return msg;
  108. 108             }
  109. 109             var book = dataContext.Books.FirstOrDefault(r => r.ISBN == returns.ISBN);
  110. 110             if (book == null)
  111. 111             {
  112. 112                 msg.code = 1;
  113. 113                 msg.message = "ISBN有误";
  114. 114                 return msg;
  115. 115             }
  116. 116             var userId = HttpContext.Session.GetInt32("UserId");
  117. 117             if (userId < 0)
  118. 118             {
  119. 119                 msg.code = 1;
  120. 120                 msg.message = "尚未登录";
  121. 121                 return msg;
  122. 122             }
  123. 123             var returnConfirmor = dataContext.Users.FirstOrDefault(r => r.Id == userId)?.NickName;
  124. 124             var entity = dataContext.Circulates.FirstOrDefault(r => r.BookId == book.Id && r.IsReturn == false);
  125. 125             if (entity != null)
  126. 126             {
  127. 127                 entity.IsReturn = true;
  128. 128                 entity.ReturnTime = DateTime.Now;
  129. 129                 entity.ReturnConfirmor=returnConfirmor;
  130. 130                 dataContext.Circulates.Update(entity);
  131. 131                 dataContext.SaveChanges();
  132. 132                 msg.code = 0;
  133. 133                 msg.message = "success";
  134. 134             }
  135. 135             else {
  136. 136                 msg.code = 1;
  137. 137                 msg.message = "书籍已归还";
  138. 138             }
  139. 139             return msg;
  140. 140         }
  141. 141     }
  142. 142 }
复制代码
6. 图书借还功能测试

图书借还主要包括借阅和归还,如下所示:

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

来源:https://www.cnblogs.com/hsiang/archive/2023/02/07/17097092.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具