配合周总做查询机新增的图书列表查询改版需求
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.

401 lines
13 KiB

7 months ago
  1. let sBoxID = ''
  2. let sSortmark = ''
  3. let page = 0
  4. let pageSize = 36
  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 = boundObject.getBoxs('1')
  33. let locations = JSON.parse(LeftLocaltionJSON)
  34. console.log('LeftLocaltionJSON',LeftLocaltionJSON)
  35. let LeftCategoriesJSON = boundObject.getSortmarks('2')
  36. let categories = JSON.parse(LeftCategoriesJSON)
  37. console.log('LeftCategoriesJSON',LeftCategoriesJSON)
  38. // 图书位置
  39. let locationsHtml = '<div class="left-item"><h4>图书位置</h4><ul class="left-filter filter-location">';
  40. locations.forEach((location, index) => {
  41. let activeClass = index === 0 ? 'class="active"' : '';
  42. locationsHtml += `<li ${activeClass} data-id=${location.BoxID}>${location.BoxName}</li>`;
  43. });
  44. locationsHtml += '</ul></div>';
  45. // 图书分类
  46. let categoriesHtml = '<div class="left-item"><h4>图书分类</h4><ul class="left-filter filter-sort">';
  47. categories.forEach(category => {
  48. categoriesHtml += `<li data-id=${category.SortIndex}>${category.SortName}</li>`;
  49. });
  50. categoriesHtml += '</ul></div>';
  51. document.getElementById('lib-book-left').innerHTML = `${locationsHtml}${categoriesHtml}`
  52. }
  53. // 为图书位置和分类的每个li元素添加点击事件
  54. document.querySelectorAll('.left-filter li').forEach(item => {
  55. item.addEventListener('click', function(event) {
  56. document.querySelectorAll('.left-filter li').forEach(li => {
  57. li.classList.remove('active');
  58. });
  59. const clickedLi = event.target;
  60. const dataId = clickedLi.getAttribute('data-id');
  61. // 判断点击的是图书位置还是分类,并分别处理
  62. if (clickedLi.closest('.filter-location')) {
  63. if(dataId === '*'){
  64. sBoxID = '';
  65. }else{
  66. sBoxID = dataId;
  67. }
  68. sSortmark = ''
  69. } else if (clickedLi.closest('.filter-sort')) {
  70. sSortmark = dataId;
  71. sBoxID = ''
  72. }
  73. this.classList.add('active');
  74. page = 0
  75. hasNextPage = true
  76. document.querySelector('input[name="keyword"]').value = ''
  77. searchKeyWord = ''
  78. isSearch = false
  79. document.querySelector('.rack-content').scrollTop = 0
  80. document.querySelector('.rack-content').innerHTML = ''
  81. createInitRackBooklist();
  82. });
  83. });
  84. let scrollTimeout = null;
  85. function debouncedOnScroll() {
  86. if (scrollTimeout !== null) {
  87. clearTimeout(scrollTimeout);
  88. }
  89. scrollTimeout = setTimeout(onScroll, 200); // 延迟1秒执行onScroll
  90. }
  91. // 滚动事件处理函数
  92. function onScroll() {
  93. const element = document.querySelector('.rack-content')
  94. if (element.scrollTop + element.offsetHeight > element.scrollHeight - 100) {
  95. FetchRightBookList();
  96. }
  97. }
  98. document.querySelector('.rack-content').addEventListener('scroll', debouncedOnScroll);
  99. // 使用事件委托为所有list-item图书添加点击事件
  100. function addClickEventToItems() {
  101. const rackContent = document.querySelector('.rack-content');
  102. rackContent.addEventListener('click', function(event) {
  103. const listItem = event.target.closest('.list-item');
  104. if (listItem) {
  105. listItem.classList.toggle('active');
  106. }
  107. });
  108. }
  109. window.addEventListener('DOMContentLoaded', () => {
  110. addClickEventToItems();
  111. });
  112. function FetchRightBookList(){
  113. if (!hasNextPage) return; // 如果没有下一页,停止加载
  114. if (isSearch) {
  115. page = 0
  116. sBoxID = ''
  117. sSortmark = ''
  118. document.querySelector('.rack-content').innerHTML = ''
  119. }
  120. page += 1;
  121. const params = {
  122. 'sName': searchKeyWord,
  123. 'sBoxID': sBoxID,
  124. 'sSortmark': sSortmark,
  125. 'nPageIndex': page,
  126. 'nPageMaxNum': pageSize
  127. }
  128. // js传参给 c#端
  129. console.log('params',params)
  130. console.log('sName',searchKeyWord)
  131. console.log('sBoxID',sBoxID)
  132. console.log('sSortmark',sSortmark)
  133. console.log('nPageIndex',page)
  134. console.log('nPageMaxNum',pageSize)
  135. // ----- ----- ----- js调用c#的函数
  136. let booksRightJson = boundObject.getBooks(searchKeyWord,sBoxID,sSortmark,page,pageSize)
  137. var correctedJsonStr = booksRightJson.replace(/"status":\s*"0",\s*/, '');
  138. // 去除字符串的头尾空白
  139. correctedJsonStr = correctedJsonStr.trim();
  140. // 去掉字符串的头花括号
  141. correctedJsonStr = correctedJsonStr.substring(1);
  142. books = JSON.parse(correctedJsonStr).data
  143. const totalPages = JSON.parse(correctedJsonStr).totalPages
  144. console.log('totalPages',totalPages)
  145. if (books.length > 0) {
  146. // books = books.concat(books);
  147. appendBooksToRackContent(books);
  148. } else {
  149. hasNextPage = false; // 更新是否有下一页
  150. }
  151. if(page > totalPages){
  152. hasNextPage = false
  153. }
  154. }
  155. function appendBooksToRackContent(books) {
  156. console.log('appendBooks',books.length)
  157. const groupSize = 12;
  158. const rackContent = document.querySelector('.rack-content');
  159. let lastRackBoxList = rackContent.querySelector('.rack-box-list:last-child');
  160. let lastGroupBooksCount = lastRackBoxList ? lastRackBoxList.querySelectorAll('.list-item').length : 0;
  161. let currentBooksCount = 0; // 当前正在处理的书籍数量
  162. // 循环遍历所有书籍,将它们添加到正确的容器中
  163. books.forEach((book) => {
  164. // 如果最后一个容器不存在或者书籍数量已经达到groupSize,创建一个新的rack-box-list
  165. if (!lastRackBoxList || lastGroupBooksCount >= groupSize) {
  166. lastRackBoxList = document.createElement('div');
  167. lastRackBoxList.className = 'rack-box-list';
  168. rackContent.appendChild(lastRackBoxList);
  169. lastGroupBooksCount = 0; // 重置计数器
  170. }
  171. // 追加书籍到这个rack-box-list中
  172. const authorSpan = (book.Author !== '' && book.Author !== 'NULL') ? `<span class="book-writer">作者:${book.Author}</span>` : '' ;
  173. const bookElement = `
  174. <div class="list-item" data-id="${book.Barcode}">
  175. <div class="box-txt">
  176. <span class="book-name">${book.Name}</span>
  177. ${authorSpan}
  178. </div>
  179. </div>
  180. `;
  181. lastRackBoxList.innerHTML += bookElement;
  182. lastGroupBooksCount++;
  183. currentBooksCount++;
  184. if (currentBooksCount >= groupSize) {
  185. return;
  186. }
  187. });
  188. }
  189. // 初始化无图书封面的图书列表
  190. createInitRackBooklist();
  191. function createInitRackBooklist() {
  192. if (isSearch) {
  193. page = 0
  194. sBoxID = ''
  195. sSortmark = ''
  196. document.querySelector('.rack-content').innerHTML = ''
  197. }
  198. const params = {
  199. 'sName': searchKeyWord,
  200. 'sBoxID': sBoxID,
  201. 'sSortmark': sSortmark,
  202. 'nPageIndex': page,
  203. 'nPageMaxNum': pageSize
  204. }
  205. // js传参给 c#端
  206. console.log('初始化params',params)
  207. console.log('初始化sName',searchKeyWord)
  208. console.log('初始化sBoxID',sBoxID)
  209. console.log('初始化sSortmark',sSortmark)
  210. console.log('初始化nPageIndex',page)
  211. console.log('初始化nPageMaxNum',pageSize)
  212. // ----- ----- ----- js调用c#的函数
  213. let booksRightJson = boundObject.getBooks(searchKeyWord,sBoxID,sSortmark,page,pageSize)
  214. var correctedJsonStr = booksRightJson.replace(/"status":\s*"0",\s*/, '');
  215. // 去除字符串的头尾空白
  216. correctedJsonStr = correctedJsonStr.trim();
  217. // 去掉字符串的头花括号
  218. correctedJsonStr = correctedJsonStr.substring(1);
  219. books = JSON.parse(correctedJsonStr).data
  220. console.log('初始化Books',books.length)
  221. if(books.length === 0){
  222. document.querySelector(".lib-search-result span").innerHTML = 0
  223. bookListHtml = `
  224. <div class="empty-book-list">
  225. <img src="images/empty.png" alt="" />
  226. <span>暂无相关数据</span>
  227. </div>
  228. `;
  229. document.querySelector('.rack-content').innerHTML = bookListHtml;
  230. if (bookList) {
  231. bookList.remove()
  232. }
  233. }else{
  234. const groupSize = 12;
  235. let html = '';
  236. for (let i = 0; i < books.length; i += groupSize) {
  237. html += '<div class="rack-box-list">';
  238. for (let j = i; j < i + groupSize && j < books.length; j++) {
  239. const authorSpan = (books[j].Author !== '' && books[j].Author !== 'NULL') ? `<span class="book-writer">作者:${books[j].Author}</span>` : '';
  240. html += `
  241. <div class="list-item" data-id="${books[j].Barcode}">
  242. <div class="box-txt">
  243. <span class="book-name">${books[j].Name}</span>
  244. ${authorSpan}
  245. </div>
  246. </div>
  247. `;
  248. }
  249. html += '</div>';
  250. }
  251. document.querySelector('.rack-content').innerHTML += html
  252. }
  253. if(isSearch){
  254. document.querySelector(".lib-search-result").style.display = 'block'
  255. document.querySelector(".lib-search-result span").innerHTML = books.length
  256. }else{
  257. document.querySelector(".lib-search-result").style.display = 'none'
  258. document.querySelector(".lib-search-result span").innerHTML = 0
  259. }
  260. }
  261. // 创建借阅书籍弹框
  262. function createlendDialog(books) {
  263. // 借阅书籍列表
  264. const listItems = books.map(function(book,index) {
  265. return `
  266. <li class="lib-lending-item">
  267. <span class="lending-num">${index+1}</span>
  268. <span class="lending-author">${book.barcode}</span>
  269. <h4>${book.title}</h4>
  270. </li>
  271. `;
  272. }).join('');
  273. // 弹框的HTML字符串
  274. const dialogHTML = `
  275. <div class="lib-dialog" id="lib-dialog">
  276. <div class="lib-dialog-mask"></div>
  277. <div class="lib-dialog-main">
  278. <div class="lib-dialog-header">
  279. <div class="lib-dialog-title">图书借阅</div>
  280. </div>
  281. <ul class="lib-lending-list">
  282. ${listItems}
  283. </ul>
  284. <div class="lib-dialog-bottom">
  285. <span class="cancel-btn">取消</span>
  286. <span class="confirm-btn">确定</span>
  287. </div>
  288. </div>
  289. </div>
  290. `;
  291. // 将弹框添加到body
  292. document.body.insertAdjacentHTML('beforeend', dialogHTML);
  293. // 获取弹框元素
  294. const dialog = document.getElementById('lib-dialog');
  295. const cancelButton = dialog.querySelector('.cancel-btn');
  296. const confirmButton = dialog.querySelector('.confirm-btn');
  297. // 取消
  298. cancelButton.addEventListener('click', function() {
  299. removeSelected(dialog)
  300. });
  301. // 确定
  302. confirmButton.addEventListener('click', function() {
  303. // ----- ----- ----- js调用c#的函数 假设需要借阅得书籍id集
  304. // public string beginLendBooks(string sData)
  305. const bookBarcodes = books.map(function(book) {
  306. return book.barcode
  307. })
  308. console.log('bookBarcodes',bookBarcodes)
  309. const params = bookBarcodes.join(',')
  310. let lendBookComfirmed = boundObject.beginLendBooks(params)
  311. if(lendBookComfirmed){
  312. removeSelected(dialog)
  313. }
  314. });
  315. }
  316. function removeSelected(dialog){
  317. const bookListItems = document.querySelectorAll('.list-item');
  318. bookListItems.forEach(function(item) {
  319. item.classList.remove('active');
  320. });
  321. dialog.remove()
  322. }
  323. // 图书借阅弹框 show
  324. document.querySelector(".lending-btn").addEventListener("click", function() {
  325. const selectedBooks = [];
  326. document.querySelectorAll('.list-item.active').forEach(activeLi => {
  327. const bookData = {
  328. barcode: activeLi.getAttribute('data-id'),
  329. title: activeLi.querySelector('.book-name').textContent
  330. };
  331. selectedBooks.push(bookData);
  332. });
  333. // author: activeLi.querySelector('.book-writer') ? activeLi.querySelector('.book-writer').textContent : ''
  334. if(selectedBooks.length === 0){
  335. layer.alert('请先选择需要借阅的图书!');
  336. return false
  337. }else if(selectedBooks.length > lendNum){
  338. layer.alert('最多只可借阅'+lendNum+'本图书!');
  339. return false
  340. }{
  341. createlendDialog(selectedBooks);
  342. }
  343. });
  344. // 搜索按钮点击搜索
  345. document.querySelector(".search-btn").addEventListener("click", function() {
  346. isSearch = true
  347. searchKeyWord = document.querySelector('input[name="keyword"]').value
  348. if(searchKeyWord === ''){
  349. layer.alert('请输入关键词进行搜索!');
  350. return false
  351. }
  352. hasNextPage = true
  353. // document.querySelector('.rack-content').scrollTop = 0
  354. // document.querySelector('.rack-content').innerHTML = ''
  355. let bookNoData= document.querySelector('.rack-content').querySelector('.book-noData');
  356. if(bookNoData){
  357. bookNoData.remove()
  358. }
  359. document.querySelectorAll('.left-filter li').forEach(item => {
  360. item.classList.remove('active');
  361. });
  362. createInitRackBooklist()
  363. });