Book_system/app/static/js/book-list.js
2025-05-17 16:43:45 +08:00

352 lines
9.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 图书列表页面脚本
$(document).ready(function() {
// 自定义下拉列表处理
const filterHeaders = document.querySelectorAll('.filter-header');
filterHeaders.forEach(header => {
header.addEventListener('click', function() {
// 切换当前下拉列表
const dropdown = this.nextElementSibling;
const isOpen = dropdown.classList.contains('show');
// 关闭所有下拉列表
document.querySelectorAll('.dropdown-options').forEach(el => {
el.classList.remove('show');
});
document.querySelectorAll('.filter-header').forEach(el => {
el.classList.remove('open');
});
// 如果当前不是打开状态,则打开它
if(!isOpen) {
dropdown.classList.add('show');
this.classList.add('open');
}
});
});
// 点击选项时更新并提交表单
const optionItems = document.querySelectorAll('.option-item');
optionItems.forEach(item => {
item.addEventListener('click', function() {
const container = this.closest('.custom-select-container');
const header = container.querySelector('.filter-header .filter-title');
const dropdown = this.closest('.dropdown-options');
const hiddenInput = container.querySelector('input[type="hidden"]');
// 移除之前的选中项
dropdown.querySelectorAll('.option-item').forEach(opt => {
opt.classList.remove('selected');
});
// 设置新的选中项
this.classList.add('selected');
// 更新隐藏输入值
const value = this.getAttribute('data-value');
hiddenInput.value = value;
// 更新显示的文本和图标
const icon = this.querySelector('i').cloneNode(true);
const text = this.querySelector('span').textContent;
header.innerHTML = '';
header.appendChild(icon);
const span = document.createElement('span');
span.textContent = text;
header.appendChild(span);
// 关闭下拉列表
dropdown.classList.remove('show');
container.querySelector('.filter-header').classList.remove('open');
// 提交表单
document.getElementById('filter-form').submit();
});
});
// 点击页面其他地方关闭下拉列表
document.addEventListener('click', function(e) {
if(!e.target.closest('.custom-select-container')) {
document.querySelectorAll('.dropdown-options').forEach(el => {
el.classList.remove('show');
});
document.querySelectorAll('.filter-header').forEach(el => {
el.classList.remove('open');
});
}
});
// 处理删除图书
let bookIdToDelete = null;
$('.delete-book').click(function(e) {
e.preventDefault();
bookIdToDelete = $(this).data('id');
const bookTitle = $(this).data('title');
$('#deleteBookTitle').text(bookTitle);
$('#deleteModal').modal('show');
});
$('#confirmDelete').click(function() {
if (!bookIdToDelete) return;
$.ajax({
url: `/book/delete/${bookIdToDelete}`,
type: 'POST',
success: function(response) {
if (response.success) {
$('#deleteModal').modal('hide');
// 显示成功消息
showNotification(response.message, 'success');
// 移除图书卡片
$(`.book-card[data-id="${bookIdToDelete}"]`).fadeOut(300, function() {
$(this).remove();
});
setTimeout(() => {
if ($('.book-card').length === 0) {
location.reload(); // 如果没有图书了,刷新页面显示"无图书"提示
}
}, 500);
} else {
$('#deleteModal').modal('hide');
showNotification(response.message, 'error');
}
},
error: function() {
$('#deleteModal').modal('hide');
showNotification('删除操作失败,请稍后重试', 'error');
}
});
});
// 处理借阅图书
$('.borrow-book').click(function(e) {
e.preventDefault();
const bookId = $(this).data('id');
$.ajax({
url: `/borrow/add/${bookId}`,
type: 'POST',
success: function(response) {
if (response.success) {
showNotification(response.message, 'success');
// 可以更新UI显示比如更新库存或禁用借阅按钮
setTimeout(() => {
location.reload();
}, 800);
} else {
showNotification(response.message, 'error');
}
},
error: function() {
showNotification('借阅操作失败,请稍后重试', 'error');
}
});
});
// 显示通知
function showNotification(message, type) {
// 移除可能存在的旧通知
$('.notification-alert').remove();
const alertClass = type === 'success' ? 'notification-success' : 'notification-error';
const iconClass = type === 'success' ? 'fa-check-circle' : 'fa-exclamation-circle';
const notification = `
<div class="notification-alert ${alertClass}">
<div class="notification-icon">
<i class="fas ${iconClass}"></i>
</div>
<div class="notification-message">${message}</div>
<button class="notification-close">
<i class="fas fa-times"></i>
</button>
</div>
`;
$('body').append(notification);
// 显示通知
setTimeout(() => {
$('.notification-alert').addClass('show');
}, 10);
// 通知自动关闭
setTimeout(() => {
$('.notification-alert').removeClass('show');
setTimeout(() => {
$('.notification-alert').remove();
}, 300);
}, 4000);
// 点击关闭按钮
$('.notification-close').click(function() {
$(this).closest('.notification-alert').removeClass('show');
setTimeout(() => {
$(this).closest('.notification-alert').remove();
}, 300);
});
}
// 添加通知样式
const notificationCSS = `
.notification-alert {
position: fixed;
top: 20px;
right: 20px;
min-width: 280px;
max-width: 350px;
background-color: white;
border-radius: 8px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.15);
display: flex;
align-items: center;
padding: 15px;
transform: translateX(calc(100% + 20px));
transition: transform 0.3s ease;
z-index: 9999;
}
.notification-alert.show {
transform: translateX(0);
}
.notification-success {
border-left: 4px solid var(--success-color);
}
.notification-error {
border-left: 4px solid var(--danger-color);
}
.notification-icon {
margin-right: 15px;
font-size: 24px;
}
.notification-success .notification-icon {
color: var(--success-color);
}
.notification-error .notification-icon {
color: var(--danger-color);
}
.notification-message {
flex: 1;
font-size: 0.95rem;
color: var(--text-color);
}
.notification-close {
background: none;
border: none;
color: var(--text-lighter);
cursor: pointer;
padding: 5px;
margin-left: 10px;
font-size: 0.8rem;
}
.notification-close:hover {
color: var(--text-color);
}
@media (max-width: 576px) {
.notification-alert {
top: auto;
bottom: 20px;
left: 20px;
right: 20px;
min-width: auto;
max-width: none;
transform: translateY(calc(100% + 20px));
}
.notification-alert.show {
transform: translateY(0);
}
}
`;
// 将通知样式添加到头部
$('<style>').text(notificationCSS).appendTo('head');
// 修复图书卡片布局的高度问题
function adjustCardHeights() {
// 重置所有卡片高度
$('.book-card').css('height', 'auto');
// 在大屏幕上应用等高布局
if (window.innerWidth >= 768) {
// 分组按行
const rows = {};
$('.book-card').each(function() {
const offsetTop = $(this).offset().top;
if (!rows[offsetTop]) {
rows[offsetTop] = [];
}
rows[offsetTop].push($(this));
});
// 为每行设置相同高度
Object.keys(rows).forEach(offsetTop => {
const cards = rows[offsetTop];
let maxHeight = 0;
// 找出最大高度
cards.forEach(card => {
const height = card.outerHeight();
if (height > maxHeight) {
maxHeight = height;
}
});
// 应用最大高度
cards.forEach(card => {
card.css('height', maxHeight + 'px');
});
});
}
}
// 初始调整高度
$(window).on('load', adjustCardHeights);
// 窗口大小变化时调整高度
$(window).on('resize', adjustCardHeights);
// 为封面图片添加加载错误处理
$('.book-cover img').on('error', function() {
const $this = $(this);
const bookTitle = $this.attr('alt') || '图书';
const $cover = $this.closest('.book-cover');
// 替换为无封面显示
$cover.html(`
<div class="no-cover">
<i class="fas fa-book"></i>
<span>无封面</span>
</div>
<div class="cover-title-bar">${bookTitle}</div>
`);
});
// 添加初始动画效果
$('.book-card').each(function(index) {
$(this).css({
'opacity': '0',
'transform': 'translateY(20px)'
});
setTimeout(() => {
$(this).css({
'opacity': '1',
'transform': 'translateY(0)',
'transition': 'opacity 0.5s ease, transform 0.5s ease'
});
}, 50 * index);
});
});