隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,ASP.NET Core也應運而生。本文主要基於ASP.NET Core+Element+Sql Server開發一個校園圖書管理系統為例,簡述基於MVC三層架構開發的常見知識點,前三篇篇文章簡單介紹瞭如何搭建開發框架,登錄功能,主頁面功能,以... ...
隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,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 namespace CLMS.Entity 2 { 3 /// <summary> 4 /// 圖書實體 5 /// </summary> 6 public class BookEntity 7 { 8 /// <summary> 9 /// 唯一標識 10 /// </summary> 11 public int Id { get; set; } 12 13 /// <summary> 14 /// 圖書編號 15 /// </summary> 16 public string ISBN { get; set; } 17 18 /// <summary> 19 /// 圖書名稱 20 /// </summary> 21 public string Name { get; set; } 22 23 /// <summary> 24 /// 圖書作者 25 /// </summary> 26 public string Author { get; set; } 27 28 /// <summary> 29 /// 圖書出版社 30 /// </summary> 31 public string Publisher { get; set; } 32 33 /// <summary> 34 /// 出版時間 35 /// </summary> 36 public DateTime PublishDate { get; set; } 37 38 /// <summary> 39 /// 圖書類型 40 /// </summary> 41 public string BookType { get; set; } 42 43 /// <summary> 44 /// 描述 45 /// </summary> 46 public string Description { get; set; } 47 48 /// <summary> 49 /// 書架ID 50 /// </summary> 51 public long BookRackId { get; set; } 52 53 /// <summary> 54 /// 創建時間 55 /// </summary> 56 public DateTime CreateTime { get; set; } 57 58 /// <summary> 59 /// 當前登錄的賬號的ID 60 /// </summary> 61 public int CreateUser { get; set; } 62 63 /// <summary> 64 /// 最後編輯時間 65 /// </summary> 66 public DateTime? LastEditTime { get; set; } 67 68 /// <summary> 69 /// 最後修改人 70 /// </summary> 71 public int LastEditUser { get; set; } 72 } 73 }
3. 圖書管理頁面佈局
圖書管理頁面主要包括對書籍的查詢,新增,編輯,刪除等操作,頁面佈局如下所示:
1 <div id="app"> 2 <template> 3 <el-breadcrumb separator-class="el-icon-arrow-right"> 4 <el-breadcrumb-item>圖書管理</el-breadcrumb-item> 5 <el-breadcrumb-item>圖書管理</el-breadcrumb-item> 6 </el-breadcrumb> 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 <el-form-item label="書籍名稱"> 9 <el-input v-model="queryCondition.Name" placeholder="書籍名稱"></el-input> 10 </el-form-item> 11 <el-form-item label="出版社"> 12 <el-input v-model="queryCondition.Publisher" placeholder="出版社"></el-input> 13 </el-form-item> 14 <el-form-item> 15 <el-button type="primary" v-on:click="handleQuery">查詢</el-button> 16 </el-form-item> 17 <el-form-item> 18 <el-button type="primary" v-on:click="handleAdd">新增</el-button> 19 </el-form-item> 20 </el-form> 21 22 <el-table :data="tableData" style="width: 100%" border :default-sort="{prop: 'date', order: 'descending'}"> 23 <el-table-column type="expand"> 24 <template slot-scope="props"> 25 <el-form label-position="left" inline class="demo-table-expand"> 26 <el-form-item label="圖書館"> 27 <span>{{ props.row.LibraryName }}</span> 28 </el-form-item> 29 <el-form-item label="圖書室"> 30 <span>{{ props.row.LibrarySubName }}</span> 31 </el-form-item> 32 <el-form-item label="排"> 33 <span>{{ props.row.Row }}</span> 34 </el-form-item> 35 <el-form-item label="列"> 36 <span>{{ props.row.Column }}</span> 37 </el-form-item> 38 </el-form> 39 </template> 40 </el-table-column> 41 <el-table-column prop="ISBN" label="ISBN" sortable ></el-table-column> 42 <el-table-column prop="Name" label="書籍名稱" sortable ></el-table-column> 43 <el-table-column prop="Author" label="作者" sortable ></el-table-column> 44 <el-table-column prop="Publisher" label="出版社" sortable ></el-table-column> 45 <el-table-column prop="BookType" label="書籍類型" sortable ></el-table-column> 46 <el-table-column prop="CreateTime" label="上架時間" sortable ></el-table-column> 47 <el-table-column label="操作"> 48 <template slot-scope="scope"> 49 <el-button size="medium" type="primary" plain v-on:click="handleEdit(scope.$index,scope.row)">編輯</el-button> 50 <el-button size="medium" type="danger" v-on:click="handleDelete(scope.$index,scope.row)">刪除</el-button> 51 </template> 52 </el-table-column> 53 </el-table> 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 <el-dialog title="書籍信息" :visible.sync="dialogFormVisible"> 56 <el-form :model="addOrEditForm"> 57 <el-form-item label="ISBN" :label-width="formLabelWidth"> 58 <el-input v-model="addOrEditForm.ISBN" autocomplete="off"></el-input> 59 </el-form-item> 60 <el-form-item label="書籍名稱" :label-width="formLabelWidth"> 61 <el-input v-model="addOrEditForm.Name" autocomplete="off"></el-input> 62 </el-form-item> 63 <el-form-item label="書籍作者" :label-width="formLabelWidth"> 64 <el-input v-model="addOrEditForm.Author" autocomplete="off"></el-input> 65 </el-form-item> 66 <el-form-item label="出版社" :label-width="formLabelWidth"> 67 <el-input v-model="addOrEditForm.Publisher" autocomplete="off"></el-input> 68 </el-form-item> 69 <el-form-item label="出版時間" :label-width="formLabelWidth"> 70 <el-date-picker v-model="addOrEditForm.PublishDate" type="date" placeholder="選擇日期"></el-date-picker> 71 </el-form-item> 72 <el-form-item label="書籍類型" :label-width="formLabelWidth"> 73 <el-select v-model="addOrEditForm.BookType" placeholder="請選擇書籍類型"> 74 <el-option label="技術類" value="技術類"></el-option> 75 <el-option label="科普類" value="科普類"></el-option> 76 <el-option label="文學類" value="文學類"></el-option> 77 <el-option label="社科類" value="社科類"></el-option> 78 <el-option label="語言類" value="語言類"></el-option> 79 </el-select> 80 </el-form-item> 81 <el-form-item label="書籍描述" :label-width="formLabelWidth"> 82 <el-input v-model="addOrEditForm.Description" autocomplete="off"></el-input> 83 </el-form-item> 84 <el-form-item label="存放位置" :label-width="formLabelWidth"> 85 <el-tag v-model="addOrEditForm.Location" style="vertical-align:middle;">{{addOrEditForm.Location}}</el-tag> 86 <el-button icon="el-icon-place" circle v-on:click="handleLocation"></el-button> 87 </el-form-item> 88 </el-form> 89 <div slot="footer" class="dialog-footer"> 90 <el-button v-on:click="dialogFormVisible = false">取 消</el-button> 91 <el-button type="primary" v-on:click="handleSave">確 定</el-button> 92 </div> 93 <el-dialog title="位置信息" :visible.sync="dialogLocationVisible"> 94 <el-table :data="locationData" style="width: 100%" highlight-current-row border :default-sort="{prop: 'date', order: 'descending'}" v-on:current-change="handleLocationCurrentChange"> 95 <el-table-column prop="Name" label="圖書館" sortable ></el-table-column> 96 <el-table-column prop="SubName" label="圖書室" sortable ></el-table-column> 97 <el-table-column prop="Row" label="排" sortable ></el-table-column> 98 <el-table-column prop="Column" label="列" sortable ></el-table-column> 99 <el-table-column prop="Description" label="描述" sortable ></el-table-column> 100 </el-table> 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 <div slot="footer" class="dialog-footer"> 103 <el-button v-on:click="dialogLocationVisible = false">取 消</el-button> 104 <el-button type="primary" v-on:click="handleLocationSave">確 定</el-button> 105 </div> 106 </el-dialog> 107 </el-dialog> 108 109 </template> 110 </div>
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 Publisher:'' 9 },