Book_system/app/static/js/book-import.js
2025-05-12 02:42:27 +08:00

166 lines
5.3 KiB
JavaScript

// 图书批量导入页面的JavaScript功能
document.addEventListener('DOMContentLoaded', function() {
// 显示选择的文件名
const fileInput = document.getElementById('file');
if (fileInput) {
fileInput.addEventListener('change', function() {
const fileName = this.value.split('\\').pop();
const label = document.querySelector('.custom-file-label');
if (label) {
label.textContent = fileName || '点击这里选择文件...';
// 添加有文件的类
if (fileName) {
this.parentElement.classList.add('has-file');
// 显示文件类型检查和预览信息
checkFileAndPreview(this.files[0]);
} else {
this.parentElement.classList.remove('has-file');
}
}
});
}
// 美化表单提交按钮的点击效果
const importBtn = document.querySelector('.import-btn');
if (importBtn) {
importBtn.addEventListener('click', function(e) {
if (!fileInput || !fileInput.files || !fileInput.files.length) {
e.preventDefault();
showMessage('请先选择要导入的Excel文件', 'warning');
return;
}
this.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 正在导入...';
this.disabled = true;
// 添加花朵飘落动画效果
addFallingElements(10);
});
}
// 为浮动元素添加动画
initFloatingElements();
});
// 检查文件类型并尝试预览
function checkFileAndPreview(file) {
if (!file) return;
// 检查文件类型
const validTypes = ['.xlsx', '.xls', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel'];
let isValid = false;
validTypes.forEach(type => {
if (file.name.toLowerCase().endsWith(type) || file.type === type) {
isValid = true;
}
});
if (!isValid) {
showMessage('请选择有效的Excel文件 (.xlsx 或 .xls)', 'warning');
return;
}
// 显示文件准备就绪的消息
showMessage(`文件 "${file.name}" 已准备就绪,点击"开始导入"按钮继续。`, 'success');
}
// 显示提示消息
function showMessage(message, type = 'info') {
// 检查是否已有消息容器
let messageContainer = document.querySelector('.import-message');
if (!messageContainer) {
// 创建新的消息容器
messageContainer = document.createElement('div');
messageContainer.className = 'import-message animate__animated animate__fadeIn';
// 插入到按钮之后
const importBtn = document.querySelector('.import-btn');
if (importBtn && importBtn.parentNode) {
importBtn.parentNode.insertBefore(messageContainer, importBtn.nextSibling);
}
}
// 设置消息内容和样式
messageContainer.innerHTML = `
<div class="alert alert-${type} mt-3">
<i class="fas ${getIconForMessageType(type)}"></i> ${message}
</div>
`;
// 如果是临时消息,设置自动消失
if (type !== 'danger') {
setTimeout(() => {
messageContainer.classList.add('animate__fadeOut');
setTimeout(() => {
if (messageContainer.parentNode) {
messageContainer.parentNode.removeChild(messageContainer);
}
}, 600);
}, 5000);
}
}
// 根据消息类型获取图标
function getIconForMessageType(type) {
switch (type) {
case 'success': return 'fa-check-circle';
case 'warning': return 'fa-exclamation-triangle';
case 'danger': return 'fa-times-circle';
default: return 'fa-info-circle';
}
}
// 初始化浮动元素
function initFloatingElements() {
const floatingElements = document.querySelectorAll('.snowflake, .flower');
floatingElements.forEach(element => {
const randomDuration = 15 + Math.random() * 20;
const randomDelay = Math.random() * 10;
element.style.animationDuration = `${randomDuration}s`;
element.style.animationDelay = `${randomDelay}s`;
});
}
// 添加花朵飘落效果
function addFallingElements(count) {
const container = document.querySelector('.import-container');
if (!container) return;
for (let i = 0; i < count; i++) {
const element = document.createElement('div');
element.className = 'falling-element animate__animated animate__fadeInDown';
// 随机选择花朵或雪花
const isFlower = Math.random() > 0.5;
element.classList.add(isFlower ? 'falling-flower' : 'falling-snowflake');
// 随机位置
const left = Math.random() * 100;
element.style.left = `${left}%`;
// 随机延迟
const delay = Math.random() * 2;
element.style.animationDelay = `${delay}s`;
// 随机大小
const size = 10 + Math.random() * 20;
element.style.width = `${size}px`;
element.style.height = `${size}px`;
container.appendChild(element);
// 动画结束后移除元素
setTimeout(() => {
if (element.parentNode) {
element.parentNode.removeChild(element);
}
}, 5000);
}
}