superlishunqin 0c1d1b0d19 detail
2025-04-30 23:28:51 +08:00

359 lines
19 KiB
HTML
Raw 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.

{% extends 'base.html' %}
{% block title %}添加图书 - 图书管理系统{% endblock %}
{% block head %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/book-form.css') }}">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.12/cropper.min.css">
{% endblock %}
{% block content %}
<div class="book-form-container animate__animated animate__fadeIn">
<!-- 顶部导航和标题区域 -->
<div class="page-header-wrapper">
<div class="page-header">
<div class="header-title-section">
<h1 class="page-title">添加新图书</h1>
<p class="subtitle">创建新书籍记录并添加到系统库存</p>
</div>
<div class="header-actions">
<a href="{{ url_for('book.book_list') }}" class="btn-back">
<i class="fas fa-arrow-left"></i>
<span>返回列表</span>
</a>
<div class="form-progress">
<div class="progress-bar-container">
<div class="progress-bar" role="progressbar" style="width: 0%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" id="formProgress"></div>
</div>
<span class="progress-text" id="progressText">完成 0%</span>
</div>
</div>
</div>
</div>
<!-- 主表单区域 -->
<form method="POST" enctype="multipart/form-data" class="book-form" id="bookForm">
<div class="form-grid">
<!-- 左侧表单区域 -->
<div class="form-main-content">
<!-- 基本信息卡片 -->
<div class="form-card">
<div class="card-header">
<span class="card-title">基本信息</span>
</div>
<div class="card-body">
<div class="form-section">
<div class="form-group">
<label for="title" class="form-label">书名 <span class="required">*</span></label>
<input type="text" class="form-control" id="title" name="title" required
placeholder="请输入完整图书名称" value="{{ book.title if book else '' }}">
<div class="form-help">完整准确的书名有助于读者查找</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="author" class="form-label">作者 <span class="required">*</span></label>
<input type="text" class="form-control" id="author" name="author" required
placeholder="请输入作者姓名" value="{{ book.author if book else '' }}">
</div>
<div class="form-group">
<label for="publisher" class="form-label">出版社</label>
<input type="text" class="form-control" id="publisher" name="publisher"
placeholder="请输入出版社名称" value="{{ book.publisher if book else '' }}">
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="isbn" class="form-label">ISBN</label>
<div class="input-with-button">
<input type="text" class="form-control" id="isbn" name="isbn"
placeholder="例如: 978-7-XXXXX-XXX-X" value="{{ book.isbn if book else '' }}">
<button type="button" class="btn-append" id="isbnLookup">
<i class="fas fa-search"></i>
</button>
</div>
<div class="form-help">输入ISBN并点击查询按钮自动填充图书信息</div>
</div>
<div class="form-group">
<label for="publish_year" class="form-label">出版年份</label>
<input type="text" class="form-control" id="publish_year" name="publish_year"
placeholder="例如: 2023" value="{{ book.publish_year if book else '' }}">
</div>
</div>
</div>
</div>
</div>
<!-- 分类和标签卡片 -->
<div class="form-card">
<div class="card-header">
<span class="card-title">分类与标签</span>
</div>
<div class="card-body">
<div class="form-section">
<div class="form-row">
<div class="form-group">
<label for="category_id" class="form-label">图书分类</label>
<select class="form-control select2" id="category_id" name="category_id">
<option value="">选择分类...</option>
{% for category in categories %}
<option value="{{ category.id }}" {% if book and book.category_id|string == category.id|string %}selected{% endif %}>
{{ category.name }}
</option>
{% endfor %}
</select>
<div class="form-help">为图书选择合适的分类以便于管理和查找</div>
</div>
<div class="form-group">
<label for="tagInput" class="form-label">标签</label>
<div class="tag-input-wrapper">
<input type="text" class="form-control" id="tagInput" placeholder="输入标签后按回车添加">
<input type="hidden" id="tags" name="tags" value="{{ book.tags if book else '' }}">
<button type="button" class="btn-tag-add" id="addTagBtn">
<i class="fas fa-plus"></i>
</button>
</div>
<div class="tags-container" id="tagsContainer"></div>
<div class="form-help">添加多个标签以提高图书的检索率</div>
</div>
</div>
</div>
</div>
</div>
<!-- 图书简介卡片 -->
<div class="form-card">
<div class="card-header">
<span class="card-title">图书简介</span>
</div>
<div class="card-body">
<div class="form-section">
<div class="form-group">
<label for="description" class="form-label">内容简介</label>
<textarea class="form-control" id="description" name="description" rows="8"
placeholder="请输入图书的简要介绍...">{{ book.description if book else '' }}</textarea>
<div class="form-footer">
<div class="form-help">简要描述图书的内容、特点和主要观点</div>
<div class="char-counter"><span id="charCount">0</span>/2000</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 右侧表单区域 -->
<div class="form-sidebar">
<!-- 封面图片卡片 -->
<div class="form-card">
<div class="card-header">
<span class="card-title">封面图片</span>
</div>
<div class="card-body">
<div class="cover-preview-container">
<div class="cover-preview" id="coverPreview">
<div class="no-cover-placeholder">
<i class="fas fa-book-open"></i>
<span>暂无封面</span>
<p class="placeholder-tip">点击上传或拖放图片至此处</p>
</div>
</div>
<div class="upload-options">
<div class="upload-btn-group">
<label for="cover" class="btn-upload">
<i class="fas fa-upload"></i> 上传图片
</label>
<button type="button" class="btn-remove" id="removeCover">
<i class="fas fa-trash-alt"></i>
</button>
</div>
<input type="file" id="cover" name="cover" class="form-control-file" accept="image/*" style="display:none;">
<div class="upload-tips">
<div>推荐尺寸: 500×700px (竖版封面)</div>
<div>支持格式: JPG, PNG, WebP</div>
</div>
</div>
</div>
</div>
</div>
<!-- 库存和价格卡片 -->
<div class="form-card">
<div class="card-header">
<span class="card-title">库存和价格</span>
</div>
<div class="card-body">
<div class="form-section">
<div class="form-group">
<label for="stock" class="form-label">库存数量</label>
<div class="number-control">
<button type="button" class="number-btn decrement" id="stockDecrement"></button>
<input type="number" class="form-control text-center" id="stock" name="stock" min="0"
value="{{ book.stock if book else 0 }}">
<button type="button" class="number-btn increment" id="stockIncrement"></button>
</div>
</div>
<div class="form-group">
<label for="price" class="form-label">价格</label>
<div class="price-input">
<span class="currency-symbol">¥</span>
<input type="number" class="form-control" id="price" name="price" step="0.01" min="0"
placeholder="0.00" value="{{ book.price if book else '' }}">
</div>
<div class="price-slider">
<input type="range" class="range-slider" id="priceRange" min="0" max="500" step="0.5"
value="{{ book.price if book and book.price else 0 }}">
<div class="slider-marks">
<span>¥0</span>
<span>¥250</span>
<span>¥500</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 提交按钮区域 -->
<div class="form-actions">
<button type="submit" class="btn-primary">
<i class="fas fa-save"></i> 保存图书
</button>
<div class="secondary-actions">
<button type="button" class="btn-secondary" id="previewBtn">
<i class="fas fa-eye"></i> 预览
</button>
<button type="reset" class="btn-secondary" id="resetBtn">
<i class="fas fa-undo"></i> 重置
</button>
</div>
<div class="form-tip">
<i class="fas fa-info-circle"></i>
<span><span class="required">*</span> 的字段为必填项</span>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- 图片裁剪模态框 -->
<div class="modal fade" id="cropperModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">调整封面图片</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="img-container">
<img id="cropperImage" src="" alt="图片预览">
</div>
<div class="cropper-controls">
<div class="control-group">
<button type="button" class="control-btn" id="rotateLeft" title="向左旋转">
<i class="fas fa-undo"></i>
</button>
<button type="button" class="control-btn" id="rotateRight" title="向右旋转">
<i class="fas fa-redo"></i>
</button>
</div>
<div class="control-group">
<button type="button" class="control-btn" id="zoomOut" title="缩小">
<i class="fas fa-search-minus"></i>
</button>
<button type="button" class="control-btn" id="zoomIn" title="放大">
<i class="fas fa-search-plus"></i>
</button>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn-secondary modal-btn" data-dismiss="modal">取消</button>
<button type="button" class="btn-primary modal-btn" id="cropImage">应用裁剪</button>
</div>
</div>
</div>
</div>
<!-- 图书预览模态框 -->
<div class="modal fade" id="previewModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header preview-header">
<h5 class="modal-title">图书预览</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body preview-body">
<div class="book-preview">
<div class="preview-cover-section">
<div class="book-preview-cover" id="previewCover">
<div class="no-cover-placeholder">
<i class="fas fa-book-open"></i>
<span>暂无封面</span>
</div>
</div>
<div class="book-meta">
<div class="book-price" id="previewPrice">¥0.00</div>
<div class="book-stock" id="previewStock">库存: 0</div>
</div>
</div>
<div class="preview-details-section">
<h2 class="book-title" id="previewTitle">书名加载中...</h2>
<div class="book-author" id="previewAuthor">作者加载中...</div>
<div class="book-info-grid">
<div class="info-item">
<div class="info-label">出版社</div>
<div class="info-value" id="previewPublisher">-</div>
</div>
<div class="info-item">
<div class="info-label">ISBN</div>
<div class="info-value" id="previewISBN">-</div>
</div>
<div class="info-item">
<div class="info-label">出版年份</div>
<div class="info-value" id="previewYear">-</div>
</div>
<div class="info-item">
<div class="info-label">分类</div>
<div class="info-value" id="previewCategory">-</div>
</div>
</div>
<div class="book-tags-preview" id="previewTags"></div>
<div class="book-description-preview">
<h3 class="section-title">图书简介</h3>
<div class="description-content" id="previewDescription">
<p class="placeholder-text">暂无简介内容</p>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer preview-footer">
<button type="button" class="btn-secondary modal-btn" data-dismiss="modal">关闭</button>
<button type="button" class="btn-primary modal-btn" data-dismiss="modal" id="continueEditBtn">继续编辑</button>
</div>
</div>
</div>
</div>
<!-- 通知容器 -->
<div class="notification-container"></div>
{% endblock %}
{% block scripts %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.12/cropper.min.js"></script>
<script src="{{ url_for('static', filename='js/book-add.js') }}"></script>
{% endblock %}