配合周总做查询机新增的图书列表查询改版需求
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

365 lines
13 KiB

7 months ago
  1. let sBoxID = ''
  2. let sSortmark = ''
  3. let page = 0
  4. let pageSize = 30
  5. let hasNextPage = true
  6. let searchKeyWord = '' // 搜索keyword
  7. let isSearch = false
  8. // 默认初始化会有限制选择图书借阅的数量的值
  9. // public string getReader()
  10. // 读者信息 {"Barcode":"700008","Name":"测试卡","nMaxNum":2}
  11. let lendNum = 0
  12. setInterval(function() {
  13. $('.lending-btn img').css('animation-duration', '1s').addClass('animate__animated animate__tada');
  14. setTimeout(function() {
  15. $('.lending-btn img').removeClass('animate__animated animate__tada');
  16. }, 1000);
  17. }, 5000);
  18. getBaseInfoReader()
  19. function getBaseInfoReader(){
  20. let readerJson = JSON.parse(boundObject.getReader())
  21. console.log('readerJson',readerJson)
  22. console.log('readerJson-Barcode',readerJson.Barcode)
  23. console.log('readerJson-Name',readerJson.Name)
  24. console.log('readerJson-nMaxNum',readerJson.nMaxNum)
  25. lendNum = readerJson.nMaxNum
  26. }
  27. // 假设书籍数据
  28. let books = [];
  29. // 动态生成左侧分类的项
  30. createHtmlLeftNav();
  31. function createHtmlLeftNav() {
  32. // let LeftLocaltionJSON = [{"BoxID":"*","BoxName":"全部"},{"BoxID":"1","BoxName":"1号书盒"},{"BoxID":"2","BoxName":"2号书盒"},{"BoxID":"3","BoxName":"3号书盒"},{"BoxID":"4","BoxName":"4号书盒"},{"BoxID":"5","BoxName":"5号书盒"},{"BoxID":"6","BoxName":"6号书盒"},{"BoxID":"7","BoxName":"7号书盒"},{"BoxID":"8","BoxName":"8号书盒"},{"BoxID":"9","BoxName":"9号书盒"},{"BoxID":"10","BoxName":"10号书盒"},{"BoxID":"11","BoxName":"11号书盒"},{"BoxID":"12","BoxName":"12号书盒"},{"BoxID":"13","BoxName":"13号书盒"},{"BoxID":"14","BoxName":"14号书盒"},{"BoxID":"15","BoxName":"15号书盒"},{"BoxID":"16","BoxName":"16号书盒"},{"BoxID":"17","BoxName":"17号书盒"},{"BoxID":"18","BoxName":"18号书盒"}];
  33. // let LeftCategoriesJSON = [{"SortIndex":"I","SortName":"文学","BookNum":2},{"SortIndex":"K","SortName":"历史、地理","BookNum":1}];
  34. // LeftLocaltionJSON / LeftCategoriesJSON c#执行得返回值
  35. // boundObject c#端注册类得名称
  36. // cshareFunction c#端注册类boundObject下的函数
  37. let LeftLocaltionJSON = boundObject.getBoxs('1')
  38. let locations = JSON.parse(LeftLocaltionJSON)
  39. console.log('LeftLocaltionJSON',LeftLocaltionJSON)
  40. let LeftCategoriesJSON = boundObject.getSortmarks('2')
  41. let categories = JSON.parse(LeftCategoriesJSON)
  42. console.log('LeftCategoriesJSON',LeftCategoriesJSON)
  43. // 图书位置
  44. let locationsHtml = '<div class="left-item"><h4>图书位置</h4><ul class="left-filter filter-location">';
  45. locations.forEach((location, index) => {
  46. let activeClass = index === 0 ? 'class="active"' : '';
  47. locationsHtml += `<li ${activeClass} data-id=${location.BoxID}>${location.BoxName}</li>`;
  48. });
  49. locationsHtml += '</ul></div>';
  50. // 图书分类
  51. let categoriesHtml = '<div class="left-item"><h4>图书分类</h4><ul class="left-filter filter-sort">';
  52. categories.forEach(category => {
  53. categoriesHtml += `<li data-id=${category.SortIndex}>${category.SortName}</li>`;
  54. });
  55. categoriesHtml += '</ul></div>';
  56. document.getElementById('lib-book-left').innerHTML = `${locationsHtml}${categoriesHtml}`
  57. }
  58. // 为图书位置和分类的每个li元素添加点击事件
  59. document.querySelectorAll('.left-filter li').forEach(item => {
  60. item.addEventListener('click', function(event) {
  61. document.querySelectorAll('.left-filter li').forEach(li => {
  62. li.classList.remove('active');
  63. });
  64. const clickedLi = event.target;
  65. const dataId = clickedLi.getAttribute('data-id');
  66. // 判断点击的是图书位置还是分类,并分别处理
  67. if (clickedLi.closest('.filter-location')) {
  68. if(dataId === '*'){
  69. sBoxID = '';
  70. }else{
  71. sBoxID = dataId;
  72. }
  73. sSortmark = ''
  74. } else if (clickedLi.closest('.filter-sort')) {
  75. sSortmark = dataId;
  76. sBoxID = ''
  77. }
  78. this.classList.add('active');
  79. document.querySelector('.book-list-wrapper').scrollTop = 0
  80. document.querySelector('.book-list-wrapper').innerHTML = ''
  81. page = 0
  82. hasNextPage = true
  83. document.querySelector('input[name="keyword"]').value = ''
  84. searchKeyWord = ''
  85. isSearch = false
  86. FetchRightBookList()
  87. });
  88. });
  89. let scrollTimeout = null;
  90. function debouncedOnScroll() {
  91. if (scrollTimeout !== null) {
  92. clearTimeout(scrollTimeout);
  93. }
  94. scrollTimeout = setTimeout(onScroll, 200); // 延迟1秒执行onScroll
  95. }
  96. // 滚动事件处理函数
  97. function onScroll() {
  98. const element = document.querySelector('.book-list-wrapper')
  99. if (element.scrollTop + element.offsetHeight > element.scrollHeight - 100) {
  100. FetchRightBookList();
  101. }
  102. }
  103. // 添加节流后的滚动监听
  104. document.querySelector('.book-list-wrapper').addEventListener('scroll', debouncedOnScroll);
  105. FetchRightBookList()
  106. function FetchRightBookList(){
  107. if (!hasNextPage) return; // 如果没有下一页,停止加载
  108. if (isSearch) {
  109. page = 0
  110. sBoxID = ''
  111. sSortmark = ''
  112. document.querySelector('.book-list-wrapper').innerHTML = ''
  113. }
  114. const params = {
  115. 'sName': searchKeyWord,
  116. 'sBoxID': sBoxID,
  117. 'sSortmark': sSortmark,
  118. 'nPageIndex': page,
  119. 'nPageMaxNum': pageSize
  120. }
  121. // js传参给 c#端
  122. console.log(params)
  123. console.log('sName',searchKeyWord)
  124. console.log('sBoxID',sBoxID)
  125. console.log('sSortmark',sSortmark)
  126. console.log('nPageIndex',page)
  127. console.log('nPageMaxNum',pageSize)
  128. // ----- ----- ----- js调用c#的函数
  129. let booksRightJson = boundObject.getBooks(searchKeyWord,sBoxID,sSortmark,page,pageSize)
  130. var correctedJsonStr = booksRightJson.replace(/"status":\s*"0",\s*/, '');
  131. // 去除字符串的头尾空白
  132. correctedJsonStr = correctedJsonStr.trim();
  133. // 去掉字符串的头花括号
  134. correctedJsonStr = correctedJsonStr.substring(1);
  135. books = JSON.parse(correctedJsonStr).data
  136. const totalPages = JSON.parse(correctedJsonStr).totalPages
  137. console.log('totalPages',totalPages)
  138. if (page > totalPages || books.length === 0) {
  139. hasNextPage = false;
  140. }
  141. createRightBooklist(books);
  142. page += 1;
  143. }
  144. // 有图书封面的时候
  145. function createRightBooklist(books){
  146. console.log('books.length',books.length)
  147. let bookListHtml = ''
  148. let bookList = document.querySelector('.book-list-wrapper').querySelector('.book-list');
  149. let emptyBook = document.querySelector('.book-list-wrapper').querySelector('.empty-book-list');
  150. if(books.length === 0){
  151. document.querySelector(".lib-search-result").style.display = 'none'
  152. document.querySelector(".lib-search-result span").innerHTML = 0
  153. bookListHtml = `
  154. <div class="empty-book-list">
  155. <img src="images/empty.png" alt="" />
  156. <span>暂无相关数据</span>
  157. </div>
  158. `;
  159. document.querySelector('.book-list-wrapper').innerHTML = bookListHtml;
  160. if (bookList) {
  161. bookList.remove()
  162. }
  163. }else{
  164. // getBooks(string sName,string sBoxID,string sSortmark,int nPageIndex,int nPageMaxNum)
  165. // getBookDetail(string sBarcode)
  166. // books = [{"Barcode":"000131034","Name":"好人难做","Author":"周磊","ISBN":"9787541566431","Sortmark":"I235/50","BoxID":"1"},{"Barcode":"000134847","Name":"仙逆","Author":"","ISBN":"","Sortmark":"I32","BoxID":"1"},{"Barcode":"1007700","Name":"红楼梦","Author":"","ISBN":"","Sortmark":"K543/20","BoxID":"1"}]
  167. books.forEach(book => {
  168. let booksCoverJson = boundObject.getBookDetail(book.Barcode)
  169. let cover = JSON.parse(booksCoverJson)
  170. let booksCover = cover[0].BookCover !== null ? `data:image/jpeg;base64,${cover[0].BookCover}` : 'images/default-img.png'
  171. bookListHtml += `
  172. <li data-id="${book.Barcode}">
  173. <div class="book-list-img">
  174. <img src="${booksCover}" alt="" />
  175. </div>
  176. <h4>${book.Name}</h4>
  177. <span>${(book.Author !== '' && book.Author !== 'NULL') ? book.Author : ''}</span>
  178. </li>
  179. `;
  180. });
  181. if(emptyBook !== null){
  182. emptyBook.remove()
  183. }
  184. if (!bookList) {
  185. bookList = document.createElement('ul');
  186. bookList.className = 'book-list';
  187. document.querySelector('.book-list-wrapper').appendChild(bookList);
  188. }
  189. if(!hasNextPage){
  190. const existingEndMarker = document.querySelector('.book-list-wrapper .book-noData');
  191. if (!existingEndMarker) {
  192. const bookDataEnd = `<div class="book-noData">暂无更多数据啦~</div>`;
  193. document.querySelector('.book-list-wrapper').insertAdjacentHTML('beforeend', bookDataEnd);
  194. }
  195. }else{
  196. document.querySelector('.book-list-wrapper').querySelector('.book-list').innerHTML += bookListHtml;
  197. // 为图书列表的每个li元素添加点击事件
  198. document.querySelectorAll('.book-list li').forEach(item => {
  199. item.addEventListener('click', function() {
  200. this.classList.toggle('active');
  201. });
  202. });
  203. }
  204. }
  205. if(isSearch){
  206. document.querySelector(".lib-search-result").style.display = 'block'
  207. document.querySelector(".lib-search-result span").innerHTML = books.length
  208. }else{
  209. document.querySelector(".lib-search-result").style.display = 'none'
  210. document.querySelector(".lib-search-result span").innerHTML = 0
  211. }
  212. }
  213. // 创建借阅书籍弹框
  214. function createlendDialog(books) {
  215. // 借阅书籍列表
  216. const listItems = books.map(function(book,index) {
  217. return `
  218. <li class="lib-lending-item">
  219. <span class="lending-num">${index+1}</span>
  220. <div class="lending-img">
  221. <img src="${book.image}" alt="" />
  222. </div>
  223. <span class="lending-author">${book.barcode}</span>
  224. <h4>${book.title}</h4>
  225. </li>
  226. `;
  227. }).join('');
  228. // <span class="lending-author">${book.author !== null ? book.author : ''}</span>
  229. // 弹框的HTML字符串
  230. const dialogHTML = `
  231. <div class="lib-dialog" id="lib-dialog">
  232. <div class="lib-dialog-mask"></div>
  233. <div class="lib-dialog-main">
  234. <div class="lib-dialog-header">
  235. <div class="lib-dialog-title">图书借阅</div>
  236. </div>
  237. <ul class="lib-lending-list">
  238. ${listItems}
  239. </ul>
  240. <div class="lib-dialog-bottom">
  241. <span class="cancel-btn">取消</span>
  242. <span class="confirm-btn">确定</span>
  243. </div>
  244. </div>
  245. </div>
  246. `;
  247. // 将弹框添加到body
  248. document.body.insertAdjacentHTML('beforeend', dialogHTML);
  249. // 获取弹框元素
  250. const dialog = document.getElementById('lib-dialog');
  251. const cancelButton = dialog.querySelector('.cancel-btn');
  252. const confirmButton = dialog.querySelector('.confirm-btn');
  253. // 取消
  254. cancelButton.addEventListener('click', function() {
  255. removeSelected(dialog)
  256. });
  257. // 确定
  258. confirmButton.addEventListener('click', function() {
  259. // ----- ----- ----- js调用c#的函数 假设需要借阅得书籍id集
  260. // public string beginLendBooks(string sData)
  261. const bookBarcodes = books.map(function(book) {
  262. return book.barcode
  263. })
  264. console.log('bookBarcodes',bookBarcodes)
  265. const params = bookBarcodes.join(',')
  266. let lendBookComfirmed = boundObject.beginLendBooks(params)
  267. if(lendBookComfirmed){
  268. removeSelected(dialog)
  269. }
  270. });
  271. }
  272. function removeSelected(dialog){
  273. const bookListItems = document.querySelectorAll('.book-list li');
  274. bookListItems.forEach(function(item) {
  275. item.classList.remove('active');
  276. });
  277. dialog.remove()
  278. }
  279. // 图书借阅弹框 show
  280. document.querySelector(".lending-btn").addEventListener("click", function() {
  281. const selectedBooks = [];
  282. document.querySelectorAll('.book-list li.active').forEach(activeLi => {
  283. const bookData = {
  284. barcode: activeLi.getAttribute('data-id'),
  285. title: activeLi.querySelector('h4').textContent,
  286. image: activeLi.querySelector('img').src
  287. };
  288. selectedBooks.push(bookData);
  289. });
  290. if(selectedBooks.length === 0){
  291. layer.alert('请先选择需要借阅的图书!');
  292. return false
  293. }else if(selectedBooks.length > lendNum){
  294. layer.alert('最多只可借阅'+lendNum+'本图书!');
  295. return false
  296. }{
  297. createlendDialog(selectedBooks);
  298. }
  299. });
  300. // 搜索按钮点击搜索
  301. document.querySelector(".search-btn").addEventListener("click", function() {
  302. isSearch = true
  303. searchKeyWord = document.querySelector('input[name="keyword"]').value
  304. if(searchKeyWord === ''){
  305. layer.alert('请输入关键词进行搜索!');
  306. return false
  307. }
  308. hasNextPage = true
  309. // document.querySelector('.book-list-wrapper').scrollTop = 0
  310. let bookNoData= document.querySelector('.book-list-wrapper').querySelector('.book-noData');
  311. if(bookNoData){
  312. bookNoData.remove()
  313. }
  314. document.querySelectorAll('.left-filter li').forEach(item => {
  315. item.classList.remove('active');
  316. });
  317. FetchRightBookList()
  318. });