221 lines
9.5 KiB
HTML
221 lines
9.5 KiB
HTML
{% extends 'base.html' %}
|
||
|
||
{% block title %}首页 - 图书管理系统{% endblock %}
|
||
|
||
{% block head %}
|
||
<!-- 只引用index页面的专用样式 -->
|
||
<link rel="stylesheet" href="{{ url_for('static', filename='css/index.css') }}">
|
||
{% endblock %}
|
||
|
||
{% block content %}
|
||
<!-- 欢迎区域 -->
|
||
<div class="welcome-section">
|
||
<h1>欢迎回来,{{ current_user.username }}!</h1>
|
||
<p>今天是 <span id="current-date"></span>,祝您使用愉快。</p>
|
||
</div>
|
||
|
||
<!-- 快速统计 -->
|
||
<div class="stats-container">
|
||
<div class="stat-card">
|
||
<i class="fas fa-book stat-icon"></i>
|
||
<div class="stat-info">
|
||
<h3>馆藏总量</h3>
|
||
<p class="stat-number">{{ stats.total_books }}</p>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<i class="fas fa-users stat-icon"></i>
|
||
<div class="stat-info">
|
||
<h3>注册用户</h3>
|
||
<p class="stat-number">{{ stats.total_users }}</p>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<i class="fas fa-exchange-alt stat-icon"></i>
|
||
<div class="stat-info">
|
||
<h3>当前借阅</h3>
|
||
<p class="stat-number">{{ stats.active_borrows }}</p>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<i class="fas fa-clock stat-icon"></i>
|
||
<div class="stat-info">
|
||
<h3>待还图书</h3>
|
||
<p class="stat-number">{{ stats.user_borrows if current_user.is_authenticated else 0 }}</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 主要内容区 -->
|
||
<div class="main-sections">
|
||
<!-- 最新图书 -->
|
||
<div class="content-section book-section">
|
||
<div class="section-header">
|
||
<h2>最新图书</h2>
|
||
<a href="{{ url_for('book.browse_books', sort='newest') }}" class="view-all">查看全部 <i class="fas fa-arrow-right"></i></a>
|
||
</div>
|
||
<div class="book-grid">
|
||
{% if latest_books %}
|
||
{% for book in latest_books %}
|
||
<div class="book-card">
|
||
<div class="book-cover">
|
||
{% if book.cover_url %}
|
||
<img src="{{ book.cover_url }}" alt="{{ book.title }} 封面">
|
||
{% else %}
|
||
<img src="{{ url_for('static', filename='images/book-placeholder.jpg') }}" alt="无封面">
|
||
{% endif %}
|
||
</div>
|
||
<div class="book-info">
|
||
<h3 class="book-title">{{ book.title }}</h3>
|
||
<p class="book-author">{{ book.author }}</p>
|
||
<div class="book-meta">
|
||
<span class="book-category">{{ book.category.name if book.category else '未分类' }}</span>
|
||
<span class="book-status {{ 'available' if book.stock > 0 else 'unavailable' }}">
|
||
{{ '可借阅' if book.stock > 0 else '已借完' }}
|
||
</span>
|
||
</div>
|
||
<a href="{{ url_for('book.book_detail', book_id=book.id) }}" class="borrow-btn">
|
||
{{ '借阅' if book.stock > 0 else '详情' }}
|
||
</a>
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
{% else %}
|
||
{% for i in range(4) %}
|
||
<div class="book-card">
|
||
<div class="book-cover">
|
||
<img src="https://via.placeholder.com/150x210?text=No+Cover" alt="Book Cover">
|
||
</div>
|
||
<div class="book-info">
|
||
<h3 class="book-title">示例图书标题</h3>
|
||
<p class="book-author">作者名</p>
|
||
<div class="book-meta">
|
||
<span class="book-category">计算机</span>
|
||
<span class="book-status available">可借阅</span>
|
||
</div>
|
||
<button class="borrow-btn">借阅</button>
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 通知公告 -->
|
||
<div class="content-section notice-section">
|
||
<div class="section-header">
|
||
<h2>通知公告</h2>
|
||
<a href="{{ url_for('announcement.announcement_list') }}" class="view-all">查看全部 <i class="fas fa-arrow-right"></i></a>
|
||
</div>
|
||
<div class="notice-list">
|
||
{% if announcements %}
|
||
{% for announcement in announcements %}
|
||
<div class="notice-item {% if announcement.is_top %}pinned{% endif %}">
|
||
<div class="notice-icon"><i class="fas fa-bullhorn"></i></div>
|
||
<div class="notice-content">
|
||
<h3><a href="{{ url_for('announcement.announcement_detail', announcement_id=announcement.id) }}">{{ announcement.title }}</a></h3>
|
||
<p>{{ announcement.content|striptags|truncate(100) }}</p>
|
||
<div class="notice-meta">
|
||
<span class="notice-time">{{ announcement.created_at.strftime('%Y-%m-%d') }}</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
{% else %}
|
||
<div class="notice-item">
|
||
<div class="notice-icon"><i class="fas fa-bullhorn"></i></div>
|
||
<div class="notice-content">
|
||
<h3>暂无公告</h3>
|
||
<p>目前没有任何通知公告</p>
|
||
<div class="notice-meta">
|
||
<span class="notice-time">{{ now.strftime('%Y-%m-%d') }}</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endif %}
|
||
|
||
{% if current_user.is_authenticated and user_notifications %}
|
||
<div class="notice-item">
|
||
<div class="notice-icon"><i class="fas fa-bell"></i></div>
|
||
<div class="notice-content">
|
||
<h3>您有{{ user_notifications|length }}条未读通知</h3>
|
||
<p>
|
||
{% for notification in user_notifications %}
|
||
{% if loop.index <= 2 %}
|
||
{{ notification.title }}{% if not loop.last and loop.index < 2 %}、{% endif %}
|
||
{% endif %}
|
||
{% endfor %}
|
||
{% if user_notifications|length > 2 %}等{% endif %}
|
||
</p>
|
||
<div class="notice-meta">
|
||
<span class="notice-time">{{ now.strftime('%Y-%m-%d') }}</span>
|
||
<a href="{{ url_for('announcement.user_notifications') }}" class="renew-btn">查看详情</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 热门图书区域 -->
|
||
<div class="content-section popular-section">
|
||
<div class="section-header">
|
||
<h2>热门图书</h2>
|
||
<a href="{{ url_for('book.browse_books', sort='popular') }}" class="view-all">查看全部 <i class="fas fa-arrow-right"></i></a>
|
||
</div>
|
||
<div class="popular-books">
|
||
{% if popular_books %}
|
||
{% for book in popular_books %}
|
||
<div class="popular-book-item">
|
||
<div class="rank-badge">{{ loop.index }}</div>
|
||
<div class="book-cover small">
|
||
{% if book.cover_url %}
|
||
<img src="{{ book.cover_url }}" alt="{{ book.title }} 封面">
|
||
{% else %}
|
||
<img src="{{ url_for('static', filename='images/book-placeholder.jpg') }}" alt="无封面">
|
||
{% endif %}
|
||
</div>
|
||
<div class="book-details">
|
||
<h3 class="book-title">{{ book.title }}</h3>
|
||
<p class="book-author">{{ book.author }}</p>
|
||
<div class="book-stats">
|
||
<span><i class="fas fa-eye"></i> {{ book.view_count if book.view_count else 0 }} 次浏览</span>
|
||
<span><i class="fas fa-bookmark"></i> {{ book.borrow_count if book.borrow_count else 0 }} 次借阅</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
{% else %}
|
||
{% for i in range(5) %}
|
||
<div class="popular-book-item">
|
||
<div class="rank-badge">{{ i+1 }}</div>
|
||
<div class="book-cover small">
|
||
<img src="https://via.placeholder.com/80x120?text=Book" alt="Book Cover">
|
||
</div>
|
||
<div class="book-details">
|
||
<h3 class="book-title">热门图书标题示例</h3>
|
||
<p class="book-author">知名作者</p>
|
||
<div class="book-stats">
|
||
<span><i class="fas fa-eye"></i> 1024 次浏览</span>
|
||
<span><i class="fas fa-bookmark"></i> 89 次借阅</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endfor %}
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
{% endblock %}
|
||
|
||
{% block scripts %}
|
||
<script>
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
// 设置当前日期
|
||
const now = new Date();
|
||
const options = { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' };
|
||
document.getElementById('current-date').textContent = now.toLocaleDateString('zh-CN', options);
|
||
});
|
||
</script>
|
||
{% endblock %}
|