175 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
{% extends 'base.html' %}
 | 
						||
 | 
						||
{% block title %}图书花园 - 批量导入{% endblock %}
 | 
						||
 | 
						||
{% block head %}
 | 
						||
<link rel="stylesheet" href="{{ url_for('static', filename='css/book-import.css') }}">
 | 
						||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
 | 
						||
<link href="https://fonts.googleapis.com/css2?family=Dancing+Script&family=Playfair+Display&display=swap" rel="stylesheet">
 | 
						||
{% endblock %}
 | 
						||
 | 
						||
{% block content %}
 | 
						||
<div class="import-container">
 | 
						||
    <div class="page-header animate__animated animate__fadeIn">
 | 
						||
        <h1 class="fancy-title">图书花园 <span class="subtitle">批量导入</span></h1>
 | 
						||
        <a href="{{ url_for('book.book_list') }}" class="btn btn-return">
 | 
						||
            <i class="fas fa-arrow-left"></i> 返回图书列表
 | 
						||
        </a>
 | 
						||
    </div>
 | 
						||
 | 
						||
    <div class="row">
 | 
						||
        <div class="col-md-8 offset-md-2">
 | 
						||
            <div class="card animate__animated animate__fadeInUp">
 | 
						||
                <div class="card-header">
 | 
						||
                    <h4><i class="fas fa-magic sparkle"></i> 添加您的图书收藏</h4>
 | 
						||
                </div>
 | 
						||
                <div class="card-body">
 | 
						||
                    <form method="POST" enctype="multipart/form-data">
 | 
						||
                        <div class="form-group file-upload-wrapper">
 | 
						||
                            <label for="file" class="elegant-label">选择您的Excel文件</label>
 | 
						||
                            <div class="custom-file">
 | 
						||
                                <input type="file" class="custom-file-input" id="file" name="file" accept=".xlsx, .xls" required>
 | 
						||
                                <label class="custom-file-label" for="file">点击这里选择文件...</label>
 | 
						||
                            </div>
 | 
						||
                            <small class="form-text text-muted">支持的文件格式: .xlsx, .xls</small>
 | 
						||
                        </div>
 | 
						||
 | 
						||
                        <button type="submit" class="btn btn-primary btn-lg btn-block import-btn">
 | 
						||
                            <i class="fas fa-upload"></i> 开始导入
 | 
						||
                        </button>
 | 
						||
                    </form>
 | 
						||
 | 
						||
                    <div class="divider">
 | 
						||
                        <span class="divider-content"><i class="fas fa-book-open"></i></span>
 | 
						||
                    </div>
 | 
						||
 | 
						||
                    <div class="import-instructions animate__animated animate__fadeIn">
 | 
						||
                        <h5 class="instruction-title"><i class="fas fa-leaf"></i> 导入指南</h5>
 | 
						||
                        <div class="instruction-content">
 | 
						||
                            <p>Excel文件须包含以下字段 (标题行必须与下列完全一致):</p>
 | 
						||
                            <ul class="elegant-list">
 | 
						||
                                <li class="required-field"><span class="field-name">title</span> - 图书标题 <span class="required-badge">必填</span></li>
 | 
						||
                                <li class="required-field"><span class="field-name">author</span> - 作者名称 <span class="required-badge">必填</span></li>
 | 
						||
                                <li><span class="field-name">publisher</span> - 出版社</li>
 | 
						||
                                <li><span class="field-name">category_id</span> - 分类ID</li>
 | 
						||
                                <li><span class="field-name">tags</span> - 标签 (多个标签用逗号分隔)</li>
 | 
						||
                                <li><span class="field-name">isbn</span> - ISBN编号</li>
 | 
						||
                                <li><span class="field-name">publish_year</span> - 出版年份</li>
 | 
						||
                                <li><span class="field-name">description</span> - 图书简介</li>
 | 
						||
                                <li><span class="field-name">cover_url</span> - 封面图片URL</li>
 | 
						||
                                <li><span class="field-name">stock</span> - 库存数量</li>
 | 
						||
                                <li><span class="field-name">price</span> - 价格</li>
 | 
						||
                            </ul>
 | 
						||
                        </div>
 | 
						||
 | 
						||
                        <div class="template-download animate__animated animate__pulse animate__infinite animate__slower">
 | 
						||
                            <p>不确定如何开始? 下载我们精心准备的模板:</p>
 | 
						||
                            <button type="button" id="downloadTemplateBtn" class="btn download-btn">
 | 
						||
                                <i class="fas fa-download"></i> 下载Excel模板
 | 
						||
                            </button>
 | 
						||
                            <!-- 用于显示下载成功或失败的消息 -->
 | 
						||
                            <div id="downloadMessage" style="margin-top: 10px; display: none;"></div>
 | 
						||
                        </div>
 | 
						||
                    </div>
 | 
						||
                </div>
 | 
						||
            </div>
 | 
						||
        </div>
 | 
						||
    </div>
 | 
						||
 | 
						||
    <div class="floating-elements">
 | 
						||
        <div class="snowflake snowflake-1"></div>
 | 
						||
        <div class="snowflake snowflake-2"></div>
 | 
						||
        <div class="snowflake snowflake-3"></div>
 | 
						||
        <div class="snowflake snowflake-4"></div>
 | 
						||
        <div class="flower flower-1"></div>
 | 
						||
        <div class="flower flower-2"></div>
 | 
						||
    </div>
 | 
						||
 | 
						||
    <!-- 基本模板隐藏在页面里,以便在无法请求服务器时使用 -->
 | 
						||
    <div style="display:none;">
 | 
						||
        <a id="directDownloadLink" href="#" download="book_import_template.xlsx"></a>
 | 
						||
    </div>
 | 
						||
</div>
 | 
						||
{% endblock %}
 | 
						||
 | 
						||
{% block scripts %}
 | 
						||
<script src="{{ url_for('static', filename='js/book-import.js') }}"></script>
 | 
						||
<script>
 | 
						||
    // 添加下载模板的JavaScript代码
 | 
						||
    document.addEventListener('DOMContentLoaded', function() {
 | 
						||
        const downloadBtn = document.getElementById('downloadTemplateBtn');
 | 
						||
        const messageDiv = document.getElementById('downloadMessage');
 | 
						||
        const directLink = document.getElementById('directDownloadLink');
 | 
						||
 | 
						||
        if (downloadBtn) {
 | 
						||
            downloadBtn.addEventListener('click', function(e) {
 | 
						||
                e.preventDefault();
 | 
						||
 | 
						||
                // 显示下载中状态
 | 
						||
                const originalText = downloadBtn.innerHTML;
 | 
						||
                downloadBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> 准备下载中...';
 | 
						||
                downloadBtn.disabled = true;
 | 
						||
 | 
						||
                // 方法1: 使用fetch API请求文件并手动触发下载
 | 
						||
                fetch('{{ url_for("book.download_template") }}', {
 | 
						||
                    method: 'GET',
 | 
						||
                    credentials: 'same-origin'
 | 
						||
                })
 | 
						||
                .then(response => {
 | 
						||
                    if (!response.ok) {
 | 
						||
                        throw new Error('下载请求失败,状态码: ' + response.status);
 | 
						||
                    }
 | 
						||
                    return response.blob();
 | 
						||
                })
 | 
						||
                .then(blob => {
 | 
						||
                    // 创建临时URL
 | 
						||
                    const url = window.URL.createObjectURL(blob);
 | 
						||
 | 
						||
                    // 设置下载链接
 | 
						||
                    directLink.href = url;
 | 
						||
                    directLink.download = 'book_import_template.xlsx';
 | 
						||
 | 
						||
                    // 触发点击
 | 
						||
                    directLink.click();
 | 
						||
 | 
						||
                    // 释放URL对象
 | 
						||
                    window.URL.revokeObjectURL(url);
 | 
						||
 | 
						||
                    // 显示成功消息
 | 
						||
                    messageDiv.innerHTML = '<div class="alert alert-success">模板下载成功!</div>';
 | 
						||
                    messageDiv.style.display = 'block';
 | 
						||
 | 
						||
                    // 3秒后隐藏消息
 | 
						||
                    setTimeout(() => {
 | 
						||
                        messageDiv.style.display = 'none';
 | 
						||
                    }, 3000);
 | 
						||
                })
 | 
						||
                .catch(error => {
 | 
						||
                    console.error('下载失败:', error);
 | 
						||
 | 
						||
                    // 显示错误消息
 | 
						||
                    messageDiv.innerHTML = '<div class="alert alert-danger">下载失败,请稍后重试。</div>';
 | 
						||
                    messageDiv.style.display = 'block';
 | 
						||
 | 
						||
                    // 方法2: 如果fetch失败,尝试使用window.open在新标签页下载
 | 
						||
                    window.open('{{ url_for("book.download_template") }}', '_blank');
 | 
						||
                })
 | 
						||
                .finally(() => {
 | 
						||
                    // 恢复按钮状态
 | 
						||
                    downloadBtn.innerHTML = originalText;
 | 
						||
                    downloadBtn.disabled = false;
 | 
						||
                });
 | 
						||
 | 
						||
                // 方法3: 超时后,如果以上方法都失败,提供直接链接让用户手动点击
 | 
						||
                setTimeout(function() {
 | 
						||
                    if (messageDiv.innerHTML.includes('下载失败') || messageDiv.style.display === 'none') {
 | 
						||
                        messageDiv.innerHTML = '<div class="alert alert-warning">下载似乎没有开始。<a href="{{ url_for("book.download_template") }}" target="_blank" download class="alert-link">点击这里</a>手动下载。</div>';
 | 
						||
                        messageDiv.style.display = 'block';
 | 
						||
                    }
 | 
						||
                }, 5000);
 | 
						||
            });
 | 
						||
        }
 | 
						||
    });
 | 
						||
</script>
 | 
						||
{% endblock %}
 |