210 lines
6.9 KiB
JavaScript
210 lines
6.9 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 form = document.querySelector('form');
|
||
if (form) {
|
||
form.addEventListener('submit', function(e) {
|
||
const fileInput = document.getElementById('file');
|
||
if (!fileInput || !fileInput.files || !fileInput.files.length) {
|
||
e.preventDefault();
|
||
showMessage('请先选择要导入的Excel文件', 'warning');
|
||
return;
|
||
}
|
||
|
||
const importBtn = document.querySelector('.import-btn');
|
||
if (importBtn) {
|
||
importBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 正在导入...';
|
||
importBtn.disabled = true;
|
||
}
|
||
|
||
// 添加花朵飘落动画效果
|
||
addFallingElements(10);
|
||
|
||
// 设置超时处理,如果30秒后还没响应,提示用户
|
||
window.importTimeout = setTimeout(function() {
|
||
showMessage('导入处理时间较长,请耐心等待...', 'info');
|
||
}, 30000);
|
||
});
|
||
}
|
||
|
||
// 美化表单提交按钮的点击效果
|
||
const importBtn = document.querySelector('.import-btn');
|
||
if (importBtn) {
|
||
importBtn.addEventListener('click', function(e) {
|
||
// 按钮的点击效果已由表单提交事件处理
|
||
// 避免重复处理
|
||
if (!form || form.reportValidity() === false) {
|
||
e.preventDefault();
|
||
}
|
||
});
|
||
}
|
||
|
||
// 为浮动元素添加动画
|
||
initFloatingElements();
|
||
|
||
// 检查页面中的flash消息
|
||
checkFlashMessages();
|
||
});
|
||
|
||
// 检查页面中的flash消息
|
||
function checkFlashMessages() {
|
||
// Flask的flash消息通常会渲染为带有特定类的元素
|
||
const flashMessages = document.querySelectorAll('.alert');
|
||
if (flashMessages && flashMessages.length > 0) {
|
||
// 如果存在flash消息,说明页面是提交后重新加载的
|
||
// 恢复按钮状态
|
||
const importBtn = document.querySelector('.import-btn');
|
||
if (importBtn) {
|
||
importBtn.innerHTML = '<i class="fas fa-upload"></i> 开始导入';
|
||
importBtn.disabled = false;
|
||
}
|
||
|
||
// 清除可能的超时
|
||
if (window.importTimeout) {
|
||
clearTimeout(window.importTimeout);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 检查文件类型并尝试预览
|
||
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);
|
||
}
|
||
}
|