245 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// borrow_management.js
 | 
						||
 | 
						||
document.addEventListener('DOMContentLoaded', function() {
 | 
						||
    // 归还图书功能
 | 
						||
    const returnButtons = document.querySelectorAll('.return-btn');
 | 
						||
    const returnModal = document.getElementById('returnModal');
 | 
						||
    const returnBookTitle = document.getElementById('returnBookTitle');
 | 
						||
    const confirmReturnButton = document.getElementById('confirmReturn');
 | 
						||
    let currentBorrowId = null;
 | 
						||
 | 
						||
    returnButtons.forEach(button => {
 | 
						||
        button.addEventListener('click', function() {
 | 
						||
            const borrowId = this.getAttribute('data-id');
 | 
						||
            const bookTitle = this.getAttribute('data-title');
 | 
						||
 | 
						||
            currentBorrowId = borrowId;
 | 
						||
            returnBookTitle.textContent = bookTitle;
 | 
						||
 | 
						||
            // 使用 Bootstrap 的 jQuery 方法显示模态框
 | 
						||
            $('#returnModal').modal('show');
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    confirmReturnButton.addEventListener('click', function() {
 | 
						||
        if (!currentBorrowId) return;
 | 
						||
 | 
						||
        // 发送归还请求
 | 
						||
        fetch(`/borrow/return/${currentBorrowId}`, {
 | 
						||
            method: 'POST',
 | 
						||
            headers: {
 | 
						||
                'Content-Type': 'application/json',
 | 
						||
                'X-Requested-With': 'XMLHttpRequest'
 | 
						||
            },
 | 
						||
            body: JSON.stringify({})
 | 
						||
        })
 | 
						||
        .then(response => response.json())
 | 
						||
        .then(data => {
 | 
						||
            // 隐藏模态框
 | 
						||
            $('#returnModal').modal('hide');
 | 
						||
 | 
						||
            if (data.success) {
 | 
						||
                // 显示成功消息
 | 
						||
                showAlert('success', data.message);
 | 
						||
                // 重新加载页面以更新借阅状态
 | 
						||
                setTimeout(() => window.location.reload(), 1500);
 | 
						||
            } else {
 | 
						||
                // 显示错误消息
 | 
						||
                showAlert('danger', data.message);
 | 
						||
            }
 | 
						||
        })
 | 
						||
        .catch(error => {
 | 
						||
            $('#returnModal').modal('hide');
 | 
						||
            showAlert('danger', '操作失败,请稍后重试');
 | 
						||
            console.error('Error:', error);
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    // 续借图书功能
 | 
						||
    const renewButtons = document.querySelectorAll('.renew-btn');
 | 
						||
    const renewModal = document.getElementById('renewModal');
 | 
						||
    const renewBookTitle = document.getElementById('renewBookTitle');
 | 
						||
    const confirmRenewButton = document.getElementById('confirmRenew');
 | 
						||
 | 
						||
    renewButtons.forEach(button => {
 | 
						||
        button.addEventListener('click', function() {
 | 
						||
            const borrowId = this.getAttribute('data-id');
 | 
						||
            const bookTitle = this.getAttribute('data-title');
 | 
						||
 | 
						||
            currentBorrowId = borrowId;
 | 
						||
            renewBookTitle.textContent = bookTitle;
 | 
						||
 | 
						||
            // 使用 Bootstrap 的 jQuery 方法显示模态框
 | 
						||
            $('#renewModal').modal('show');
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    confirmRenewButton.addEventListener('click', function() {
 | 
						||
        if (!currentBorrowId) return;
 | 
						||
 | 
						||
        // 发送续借请求
 | 
						||
        fetch(`/borrow/renew/${currentBorrowId}`, {
 | 
						||
            method: 'POST',
 | 
						||
            headers: {
 | 
						||
                'Content-Type': 'application/json',
 | 
						||
                'X-Requested-With': 'XMLHttpRequest'
 | 
						||
            },
 | 
						||
            body: JSON.stringify({})
 | 
						||
        })
 | 
						||
        .then(response => response.json())
 | 
						||
        .then(data => {
 | 
						||
            // 隐藏模态框
 | 
						||
            $('#renewModal').modal('hide');
 | 
						||
 | 
						||
            if (data.success) {
 | 
						||
                // 显示成功消息
 | 
						||
                showAlert('success', data.message);
 | 
						||
                // 重新加载页面以更新借阅状态
 | 
						||
                setTimeout(() => window.location.reload(), 1500);
 | 
						||
            } else {
 | 
						||
                // 显示错误消息
 | 
						||
                showAlert('danger', data.message);
 | 
						||
            }
 | 
						||
        })
 | 
						||
        .catch(error => {
 | 
						||
            $('#renewModal').modal('hide');
 | 
						||
            showAlert('danger', '操作失败,请稍后重试');
 | 
						||
            console.error('Error:', error);
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    // 逾期通知功能
 | 
						||
    const notifyButtons = document.querySelectorAll('.notify-btn');
 | 
						||
    const notifyModal = document.getElementById('notifyModal');
 | 
						||
    const notifyBookTitle = document.getElementById('notifyBookTitle');
 | 
						||
    const confirmNotifyButton = document.getElementById('confirmNotify');
 | 
						||
 | 
						||
    notifyButtons.forEach(button => {
 | 
						||
        button.addEventListener('click', function() {
 | 
						||
            const borrowId = this.getAttribute('data-id');
 | 
						||
            const bookTitle = this.getAttribute('data-title');
 | 
						||
 | 
						||
            currentBorrowId = borrowId;
 | 
						||
            notifyBookTitle.textContent = bookTitle;
 | 
						||
 | 
						||
            // 使用 Bootstrap 的 jQuery 方法显示模态框
 | 
						||
            $('#notifyModal').modal('show');
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    confirmNotifyButton.addEventListener('click', function() {
 | 
						||
        if (!currentBorrowId) return;
 | 
						||
 | 
						||
        // 发送通知请求
 | 
						||
        fetch(`/borrow/overdue/notify/${currentBorrowId}`, {
 | 
						||
            method: 'POST',
 | 
						||
            headers: {
 | 
						||
                'Content-Type': 'application/json',
 | 
						||
                'X-Requested-With': 'XMLHttpRequest'
 | 
						||
            },
 | 
						||
            body: JSON.stringify({})
 | 
						||
        })
 | 
						||
        .then(response => response.json())
 | 
						||
        .then(data => {
 | 
						||
            // 隐藏模态框
 | 
						||
            $('#notifyModal').modal('hide');
 | 
						||
 | 
						||
            if (data.success) {
 | 
						||
                // 显示成功消息
 | 
						||
                showAlert('success', data.message);
 | 
						||
                // 禁用已点击的通知按钮
 | 
						||
                document.querySelector(`.notify-btn[data-id="${currentBorrowId}"]`).disabled = true;
 | 
						||
            } else {
 | 
						||
                // 显示错误消息
 | 
						||
                showAlert('danger', data.message);
 | 
						||
            }
 | 
						||
        })
 | 
						||
        .catch(error => {
 | 
						||
            $('#notifyModal').modal('hide');
 | 
						||
            showAlert('danger', '操作失败,请稍后重试');
 | 
						||
            console.error('Error:', error);
 | 
						||
        });
 | 
						||
    });
 | 
						||
 | 
						||
    // 图书搜索功能
 | 
						||
    const bookSearchInput = document.getElementById('bookSearch');
 | 
						||
    const searchBookBtn = document.getElementById('searchBookBtn');
 | 
						||
    const bookSelect = document.getElementById('bookSelect');
 | 
						||
 | 
						||
    function searchBooks() {
 | 
						||
        const searchTerm = bookSearchInput.value.trim();
 | 
						||
        if (searchTerm.length < 2) {
 | 
						||
            showAlert('warning', '请输入至少2个字符进行搜索');
 | 
						||
            return;
 | 
						||
        }
 | 
						||
 | 
						||
        // 清空当前选项
 | 
						||
        bookSelect.innerHTML = '<option value="">正在搜索...</option>';
 | 
						||
 | 
						||
        // 发送搜索请求
 | 
						||
        fetch(`/book/api/search?q=${encodeURIComponent(searchTerm)}`)
 | 
						||
            .then(response => response.json())
 | 
						||
            .then(data => {
 | 
						||
                bookSelect.innerHTML = '';
 | 
						||
 | 
						||
                if (data.success && data.books.length > 0) {
 | 
						||
                    // 添加找到的图书
 | 
						||
                    data.books.forEach(book => {
 | 
						||
                        const option = document.createElement('option');
 | 
						||
                        option.value = book.id;
 | 
						||
                        option.textContent = `${book.title} - ${book.author} (库存: ${book.stock})`;
 | 
						||
                        // 如果库存为0,禁用该选项
 | 
						||
                        if (book.stock <= 0) {
 | 
						||
                            option.disabled = true;
 | 
						||
                            option.textContent += ' [无库存]';
 | 
						||
                        }
 | 
						||
                        bookSelect.appendChild(option);
 | 
						||
                    });
 | 
						||
                } else {
 | 
						||
                    // 未找到图书
 | 
						||
                    const option = document.createElement('option');
 | 
						||
                    option.value = '';
 | 
						||
                    option.textContent = '未找到相关图书';
 | 
						||
                    bookSelect.appendChild(option);
 | 
						||
                }
 | 
						||
            })
 | 
						||
            .catch(error => {
 | 
						||
                console.error('搜索图书时出错:', error);
 | 
						||
                bookSelect.innerHTML = '<option value="">搜索失败,请重试</option>';
 | 
						||
            });
 | 
						||
    }
 | 
						||
 | 
						||
    // 绑定搜索按钮点击事件
 | 
						||
    searchBookBtn.addEventListener('click', searchBooks);
 | 
						||
 | 
						||
    // 绑定回车键搜索
 | 
						||
    bookSearchInput.addEventListener('keypress', function(e) {
 | 
						||
        if (e.key === 'Enter') {
 | 
						||
            e.preventDefault();
 | 
						||
            searchBooks();
 | 
						||
        }
 | 
						||
    });
 | 
						||
 | 
						||
    // 显示提示消息
 | 
						||
    function showAlert(type, message) {
 | 
						||
        const alertDiv = document.createElement('div');
 | 
						||
        alertDiv.className = `alert alert-${type} alert-dismissible fade show fixed-top mx-auto mt-3`;
 | 
						||
        alertDiv.style.maxWidth = '500px';
 | 
						||
        alertDiv.style.zIndex = '9999';
 | 
						||
 | 
						||
        alertDiv.innerHTML = `
 | 
						||
            ${message}
 | 
						||
            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
 | 
						||
                <span aria-hidden="true">×</span>
 | 
						||
            </button>
 | 
						||
        `;
 | 
						||
 | 
						||
        document.body.appendChild(alertDiv);
 | 
						||
 | 
						||
        // 3秒后自动消失
 | 
						||
        setTimeout(() => {
 | 
						||
            alertDiv.remove();
 | 
						||
        }, 3000);
 | 
						||
    }
 | 
						||
});
 |