feat: 重构所有模板页面,增强UI/UX体验

- 统一所有页面的卡片布局和样式
- 为表单页面添加图标和更好的视觉层次
- 改进表格的响应式和交互体验
- 为删除确认页面添加统一的警告样式
- 优化登录页面的视觉设计
- 为所有操作按钮添加图标增强可识别性
- 添加空状态提示和更友好的引导
This commit is contained in:
2026-01-28 21:23:23 +08:00
parent 7cb93fff80
commit bf7f9a8a64
25 changed files with 2444 additions and 970 deletions

View File

@@ -1,27 +1,72 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>添加家庭事项</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-list-check me-2 text-warning"></i>添加家庭事项
</h2>
<a href="{% url 'family_tasks' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-warning text-white">
<h5 class="card-title mb-0">
<i class="bi bi-plus-circle me-2"></i>填写家庭事项信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'type' %}
<i class="bi bi-folder me-1 text-warning"></i>
{% elif field.name == 'content' %}
<i class="bi bi-text-paragraph me-1 text-warning"></i>
{% elif field.name == 'priority' %}
<i class="bi bi-flag me-1 text-warning"></i>
{% elif field.name == 'deadline' %}
<i class="bi bi-calendar me-1 text-warning"></i>
{% elif field.name == 'status' %}
<i class="bi bi-check-circle me-1 text-warning"></i>
{% else %}
<i class="bi bi-circle me-1 text-warning"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'family_tasks' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-warning px-4 text-white">
<i class="bi bi-check-lg me-1"></i>保存
</button>
<a href="{% url 'family_tasks' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,68 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>添加感悟记录</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-lightbulb me-2 text-success"></i>添加感悟记录
</h2>
<a href="{% url 'yesterday_records' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" enctype="multipart/form-data" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-success text-white">
<h5 class="card-title mb-0">
<i class="bi bi-plus-circle me-2"></i>填写感悟记录信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'content' %}
<i class="bi bi-chat-text me-1 text-success"></i>
{% elif field.name == 'file' %}
<i class="bi bi-paperclip me-1 text-success"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-success"></i>
{% else %}
<i class="bi bi-circle me-1 text-success"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-success px-4">
<i class="bi bi-check-lg me-1"></i>保存
</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,76 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>添加阅读记录</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-book me-2 text-primary"></i>添加阅读记录
</h2>
<a href="{% url 'yesterday_records' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" enctype="multipart/form-data" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">
<i class="bi bi-plus-circle me-2"></i>填写阅读记录信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'title' %}
<i class="bi bi-type me-1 text-primary"></i>
{% elif field.name == 'type' %}
<i class="bi bi-tag me-1 text-primary"></i>
{% elif field.name == 'source' %}
<i class="bi bi-link-45deg me-1 text-primary"></i>
{% elif field.name == 'progress' %}
<i class="bi bi-percent me-1 text-primary"></i>
{% elif field.name == 'note' %}
<i class="bi bi-sticky me-1 text-primary"></i>
{% elif field.name == 'file' %}
<i class="bi bi-paperclip me-1 text-primary"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-primary"></i>
{% else %}
<i class="bi bi-circle me-1 text-primary"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-primary px-4">
<i class="bi bi-check-lg me-1"></i>保存
</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,72 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>添加汇总记录</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-collection me-2 text-info"></i>添加汇总记录
</h2>
<a href="{% url 'summaries' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" enctype="multipart/form-data" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-info text-dark">
<h5 class="card-title mb-0">
<i class="bi bi-plus-circle me-2"></i>填写汇总记录信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'category' %}
<i class="bi bi-folder me-1 text-info"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-info"></i>
{% elif field.name == 'content' %}
<i class="bi bi-text-paragraph me-1 text-info"></i>
{% elif field.name == 'source' %}
<i class="bi bi-link-45deg me-1 text-info"></i>
{% elif field.name == 'file' %}
<i class="bi bi-paperclip me-1 text-info"></i>
{% else %}
<i class="bi bi-circle me-1 text-info"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'summaries' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-info px-4 text-white">
<i class="bi bi-check-lg me-1"></i>保存
</button>
<a href="{% url 'summaries' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,72 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>添加今日计划</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-calendar-check me-2 text-success"></i>添加今日计划
</h2>
<a href="{% url 'today_plan' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-success text-white">
<h5 class="card-title mb-0">
<i class="bi bi-plus-circle me-2"></i>填写今日计划信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'type' %}
<i class="bi bi-folder me-1 text-success"></i>
{% elif field.name == 'content' %}
<i class="bi bi-text-paragraph me-1 text-success"></i>
{% elif field.name == 'priority' %}
<i class="bi bi-flag me-1 text-success"></i>
{% elif field.name == 'status' %}
<i class="bi bi-check-circle me-1 text-success"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-success"></i>
{% else %}
<i class="bi bi-circle me-1 text-success"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'today_plan' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-success px-4">
<i class="bi bi-check-lg me-1"></i>保存
</button>
<a href="{% url 'today_plan' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -6,80 +6,502 @@
<title>家庭日报系统</title>
<!-- Bootstrap 5 CSS -->
<link href="https://testingcf.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Bootstrap Icons -->
<link href="https://testingcf.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css" rel="stylesheet">
<!-- Chart.js -->
<script src="https://testingcf.jsdelivr.net/npm/chart.js"></script>
<style>
/* 自定义样式 */
.nav-item.active .nav-link {
font-weight: bold;
color: #0d6efd !important;
:root {
--primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--secondary-gradient: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
--success-gradient: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
--warning-gradient: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
--info-gradient: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
--dark-gradient: linear-gradient(135deg, #2c3e50 0%, #4ca1af 100%);
}
body {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
min-height: 100vh;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
}
/* 导航栏样式 */
.navbar {
background: var(--dark-gradient) !important;
box-shadow: 0 2px 20px rgba(0,0,0,0.1);
padding: 0.5rem 0;
}
.navbar-brand {
font-weight: 700;
font-size: 1.2rem;
color: #fff !important;
text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
white-space: nowrap;
}
.navbar-nav {
flex-wrap: nowrap;
}
.navbar-nav .nav-item {
white-space: nowrap;
}
.navbar-nav .nav-link {
color: rgba(255,255,255,0.9) !important;
font-weight: 500;
padding: 0.4rem 0.6rem !important;
border-radius: 6px;
transition: all 0.3s ease;
margin: 0 0.1rem;
font-size: 0.9rem;
white-space: nowrap;
display: flex;
align-items: center;
gap: 0.3rem;
}
.navbar-nav .nav-link:hover {
background: rgba(255,255,255,0.15);
color: #fff !important;
transform: translateY(-1px);
}
.navbar-nav .nav-link.active {
background: rgba(255,255,255,0.25);
color: #fff !important;
font-weight: 600;
}
.navbar-nav .nav-link i {
font-size: 1rem;
}
.navbar-collapse {
flex-wrap: nowrap;
}
.container {
max-width: 1400px;
}
/* 卡片样式 */
.card {
margin-bottom: 1.5rem;
border: none;
border-radius: 16px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
transition: all 0.3s ease;
background: rgba(255,255,255,0.95);
backdrop-filter: blur(10px);
overflow: hidden;
}
.card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 30px rgba(0,0,0,0.12);
}
.card-header {
border-bottom: none;
padding: 1.2rem 1.5rem;
font-weight: 600;
}
.card-header.bg-primary {
background: var(--primary-gradient) !important;
}
.card-header.bg-success {
background: var(--success-gradient) !important;
}
.card-header.bg-warning {
background: var(--warning-gradient) !important;
color: #fff !important;
}
.card-header.bg-info {
background: var(--info-gradient) !important;
color: #2c3e50 !important;
}
.card-header.bg-secondary {
background: var(--dark-gradient) !important;
}
.card-header.bg-danger {
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a6f 100%) !important;
}
.card-body {
padding: 1.5rem;
}
/* 按钮样式 */
.btn {
border-radius: 10px;
font-weight: 500;
padding: 0.5rem 1.2rem;
transition: all 0.3s ease;
border: none;
}
.btn-primary {
background: var(--primary-gradient);
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5);
}
.btn-success {
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
box-shadow: 0 4px 15px rgba(17, 153, 142, 0.4);
}
.btn-success:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(17, 153, 142, 0.5);
}
.btn-danger {
background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%);
box-shadow: 0 4px 15px rgba(255, 65, 108, 0.4);
}
.btn-warning {
background: var(--warning-gradient);
color: #fff;
box-shadow: 0 4px 15px rgba(250, 112, 154, 0.4);
}
.btn-info {
background: var(--success-gradient);
color: #fff;
box-shadow: 0 4px 15px rgba(79, 172, 254, 0.4);
}
.btn-secondary {
background: linear-gradient(135deg, #8e9eab 0%, #eef2f3 100%);
color: #555;
box-shadow: 0 4px 15px rgba(142, 158, 171, 0.3);
}
.btn-outline-primary {
border: 2px solid #667eea;
color: #667eea;
background: transparent;
}
.btn-outline-primary:hover {
background: var(--primary-gradient);
border-color: transparent;
}
.btn-sm {
margin: 0 0.25rem;
padding: 0.35rem 0.8rem;
font-size: 0.85rem;
}
/* 表格样式 */
.table {
border-radius: 12px;
overflow: hidden;
}
.table thead th {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border-bottom: 2px solid #dee2e6;
font-weight: 600;
color: #495057;
padding: 1rem;
}
.table tbody td {
padding: 1rem;
vertical-align: middle;
}
.table-striped > tbody > tr:nth-of-type(odd) > td {
background-color: rgba(102, 126, 234, 0.03);
}
.table-hover tbody tr:hover {
background-color: rgba(102, 126, 234, 0.08);
}
/* 列表组样式 */
.list-group-item {
border: none;
border-radius: 12px !important;
margin-bottom: 0.5rem;
background: rgba(255,255,255,0.8);
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
transition: all 0.3s ease;
padding: 1rem 1.2rem;
}
.list-group-item:hover {
transform: translateX(5px);
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
/* 徽章样式 */
.badge {
padding: 0.5em 0.8em;
border-radius: 20px;
font-weight: 500;
font-size: 0.8rem;
}
.bg-success {
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%) !important;
}
.bg-warning {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%) !important;
}
.bg-danger {
background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%) !important;
}
.bg-info {
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%) !important;
}
.bg-secondary {
background: linear-gradient(135deg, #8e9eab 0%, #eef2f3 100%) !important;
color: #555 !important;
}
/* 表单样式 */
.form-control, .form-select {
border-radius: 10px;
border: 2px solid #e9ecef;
padding: 0.6rem 1rem;
transition: all 0.3s ease;
}
.form-control:focus, .form-select:focus {
border-color: #667eea;
box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25);
}
.form-label {
font-weight: 600;
color: #495057;
margin-bottom: 0.5rem;
}
/* 警告框样式 */
.alert {
border: none;
border-radius: 12px;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
.alert-success {
background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
}
.alert-danger {
background: linear-gradient(135deg, #f8d7da 0%, #f5c6cb 100%);
}
.alert-warning {
background: linear-gradient(135deg, #fff3cd 0%, #ffeeba 100%);
}
.alert-info {
background: linear-gradient(135deg, #d1ecf1 0%, #bee5eb 100%);
}
/* 页脚样式 */
footer {
background: var(--dark-gradient) !important;
color: rgba(255,255,255,0.8) !important;
margin-top: auto;
}
footer .text-muted {
color: rgba(255,255,255,0.7) !important;
}
/* 文件链接样式 */
.file-link {
font-size: 0.875rem;
color: #6c757d;
color: #667eea;
text-decoration: none;
font-weight: 500;
}
.file-link:hover {
color: #764ba2;
text-decoration: underline;
}
/* 状态徽章 */
.status-badge {
font-size: 0.75rem;
padding: 0.4em 0.8em;
}
/* 页面标题 */
h2 {
color: #2c3e50;
font-weight: 700;
margin-bottom: 1.5rem;
position: relative;
padding-bottom: 0.5rem;
}
h2::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 60px;
height: 4px;
background: var(--primary-gradient);
border-radius: 2px;
}
h5 {
font-weight: 600;
color: #34495e;
}
h6 {
font-weight: 600;
color: #495057;
}
/* 主要内容区域 */
main.container {
padding-top: 2rem;
padding-bottom: 2rem;
}
/* 快捷操作按钮组 */
.btn-group-vertical .btn {
margin-bottom: 0.5rem;
border-radius: 10px !important;
}
/* 响应式调整 */
@media (max-width: 768px) {
.card {
margin-bottom: 1rem;
}
.navbar-nav .nav-link {
margin: 0.2rem 0;
}
h2 {
font-size: 1.5rem;
}
}
/* 动画效果 */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.card {
animation: fadeIn 0.5s ease-out;
}
/* 图表容器 */
.chart-container {
position: relative;
height: 250px;
}
</style>
</head>
<body>
<body class="d-flex flex-column">
<!-- 导航栏 -->
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<nav class="navbar navbar-expand-lg navbar-dark">
<div class="container">
<a class="navbar-brand" href="{% url 'index' %}">家庭日报系统</a>
<a class="navbar-brand" href="{% url 'index' %}">
<i class="bi bi-house-heart-fill me-2"></i>家庭日报系统
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.url_name == 'index' %}active{% endif %}" href="{% url 'index' %}">首页</a>
<a class="nav-link {% if request.resolver_match.url_name == 'index' %}active{% endif %}" href="{% url 'index' %}">
<i class="bi bi-speedometer2"></i><span>首页</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.url_name == 'yesterday_records' or 'add_reading' in request.path or 'edit_reading' in request.path or 'add_insight' in request.path or 'edit_insight' in request.path %}active{% endif %}" href="{% url 'yesterday_records' %}">昨日记录</a>
<a class="nav-link {% if request.resolver_match.url_name == 'yesterday_records' or 'add_reading' in request.path or 'edit_reading' in request.path or 'add_insight' in request.path or 'edit_insight' in request.path %}active{% endif %}" href="{% url 'yesterday_records' %}">
<i class="bi bi-journal-text"></i><span>昨日记录</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.url_name == 'summaries' or 'add_summary' in request.path or 'edit_summary' in request.path %}active{% endif %}" href="{% url 'summaries' %}">汇总记录</a>
<a class="nav-link {% if request.resolver_match.url_name == 'summaries' or 'add_summary' in request.path or 'edit_summary' in request.path %}active{% endif %}" href="{% url 'summaries' %}">
<i class="bi bi-collection"></i><span>汇总记录</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.url_name == 'family_tasks' or 'add_family_task' in request.path or 'edit_family_task' in request.path %}active{% endif %}" href="{% url 'family_tasks' %}">家庭事项</a>
<a class="nav-link {% if request.resolver_match.url_name == 'family_tasks' or 'add_family_task' in request.path or 'edit_family_task' in request.path %}active{% endif %}" href="{% url 'family_tasks' %}">
<i class="bi bi-list-check"></i><span>家庭事项</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.url_name == 'today_plan' or 'add_today_plan' in request.path or 'edit_today_plan' in request.path %}active{% endif %}" href="{% url 'today_plan' %}">今日计划</a>
<a class="nav-link {% if request.resolver_match.url_name == 'today_plan' or 'add_today_plan' in request.path or 'edit_today_plan' in request.path %}active{% endif %}" href="{% url 'today_plan' %}">
<i class="bi bi-calendar-check"></i><span>今日计划</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.url_name == 'generate_report' or 'view_report' in request.path or 'generate_pdf_report' in request.path %}active{% endif %}" href="{% url 'generate_report' %}">报告生成</a>
<a class="nav-link {% if request.resolver_match.url_name == 'generate_report' or 'view_report' in request.path or 'generate_pdf_report' in request.path %}active{% endif %}" href="{% url 'generate_report' %}">
<i class="bi bi-file-earmark-pdf"></i><span>报告生成</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if request.resolver_match.url_name == 'system_settings' %}active{% endif %}" href="{% url 'system_settings' %}">系统配置</a>
<a class="nav-link {% if request.resolver_match.url_name == 'system_settings' %}active{% endif %}" href="{% url 'system_settings' %}">
<i class="bi bi-gear"></i><span>系统配置</span>
</a>
</li>
</ul>
<ul class="navbar-nav">
{% if user.is_authenticated %}
<li class="nav-item">
<span class="nav-link">欢迎,{{ user.username }}</span>
<span class="nav-link">
<i class="bi bi-person-circle"></i><span>欢迎,{{ user.username }}</span>
</span>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'logout' %}">注销</a>
<a class="nav-link" href="{% url 'logout' %}">
<i class="bi bi-box-arrow-right"></i><span>注销</span>
</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{% url 'login' %}">登录</a>
<a class="nav-link" href="{% url 'login' %}">
<i class="bi bi-box-arrow-in-right"></i><span>登录</span>
</a>
</li>
{% endif %}
<li class="nav-item">
<a class="nav-link" href="/houtai/">后台管理</a>
<a class="nav-link" href="/houtai/">
<i class="bi bi-shield-lock"></i><span>后台管理</span>
</a>
</li>
</ul>
</div>
@@ -87,11 +509,11 @@
</nav>
<!-- 主要内容区域 -->
<main class="container mt-4">
<main class="container mt-4 flex-grow-1">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
{{ message }}
<i class="bi bi-info-circle-fill me-2"></i>{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endfor %}
@@ -102,9 +524,12 @@
</main>
<!-- 页脚 -->
<footer class="bg-light text-center text-lg-start mt-5 py-3">
<footer class="text-center text-lg-start mt-5 py-4">
<div class="container">
<p class="text-muted">© 2024 家庭日报系统 - 专注于家庭生活的轻量级日报系统</p>
<p class="mb-0">
<i class="bi bi-heart-fill me-2"></i>
2024 家庭日报系统 - 专注于家庭生活的轻量级日报系统
</p>
</div>
</footer>

View File

@@ -1,18 +1,53 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>删除家庭事项</h2>
<div class="alert alert-danger mt-4">
<p>您确定要删除这条家庭事项吗?</p>
<p><strong>{{ task.content }}</strong> ({{ task.get_type_display }})</p>
<p>此操作不可恢复。</p>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-trash me-2 text-danger"></i>删除家庭事项
</h2>
</div>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card border-danger">
<div class="card-header bg-danger text-white text-center py-4">
<i class="bi bi-exclamation-triangle" style="font-size: 3rem;"></i>
<h5 class="card-title mb-0 mt-2">确认删除</h5>
</div>
<div class="card-body text-center">
<p class="mb-4">您确定要删除以下家庭事项吗?</p>
<div class="alert alert-light border">
<div class="mb-2">
<span class="badge bg-secondary me-2">{{ task.get_type_display }}</span>
<span class="badge {% if task.priority == 'high' %}bg-danger{% elif task.priority == 'medium' %}bg-warning{% else %}bg-info{% endif %}">
{{ task.get_priority_display }}
</span>
</div>
<h6 class="mb-0">{{ task.content }}</h6>
{% if task.deadline %}
<p class="mb-0 mt-2 text-muted small">
<i class="bi bi-calendar me-1"></i>截止日期:{{ task.deadline }}
</p>
{% endif %}
</div>
<p class="text-danger small">
<i class="bi bi-exclamation-circle me-1"></i>
此操作不可撤销!
</p>
<form method="post" class="mt-4">
{% csrf_token %}
<button type="submit" class="btn btn-danger">确认删除</button>
<a href="{% url 'family_tasks' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center">
<button type="submit" class="btn btn-danger px-4">
<i class="bi bi-trash me-1"></i>确认删除
</button>
<a href="{% url 'family_tasks' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,18 +1,42 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>删除感悟记录</h2>
<div class="alert alert-danger mt-4">
<p>您确定要删除这条感悟记录吗?</p>
<p><strong>{{ insight.content|truncatechars:50 }}</strong></p>
<p>此操作不可恢复。</p>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-trash me-2 text-danger"></i>删除感悟记录
</h2>
</div>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card border-danger">
<div class="card-header bg-danger text-white text-center py-4">
<i class="bi bi-exclamation-triangle" style="font-size: 3rem;"></i>
<h5 class="card-title mb-0 mt-2">确认删除</h5>
</div>
<div class="card-body text-center">
<p class="mb-4">您确定要删除以下感悟记录吗?</p>
<div class="alert alert-light border">
<p class="mb-0">{{ insight.content|truncatechars:200 }}</p>
</div>
<p class="text-danger small">
<i class="bi bi-exclamation-circle me-1"></i>
此操作不可撤销!
</p>
<form method="post" class="mt-4">
{% csrf_token %}
<button type="submit" class="btn btn-danger">确认删除</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center">
<button type="submit" class="btn btn-danger px-4">
<i class="bi bi-trash me-1"></i>确认删除
</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,18 +1,50 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>删除阅读记录</h2>
<div class="alert alert-danger mt-4">
<p>您确定要删除这条阅读记录吗?</p>
<p><strong>{{ reading.title }}</strong> ({{ reading.get_type_display }})</p>
<p>此操作不可恢复。</p>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-trash me-2 text-danger"></i>删除阅读记录
</h2>
</div>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card border-danger">
<div class="card-header bg-danger text-white text-center py-4">
<i class="bi bi-exclamation-triangle" style="font-size: 3rem;"></i>
<h5 class="card-title mb-0 mt-2">确认删除</h5>
</div>
<div class="card-body text-center">
<p class="mb-4">您确定要删除以下阅读记录吗?</p>
<div class="alert alert-light border">
<h6 class="mb-2">{{ reading.title }}</h6>
<p class="mb-1 text-muted">
<i class="bi bi-tag me-1"></i>{{ reading.get_type_display }}
</p>
{% if reading.source %}
<p class="mb-0 text-muted">
<i class="bi bi-link-45deg me-1"></i>{{ reading.source }}
</p>
{% endif %}
</div>
<p class="text-danger small">
<i class="bi bi-exclamation-circle me-1"></i>
此操作不可撤销!
</p>
<form method="post" class="mt-4">
{% csrf_token %}
<button type="submit" class="btn btn-danger">确认删除</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center">
<button type="submit" class="btn btn-danger px-4">
<i class="bi bi-trash me-1"></i>确认删除
</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,55 +1,46 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>删除汇总记录</h2>
<div class="alert alert-warning mt-4">
<p>确定要删除以下汇总记录吗?此操作不可恢复。</p>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-trash me-2 text-danger"></i>删除汇总记录
</h2>
</div>
<div class="card mt-4">
<div class="card-header bg-danger text-white">
<h5 class="card-title mb-0">汇总记录详情</h5>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card border-danger">
<div class="card-header bg-danger text-white text-center py-4">
<i class="bi bi-exclamation-triangle" style="font-size: 3rem;"></i>
<h5 class="card-title mb-0 mt-2">确认删除</h5>
</div>
<div class="card-body">
<table class="table">
<tr>
<th style="width: 150px;">日期</th>
<td>{{ summary.date }}</td>
</tr>
<tr>
<th>分类</th>
<td>{{ summary.category.name }}</td>
</tr>
<tr>
<th>发言人</th>
<td>{{ summary.speaker.name }}</td>
</tr>
<tr>
<th>内容</th>
<td>{{ summary.content }}</td>
</tr>
<tr>
<th>来源</th>
<td>{{ summary.source|default:"-" }}</td>
</tr>
{% if summary.file %}
<tr>
<th>附件</th>
<td>
<a href="{{ summary.file.url }}" target="_blank">{{ summary.file.name }}</a>
</td>
</tr>
{% endif %}
</table>
<div class="card-body text-center">
<p class="mb-4">您确定要删除以下汇总记录吗?</p>
<div class="alert alert-light border">
<div class="mb-2">
<span class="badge bg-primary me-2">{{ summary.category.name }}</span>
<span class="badge bg-secondary">{{ summary.speaker.name }}</span>
</div>
<p class="mb-0">{{ summary.content|truncatechars:200 }}</p>
</div>
<p class="text-danger small">
<i class="bi bi-exclamation-circle me-1"></i>
此操作不可撤销!
</p>
<form method="post" class="mt-4">
{% csrf_token %}
<div class="mt-4">
<button type="submit" class="btn btn-danger">确认删除</button>
<a href="{% url 'summaries' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center">
<button type="submit" class="btn btn-danger px-4">
<i class="bi bi-trash me-1"></i>确认删除
</button>
<a href="{% url 'summaries' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,18 +1,51 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>删除今日计划</h2>
<div class="alert alert-danger mt-4">
<p>您确定要删除这条今日计划吗?</p>
<p><strong>{{ plan.content }}</strong> ({{ plan.get_type_display }})</p>
<p>此操作不可恢复。</p>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-trash me-2 text-danger"></i>删除今日计划
</h2>
</div>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card border-danger">
<div class="card-header bg-danger text-white text-center py-4">
<i class="bi bi-exclamation-triangle" style="font-size: 3rem;"></i>
<h5 class="card-title mb-0 mt-2">确认删除</h5>
</div>
<div class="card-body text-center">
<p class="mb-4">您确定要删除以下今日计划吗?</p>
<div class="alert alert-light border">
<div class="mb-2">
<span class="badge bg-secondary me-2">{{ plan.get_type_display }}</span>
<span class="badge {% if plan.priority == 'high' %}bg-danger{% elif plan.priority == 'medium' %}bg-warning{% else %}bg-info{% endif %}">
{{ plan.get_priority_display }}
</span>
</div>
<h6 class="mb-0">{{ plan.content }}</h6>
<p class="mb-0 mt-2 text-muted small">
<i class="bi bi-check-circle me-1"></i>状态:{{ plan.get_status_display }}
</p>
</div>
<p class="text-danger small">
<i class="bi bi-exclamation-circle me-1"></i>
此操作不可撤销!
</p>
<form method="post" class="mt-4">
{% csrf_token %}
<button type="submit" class="btn btn-danger">确认删除</button>
<a href="{% url 'today_plan' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center">
<button type="submit" class="btn btn-danger px-4">
<i class="bi bi-trash me-1"></i>确认删除
</button>
<a href="{% url 'today_plan' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,72 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>编辑家庭事项</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-pencil-square me-2 text-warning"></i>编辑家庭事项
</h2>
<a href="{% url 'family_tasks' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-warning text-white">
<h5 class="card-title mb-0">
<i class="bi bi-pencil me-2"></i>修改家庭事项信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'type' %}
<i class="bi bi-folder me-1 text-warning"></i>
{% elif field.name == 'content' %}
<i class="bi bi-text-paragraph me-1 text-warning"></i>
{% elif field.name == 'priority' %}
<i class="bi bi-flag me-1 text-warning"></i>
{% elif field.name == 'deadline' %}
<i class="bi bi-calendar me-1 text-warning"></i>
{% elif field.name == 'status' %}
<i class="bi bi-check-circle me-1 text-warning"></i>
{% else %}
<i class="bi bi-circle me-1 text-warning"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'family_tasks' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-warning px-4 text-white">
<i class="bi bi-check-lg me-1"></i>保存修改
</button>
<a href="{% url 'family_tasks' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,68 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>编辑感悟记录</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-pencil-square me-2 text-warning"></i>编辑感悟记录
</h2>
<a href="{% url 'yesterday_records' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" enctype="multipart/form-data" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-warning text-white">
<h5 class="card-title mb-0">
<i class="bi bi-pencil me-2"></i>修改感悟记录信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'content' %}
<i class="bi bi-chat-text me-1 text-warning"></i>
{% elif field.name == 'file' %}
<i class="bi bi-paperclip me-1 text-warning"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-warning"></i>
{% else %}
<i class="bi bi-circle me-1 text-warning"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-warning px-4 text-white">
<i class="bi bi-check-lg me-1"></i>保存修改
</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,76 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>编辑阅读记录</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-pencil-square me-2 text-warning"></i>编辑阅读记录
</h2>
<a href="{% url 'yesterday_records' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" enctype="multipart/form-data" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-warning text-white">
<h5 class="card-title mb-0">
<i class="bi bi-pencil me-2"></i>修改阅读记录信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'title' %}
<i class="bi bi-type me-1 text-warning"></i>
{% elif field.name == 'type' %}
<i class="bi bi-tag me-1 text-warning"></i>
{% elif field.name == 'source' %}
<i class="bi bi-link-45deg me-1 text-warning"></i>
{% elif field.name == 'progress' %}
<i class="bi bi-percent me-1 text-warning"></i>
{% elif field.name == 'note' %}
<i class="bi bi-sticky me-1 text-warning"></i>
{% elif field.name == 'file' %}
<i class="bi bi-paperclip me-1 text-warning"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-warning"></i>
{% else %}
<i class="bi bi-circle me-1 text-warning"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-warning px-4 text-white">
<i class="bi bi-check-lg me-1"></i>保存修改
</button>
<a href="{% url 'yesterday_records' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,72 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>编辑汇总记录</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-pencil-square me-2 text-warning"></i>编辑汇总记录
</h2>
<a href="{% url 'summaries' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" enctype="multipart/form-data" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-warning text-white">
<h5 class="card-title mb-0">
<i class="bi bi-pencil me-2"></i>修改汇总记录信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'category' %}
<i class="bi bi-folder me-1 text-warning"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-warning"></i>
{% elif field.name == 'content' %}
<i class="bi bi-text-paragraph me-1 text-warning"></i>
{% elif field.name == 'source' %}
<i class="bi bi-link-45deg me-1 text-warning"></i>
{% elif field.name == 'file' %}
<i class="bi bi-paperclip me-1 text-warning"></i>
{% else %}
<i class="bi bi-circle me-1 text-warning"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'summaries' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-warning px-4 text-white">
<i class="bi bi-check-lg me-1"></i>保存修改
</button>
<a href="{% url 'summaries' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,27 +1,72 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>编辑今日计划</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-pencil-square me-2 text-warning"></i>编辑今日计划
</h2>
<a href="{% url 'today_plan' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回
</a>
</div>
<form method="post" class="mt-4">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card">
<div class="card-header bg-warning text-white">
<h5 class="card-title mb-0">
<i class="bi bi-pencil me-2"></i>修改今日计划信息
</h5>
</div>
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
<div class="mb-4">
<label for="{{ field.id_for_label }}" class="form-label">
{% if field.name == 'type' %}
<i class="bi bi-folder me-1 text-warning"></i>
{% elif field.name == 'content' %}
<i class="bi bi-text-paragraph me-1 text-warning"></i>
{% elif field.name == 'priority' %}
<i class="bi bi-flag me-1 text-warning"></i>
{% elif field.name == 'status' %}
<i class="bi bi-check-circle me-1 text-warning"></i>
{% elif field.name == 'speaker' %}
<i class="bi bi-person me-1 text-warning"></i>
{% else %}
<i class="bi bi-circle me-1 text-warning"></i>
{% endif %}
{{ field.label }}
{% if field.field.required %}
<span class="text-danger">*</span>
{% endif %}
</label>
{{ field }}
{% if field.help_text %}
<div class="form-text">{{ field.help_text }}</div>
{% endif %}
{% for error in field.errors %}
<div class="invalid-feedback d-block">{{ error }}</div>
<div class="invalid-feedback d-block">
<i class="bi bi-exclamation-circle me-1"></i>{{ error }}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存</button>
<a href="{% url 'today_plan' %}" class="btn btn-secondary">取消</a>
<div class="d-flex gap-2 justify-content-center mt-4">
<button type="submit" class="btn btn-warning px-4 text-white">
<i class="bi bi-check-lg me-1"></i>保存修改
</button>
<a href="{% url 'today_plan' %}" class="btn btn-secondary px-4">
<i class="bi bi-x-lg me-1"></i>取消
</a>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,35 +1,48 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>家庭事项</h2>
<!-- 添加事项按钮 -->
<div class="mb-4">
<a href="{% url 'add_family_task' %}" class="btn btn-primary">添加家庭事项</a>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-list-check me-2 text-warning"></i>家庭事项
</h2>
<div>
<a href="{% url 'add_family_task' %}" class="btn btn-primary">
<i class="bi bi-plus-lg me-1"></i>添加家庭事项
</a>
</div>
</div>
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">家庭事项列表</h5>
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-house-door me-2"></i>家庭事项列表
</h5>
<span class="badge bg-light text-primary">{{ tasks|length }} 项</span>
</div>
<div class="card-body">
{% if tasks %}
<table class="table table-striped">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>类型</th>
<th style="width: 100px;">类型</th>
<th>内容</th>
<th>优先级</th>
<th>状态</th>
<th>截止日期</th>
<th>操作</th>
<th style="width: 100px;">优先级</th>
<th style="width: 100px;">状态</th>
<th style="width: 120px;">截止日期</th>
<th style="width: 100px;">操作</th>
</tr>
</thead>
<tbody>
{% for task in tasks %}
<tr>
<td>{{ task.get_type_display }}</td>
<td>{{ task.content }}</td>
<tr class="{% if task.status == 'completed' %}table-success{% endif %}">
<td>
<span class="badge bg-secondary">{{ task.get_type_display }}</span>
</td>
<td>
<strong>{{ task.content }}</strong>
</td>
<td>
<span class="badge {% if task.priority == 'high' %}bg-danger{% elif task.priority == 'medium' %}bg-warning{% else %}bg-info{% endif %}">
{{ task.get_priority_display }}
@@ -40,21 +53,39 @@
{{ task.get_status_display }}
</span>
</td>
<td>{{ task.deadline|default:"-" }}</td>
<td>
{% if task.deadline %}
<span class="{% if task.is_overdue %}text-danger{% else %}text-muted{% endif %}">
<i class="bi bi-calendar me-1"></i>{{ task.deadline }}
</span>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td>
<div class="btn-group">
<a href="{% url 'edit_family_task' task.id %}" class="btn btn-sm btn-warning" title="编辑">
<i class="bi bi-pencil"></i>
</a>
<a href="{% url 'delete_family_task' task.id %}" class="btn btn-sm btn-danger" title="删除">
<i class="bi bi-trash"></i>
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">还没有家庭事项,点击上方按钮添加</p>
<div class="text-center py-5">
<i class="bi bi-inbox text-muted" style="font-size: 5rem;"></i>
<h5 class="text-muted mt-3">还没有家庭事项</h5>
<p class="text-muted">点击上方按钮添加您的第一条家庭事项</p>
<a href="{% url 'add_family_task' %}" class="btn btn-primary">
<i class="bi bi-plus-lg me-1"></i>添加家庭事项
</a>
</div>
{% endif %}
</div>
</div>

View File

@@ -1,33 +1,69 @@
{% extends 'core/base.html' %}
{% block content %}
<!-- 欢迎区域 -->
<div class="row mb-4">
<div class="col-12">
<div class="card" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;">
<div class="card-body d-flex align-items-center justify-content-between py-4">
<div>
<h3 class="mb-1"><i class="bi bi-sun-fill me-2"></i>早上好,{{ user.username }}</h3>
<p class="mb-0 opacity-75"><i class="bi bi-calendar3 me-2"></i>今天是 {{ today }},祝您有美好的一天!</p>
</div>
<div class="text-end d-none d-md-block">
<i class="bi bi-house-heart" style="font-size: 4rem; opacity: 0.3;"></i>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<!-- 今日概览 -->
<div class="col-md-8">
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">今日概览</h5>
<div class="col-lg-8">
<div class="card h-100">
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0"><i class="bi bi-speedometer2 me-2"></i>今日概览</h5>
<span class="badge bg-light text-primary">{{ today }}</span>
</div>
<div class="card-body">
<h6>日期:{{ today }}</h6>
<div class="mt-4">
<h5>今日计划</h5>
<div class="mt-2">
<h6 class="mb-3"><i class="bi bi-calendar-check me-2 text-primary"></i>今日计划</h6>
{% if today_plan %}
<ul class="list-group">
<div class="list-group">
{% for plan in today_plan %}
<li class="list-group-item d-flex justify-content-between align-items-center">
<div class="list-group-item d-flex justify-content-between align-items-center">
<div class="d-flex align-items-center">
<div class="me-3">
{% if plan.status == 'completed' %}
<i class="bi bi-check-circle-fill text-success" style="font-size: 1.2rem;"></i>
{% else %}
<i class="bi bi-circle text-warning" style="font-size: 1.2rem;"></i>
{% endif %}
</div>
<div>
<strong>{{ plan.content }}</strong>
<small class="text-muted"> - {{ plan.get_type_display }} - {{ plan.get_priority_display }}</small>
<div class="small text-muted">
<i class="bi bi-tag me-1"></i>{{ plan.get_type_display }}
<span class="mx-1">|</span>
<i class="bi bi-flag me-1"></i>{{ plan.get_priority_display }}
</div>
</div>
</div>
<span class="badge {% if plan.status == 'completed' %}bg-success{% else %}bg-warning{% endif %} status-badge">
{{ plan.get_status_display }}
</span>
</li>
</div>
{% endfor %}
</ul>
</div>
{% else %}
<p class="text-muted">今天还没有计划,快去添加吧!</p>
<div class="text-center py-4">
<i class="bi bi-inbox text-muted" style="font-size: 3rem;"></i>
<p class="text-muted mt-2">今天还没有计划,快去添加吧!</p>
<a href="{% url 'today_plan' %}" class="btn btn-primary btn-sm">
<i class="bi bi-plus-lg me-1"></i>添加计划
</a>
</div>
{% endif %}
</div>
</div>
@@ -35,43 +71,92 @@
</div>
<!-- 待处理事项 -->
<div class="col-md-4">
<div class="card">
<div class="card-header bg-warning text-dark">
<h5 class="card-title mb-0">待处理事项</h5>
<div class="col-lg-4">
<div class="card h-100">
<div class="card-header bg-warning text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0"><i class="bi bi-exclamation-triangle me-2"></i>待处理事项</h5>
<span class="badge bg-light text-warning">{{ pending_family_tasks|length }}</span>
</div>
<div class="card-body">
{% if pending_family_tasks %}
<ul class="list-group">
<div class="list-group">
{% for task in pending_family_tasks %}
<li class="list-group-item d-flex justify-content-between align-items-center">
<div class="list-group-item">
<div class="d-flex justify-content-between align-items-start">
<div>
<strong>{{ task.content }}</strong>
<small class="text-muted"> - {{ task.get_type_display }}</small>
<div class="small text-muted mt-1">
<i class="bi bi-folder me-1"></i>{{ task.get_type_display }}
</div>
</div>
<span class="badge {% if task.priority == 'high' %}bg-danger{% elif task.priority == 'medium' %}bg-warning{% else %}bg-info{% endif %}">
{{ task.get_priority_display }}
</span>
</div>
{% if task.deadline %}
<div class="mt-2 small">
<i class="bi bi-clock me-1 text-muted"></i>
<span class="{% if task.is_overdue %}text-danger{% else %}text-muted{% endif %}">
截止:{{ task.deadline }}
</span>
</div>
<span class="badge bg-info status-badge">{{ task.get_priority_display }}</span>
</li>
{% endfor %}
</ul>
{% else %}
<p class="text-muted">没有待处理的家庭事项</p>
{% endif %}
<a href="{% url 'family_tasks' %}" class="btn btn-sm btn-outline-warning mt-3">查看所有家庭事项</a>
</div>
{% endfor %}
</div>
{% else %}
<div class="text-center py-4">
<i class="bi bi-check-all text-success" style="font-size: 3rem;"></i>
<p class="text-muted mt-2">没有待处理的家庭事项</p>
</div>
{% endif %}
<a href="{% url 'family_tasks' %}" class="btn btn-outline-warning w-100 mt-3">
<i class="bi bi-list-check me-1"></i>查看所有家庭事项
</a>
</div>
</div>
</div>
</div>
<!-- 快捷操作 -->
<div class="card mt-4">
<div class="card-header bg-info text-white">
<h5 class="card-title mb-0">快捷操作</h5>
<div class="row mt-4">
<div class="col-12">
<div class="card">
<div class="card-header bg-info text-dark">
<h5 class="card-title mb-0"><i class="bi bi-lightning-charge me-2"></i>快捷操作</h5>
</div>
<div class="card-body">
<div class="btn-group-vertical w-100">
<a href="{% url 'today_records' %}" class="btn btn-outline-primary mb-2">添加今日信息</a>
<a href="{% url 'yesterday_records' %}" class="btn btn-outline-primary mb-2">追加昨日信息</a>
<a href="{% url 'today_plan' %}" class="btn btn-outline-primary mb-2">管理今日计划</a>
<a href="{% url 'generate_report' %}" class="btn btn-outline-primary mb-2">预览家庭日报PDF模板</a>
<a href="{% url 'send_email' %}" class="btn btn-outline-success">发送今日邮件</a>
<div class="row g-3">
<div class="col-6 col-md-4 col-lg">
<a href="{% url 'today_records' %}" class="btn btn-outline-primary w-100 py-3">
<i class="bi bi-plus-circle" style="font-size: 1.5rem;"></i>
<div class="mt-2 small">添加今日信息</div>
</a>
</div>
<div class="col-6 col-md-4 col-lg">
<a href="{% url 'yesterday_records' %}" class="btn btn-outline-success w-100 py-3">
<i class="bi bi-journal-plus" style="font-size: 1.5rem;"></i>
<div class="mt-2 small">追加昨日信息</div>
</a>
</div>
<div class="col-6 col-md-4 col-lg">
<a href="{% url 'today_plan' %}" class="btn btn-outline-info w-100 py-3">
<i class="bi bi-calendar-plus" style="font-size: 1.5rem;"></i>
<div class="mt-2 small">管理今日计划</div>
</a>
</div>
<div class="col-6 col-md-4 col-lg">
<a href="{% url 'generate_report' %}" class="btn btn-outline-warning w-100 py-3">
<i class="bi bi-file-earmark-pdf" style="font-size: 1.5rem;"></i>
<div class="mt-2 small">预览日报PDF</div>
</a>
</div>
<div class="col-6 col-md-4 col-lg">
<a href="{% url 'send_email' %}" class="btn btn-outline-success w-100 py-3">
<i class="bi bi-envelope-check" style="font-size: 1.5rem;"></i>
<div class="mt-2 small">发送今日邮件</div>
</a>
</div>
</div>
</div>
</div>
@@ -80,88 +165,113 @@
<!-- 昨日记录 -->
<div class="row mt-4">
<div class="col-md-12">
<div class="col-12">
<div class="card">
<div class="card-header bg-secondary text-white">
<h5 class="card-title mb-0">昨日记录 ({{ yesterday }})</h5>
<div class="card-header bg-secondary text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0"><i class="bi bi-clock-history me-2"></i>昨日记录</h5>
<span class="badge bg-light text-secondary">{{ yesterday }}</span>
</div>
<div class="card-body">
<div class="row">
<!-- 昨日阅读 -->
<div class="col-md-6">
<h5>阅读记录</h5>
<div class="col-md-4">
<h6 class="mb-3"><i class="bi bi-book me-2 text-primary"></i>阅读记录</h6>
{% if yesterday_reading %}
<ul class="list-group">
<div class="list-group">
{% for reading in yesterday_reading %}
<li class="list-group-item">
<strong>{{ reading.title }}</strong> ({{ reading.get_type_display }})
<div class="list-group-item">
<div class="d-flex align-items-start">
<i class="bi bi-bookmark-fill text-primary me-2 mt-1"></i>
<div>
<strong>{{ reading.title }}</strong>
<div class="small text-muted">
<span class="badge bg-secondary">{{ reading.get_type_display }}</span>
</div>
{% if reading.source %}
<small class="text-muted"> - {{ reading.source }}</small>
{% endif %}
{% if reading.progress %}
<div class="mt-1"><small>进度:{{ reading.progress }}</small></div>
{% endif %}
{% if reading.note %}
<div class="mt-1"><small>笔记:{{ reading.note|truncatechars:100 }}</small></div>
{% endif %}
{% if reading.file %}
<div class="mt-1">
<a href="{{ reading.file.url }}" class="file-link" target="_blank"><i class="bi bi-file-earmark"></i> 查看附件</a>
<div class="small text-muted mt-1">
<i class="bi bi-link-45deg me-1"></i>{{ reading.source }}
</div>
{% endif %}
</li>
{% if reading.progress %}
<div class="mt-2">
<div class="progress" style="height: 6px;">
<div class="progress-bar bg-primary" role="progressbar" style="width: {{ reading.progress }}%"></div>
</div>
<small class="text-muted">进度:{{ reading.progress }}%</small>
</div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</ul>
</div>
{% else %}
<p class="text-muted">昨日没有阅读记录</p>
<div class="text-center py-3">
<i class="bi bi-inbox text-muted" style="font-size: 2rem;"></i>
<p class="text-muted small mt-2">昨日没有阅读记录</p>
</div>
{% endif %}
</div>
<!-- 昨日感悟 -->
<div class="col-md-6">
<h5>感悟记录</h5>
<div class="col-md-4">
<h6 class="mb-3"><i class="bi bi-lightbulb me-2 text-success"></i>感悟记录</h6>
{% if yesterday_insight %}
<ul class="list-group">
<div class="list-group">
{% for insight in yesterday_insight %}
<li class="list-group-item">
{{ insight.content }}
<div class="list-group-item">
<div class="d-flex align-items-start">
<i class="bi bi-chat-quote-fill text-success me-2 mt-1"></i>
<div>
<p class="mb-1">{{ insight.content|truncatechars:100 }}</p>
{% if insight.file %}
<div class="mt-1">
<a href="{{ insight.file.url }}" class="file-link" target="_blank"><i class="bi bi-file-earmark"></i> 查看附件</a>
</div>
<a href="{{ insight.file.url }}" class="file-link small" target="_blank">
<i class="bi bi-paperclip me-1"></i>查看附件
</a>
{% endif %}
</li>
</div>
</div>
</div>
{% endfor %}
</ul>
{% else %}
<p class="text-muted">昨日没有感悟记录</p>
{% endif %}
</div>
{% else %}
<div class="text-center py-3">
<i class="bi bi-inbox text-muted" style="font-size: 2rem;"></i>
<p class="text-muted small mt-2">昨日没有感悟记录</p>
</div>
{% endif %}
</div>
<!-- 昨日汇总记录 -->
<div class="row mt-3">
<div class="col-md-12">
<h5>汇总记录</h5>
<div class="col-md-4">
<h6 class="mb-3"><i class="bi bi-collection me-2 text-info"></i>汇总记录</h6>
{% if yesterday_summary %}
<ul class="list-group">
<div class="list-group">
{% for summary in yesterday_summary %}
<li class="list-group-item">
<strong>{{ summary.category.name }}</strong> - {{ summary.speaker.name }}
<div class="mt-1">{{ summary.content }}</div>
{% if summary.source %}
<small class="text-muted">来源:{{ summary.source }}</small>
{% endif %}
{% if summary.file %}
<div class="mt-1">
<a href="{{ summary.file.url }}" class="file-link" target="_blank"><i class="bi bi-file-earmark"></i> 查看附件</a>
<div class="list-group-item">
<div class="d-flex align-items-start">
<i class="bi bi-journal-text text-info me-2 mt-1"></i>
<div>
<div class="d-flex align-items-center mb-1">
<span class="badge bg-primary me-2">{{ summary.category.name }}</span>
<small class="text-muted">{{ summary.speaker.name }}</small>
</div>
<p class="mb-1 small">{{ summary.content|truncatechars:80 }}</p>
{% if summary.source %}
<small class="text-muted">
<i class="bi bi-link-45deg me-1"></i>{{ summary.source }}
</small>
{% endif %}
</li>
</div>
</div>
</div>
{% endfor %}
</ul>
</div>
{% else %}
<p class="text-muted">昨日没有汇总记录</p>
<div class="text-center py-3">
<i class="bi bi-inbox text-muted" style="font-size: 2rem;"></i>
<p class="text-muted small mt-2">昨日没有汇总记录</p>
</div>
{% endif %}
</div>
</div>

View File

@@ -1,26 +1,44 @@
{% extends 'core/base.html' %}
{% block content %}
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0 text-center">用户登录</h5>
<div class="row justify-content-center align-items-center" style="min-height: 70vh;">
<div class="col-md-5 col-lg-4">
<div class="card shadow-lg" style="border-radius: 20px;">
<div class="card-header text-center py-4" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 20px 20px 0 0;">
<div class="mb-3">
<i class="bi bi-house-heart-fill" style="font-size: 3rem; color: white;"></i>
</div>
<div class="card-body">
<h4 class="card-title mb-0 text-white fw-bold">家庭日报系统</h4>
<p class="text-white-50 mb-0 mt-2">请登录您的账户</p>
</div>
<div class="card-body p-4">
<form method="POST">
{% csrf_token %}
<div class="mb-3">
<label for="username" class="form-label">用户名</label>
<input type="text" class="form-control" id="username" name="username" required>
<div class="mb-4">
<label for="username" class="form-label">
<i class="bi bi-person me-2 text-primary"></i>用户名
</label>
<input type="text" class="form-control form-control-lg" id="username" name="username" placeholder="请输入用户名" required>
</div>
<div class="mb-3">
<label for="password" class="form-label">密码</label>
<input type="password" class="form-control" id="password" name="password" required>
<div class="mb-4">
<label for="password" class="form-label">
<i class="bi bi-lock me-2 text-primary"></i>密码
</label>
<input type="password" class="form-control form-control-lg" id="password" name="password" placeholder="请输入密码" required>
</div>
<div class="d-grid gap-2">
<button type="submit" class="btn btn-primary btn-lg">
<i class="bi bi-box-arrow-in-right me-2"></i>登录
</button>
</div>
<button type="submit" class="btn btn-primary w-100">登录</button>
</form>
</div>
<div class="card-footer text-center py-3" style="background: transparent; border-top: 1px solid rgba(0,0,0,0.05);">
<small class="text-muted">
<i class="bi bi-shield-check me-1"></i>
安全登录保护中
</small>
</div>
</div>
</div>
</div>

View File

@@ -1,26 +1,49 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>家庭日报报告</h2>
<div class="mb-4">
<a href="{% url 'generate_pdf_report' today|date:'Y-m-d' %}" class="btn btn-primary" target="_blank">
<i class="bi bi-file-pdf"></i> 导出PDF报告
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-file-earmark-pdf me-2 text-danger"></i>家庭日报报告
</h2>
<div class="btn-group">
<a href="{% url 'generate_pdf_report' today|date:'Y-m-d' %}" class="btn btn-danger" target="_blank">
<i class="bi bi-file-pdf me-1"></i>导出PDF报告
</a>
<a href="{% url 'send_email' %}" class="btn btn-success">
<i class="bi bi-envelope"></i> 发送邮件
<i class="bi bi-envelope me-1"></i>发送邮件
</a>
</div>
</div>
<div class="card">
<!-- 报告概览 -->
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">报告概览</h5>
<h5 class="card-title mb-0">
<i class="bi bi-speedometer2 me-2"></i>报告概览
</h5>
</div>
<div class="card-body">
<div class="row">
<div class="row align-items-center">
<div class="col-md-6">
<h6>报告日期:{{ today }}</h6>
<h6>昨日日期:{{ yesterday }}</h6>
<div class="d-flex align-items-center mb-3">
<div class="me-3">
<i class="bi bi-calendar-check text-primary" style="font-size: 2rem;"></i>
</div>
<div>
<h6 class="mb-0 text-muted">报告日期</h6>
<h5 class="mb-0">{{ today }}</h5>
</div>
</div>
<div class="d-flex align-items-center">
<div class="me-3">
<i class="bi bi-clock-history text-secondary" style="font-size: 2rem;"></i>
</div>
<div>
<h6 class="mb-0 text-muted">昨日日期</h6>
<h5 class="mb-0">{{ yesterday }}</h5>
</div>
</div>
</div>
<div class="col-md-6">
<div class="chart-container" style="height: 200px;">
@@ -33,90 +56,124 @@
<div class="row">
<!-- 昨日阅读记录 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">昨日阅读记录</h5>
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-book me-2"></i>昨日阅读记录
</h5>
<span class="badge bg-light text-primary">{{ yesterday_reading|length }} 条</span>
</div>
<div class="card-body">
{% if yesterday_reading %}
<table class="table table-striped">
<thead>
<tr>
<th>发言人</th>
<th>类型</th>
<th>标题</th>
<th>来源</th>
<th>进度</th>
</tr>
</thead>
<tbody>
<div class="list-group">
{% for reading in yesterday_reading %}
<tr>
<td><span class="badge bg-secondary">{{ reading.speaker.name }}</span></td>
<td>{{ reading.get_type_display }}</td>
<td>{{ reading.title }}</td>
<td>{{ reading.source|default:"-" }}</td>
<td>{{ reading.progress|default:"-" }}</td>
</tr>
<div class="list-group-item">
<div class="d-flex align-items-start">
<span class="badge bg-secondary me-2">{{ reading.speaker.name }}</span>
<div class="flex-grow-1">
<strong>{{ reading.title }}</strong>
<div class="small text-muted mt-1">
<span class="badge bg-info">{{ reading.get_type_display }}</span>
{% if reading.source %}
<span class="ms-2"><i class="bi bi-link-45deg me-1"></i>{{ reading.source }}</span>
{% endif %}
</div>
{% if reading.progress %}
<div class="mt-2">
<div class="progress" style="height: 6px;">
<div class="progress-bar bg-primary" role="progressbar" style="width: {{ reading.progress }}%"></div>
</div>
<small class="text-muted">进度:{{ reading.progress }}%</small>
</div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">昨日没有阅读记录</p>
<div class="text-center py-4">
<i class="bi bi-inbox text-muted" style="font-size: 3rem;"></i>
<p class="text-muted mt-2">昨日没有阅读记录</p>
</div>
{% endif %}
</div>
</div>
</div>
<!-- 昨日感悟记录 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-success text-white">
<h5 class="card-title mb-0">昨日感悟记录</h5>
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-success text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-lightbulb me-2"></i>昨日感悟记录
</h5>
<span class="badge bg-light text-success">{{ yesterday_insight|length }} 条</span>
</div>
<div class="card-body">
{% if yesterday_insight %}
<ul class="list-group">
<div class="list-group">
{% for insight in yesterday_insight %}
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto">
<div class="fw-bold text-primary mb-1">{{ insight.speaker.name }}</div>
{{ insight.content }}
<div class="list-group-item">
<div class="d-flex align-items-start">
<span class="badge bg-secondary me-2">{{ insight.speaker.name }}</span>
<div class="flex-grow-1">
<p class="mb-1">{{ insight.content }}</p>
{% if insight.file %}
<a href="{{ insight.file.url }}" class="file-link small" target="_blank">
<i class="bi bi-paperclip me-1"></i>查看附件
</a>
{% endif %}
</div>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
{% else %}
<p class="text-muted">昨日没有感悟记录</p>
<div class="text-center py-4">
<i class="bi bi-inbox text-muted" style="font-size: 3rem;"></i>
<p class="text-muted mt-2">昨日没有感悟记录</p>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header bg-warning text-dark">
<h5 class="card-title mb-0">今日计划</h5>
<!-- 今日计划 -->
<div class="card mt-4">
<div class="card-header bg-warning text-dark d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-calendar-check me-2"></i>今日计划
</h5>
<span class="badge bg-light text-warning">{{ today_plan|length }} 项</span>
</div>
<div class="card-body">
{% if today_plan %}
<table class="table table-striped">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>发言人</th>
<th>类型</th>
<th style="width: 100px;">发言人</th>
<th style="width: 100px;">类型</th>
<th>内容</th>
<th>优先级</th>
<th>状态</th>
<th style="width: 100px;">优先级</th>
<th style="width: 100px;">状态</th>
</tr>
</thead>
<tbody>
{% for plan in today_plan %}
<tr>
<td><span class="badge bg-secondary">{{ plan.speaker.name }}</span></td>
<td>{{ plan.get_type_display }}</td>
<td>{{ plan.content }}</td>
<tr class="{% if plan.status == 'completed' %}table-success{% endif %}">
<td>
<span class="badge bg-secondary">{{ plan.speaker.name }}</span>
</td>
<td>
<span class="badge bg-info">{{ plan.get_type_display }}</span>
</td>
<td>
<strong>{{ plan.content }}</strong>
</td>
<td>
<span class="badge {% if plan.priority == 'high' %}bg-danger{% elif plan.priority == 'medium' %}bg-warning{% else %}bg-info{% endif %}">
{{ plan.get_priority_display }}
@@ -131,12 +188,89 @@
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">今天还没有计划</p>
<div class="text-center py-4">
<i class="bi bi-calendar-x text-muted" style="font-size: 3rem;"></i>
<p class="text-muted mt-2">今天还没有计划</p>
</div>
{% endif %}
</div>
</div>
<!-- 昨日汇总记录 -->
<div class="card mt-4">
<div class="card-header bg-info text-dark d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-collection me-2"></i>昨日汇总记录
</h5>
<span class="badge bg-light text-info">{{ yesterday_summary|length }} 条</span>
</div>
<div class="card-body">
{% if yesterday_summary %}
<div class="row">
{% for summary in yesterday_summary %}
<div class="col-md-6 mb-3">
<div class="card h-100 border-0 shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center bg-light">
<span class="badge bg-primary">{{ summary.category.name }}</span>
<small class="text-muted">{{ summary.speaker.name }}</small>
</div>
<div class="card-body">
<p class="card-text">{{ summary.content }}</p>
{% if summary.source %}
<small class="text-muted">
<i class="bi bi-link-45deg me-1"></i>来源:{{ summary.source }}
</small>
{% endif %}
{% if summary.file %}
<div class="mt-2">
<a href="{{ summary.file.url }}" class="file-link" target="_blank">
<i class="bi bi-paperclip me-1"></i>查看附件
</a>
</div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="text-center py-4">
<i class="bi bi-inbox text-muted" style="font-size: 3rem;"></i>
<p class="text-muted mt-2">昨日没有汇总记录</p>
</div>
{% endif %}
</div>
</div>
<!-- 历史PDF报告 -->
<div class="card mt-4">
<div class="card-header bg-secondary text-white">
<h5 class="card-title mb-0">
<i class="bi bi-archive me-2"></i>历史PDF报告
</h5>
</div>
<div class="card-body">
<div class="row g-2">
{% for date in historical_dates %}
<div class="col-6 col-md-3 col-lg-2">
<a href="{% url 'generate_pdf_report' date|date:'Y-m-d' %}" class="btn btn-outline-primary w-100" target="_blank">
<i class="bi bi-file-pdf me-1"></i>{{ date }}
</a>
</div>
{% endfor %}
{% if has_earlier_pdfs %}
<div class="col-6 col-md-3 col-lg-2">
<a href="{% url 'pdf_list' %}" class="btn btn-outline-secondary w-100">
<i class="bi bi-three-dots me-1"></i>更早的
</a>
</div>
{% endif %}
</div>
</div>
</div>
<script>
// 家庭事项统计图表
document.addEventListener('DOMContentLoaded', function() {
@@ -155,10 +289,10 @@
datasets: [{
data: data,
backgroundColor: [
'#0d6efd',
'#198754'
'#667eea',
'#11998e'
],
borderWidth: 1
borderWidth: 0
}]
},
options: {
@@ -167,7 +301,10 @@
plugins: {
title: {
display: true,
text: '家庭事项统计'
text: '家庭事项统计',
font: {
size: 14
}
},
legend: {
position: 'bottom'
@@ -177,60 +314,4 @@
});
});
</script>
<div class="card mt-4">
<div class="card-header bg-info text-white">
<h5 class="card-title mb-0">历史PDF报告</h5>
</div>
<div class="card-body">
<div class="row">
{% for date in historical_dates %}
<div class="col-md-3 mb-2">
<a href="{% url 'generate_pdf_report' date|date:'Y-m-d' %}" class="btn btn-outline-primary btn-sm btn-block">
{{ date }} PDF
</a>
</div>
{% endfor %}
{% if has_earlier_pdfs %}
<div class="col-md-3 mb-2">
<a href="{% url 'pdf_list' %}" class="btn btn-outline-secondary btn-sm btn-block">
更早的
</a>
</div>
{% endif %}
</div>
</div>
</div>
<!-- 昨日汇总记录 -->
<div class="card">
<div class="card-header bg-info text-white">
<h5 class="card-title mb-0">昨日汇总记录</h5>
</div>
<div class="card-body">
{% if yesterday_summary %}
<div class="row">
{% for summary in yesterday_summary %}
<div class="col-md-6 mb-3">
<div class="card h-100">
<div class="card-header d-flex justify-content-between align-items-center">
<span><span class="badge bg-primary">{{ summary.category.name }}</span></span>
<small class="text-muted">{{ summary.speaker.name }}</small>
</div>
<div class="card-body">
<p class="card-text">{{ summary.content }}</p>
{% if summary.source %}
<small class="text-muted">来源:{{ summary.source }}</small>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="text-muted">昨日没有汇总记录</p>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -1,36 +1,62 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>汇总记录 ({{ yesterday }})</h2>
<div class="mb-4">
<a href="{% url 'add_summary' %}" class="btn btn-primary">添加汇总记录</a>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-collection me-2 text-info"></i>汇总记录
<span class="badge bg-info text-dark ms-2">{{ yesterday }}</span>
</h2>
<div>
<a href="{% url 'add_summary' %}" class="btn btn-primary">
<i class="bi bi-plus-lg me-1"></i>添加汇总记录
</a>
</div>
</div>
{% if summary_records %}
<div class="card">
<div class="card-header bg-info text-white">
<h5 class="card-title mb-0">汇总记录列表</h5>
<div class="card-header bg-info text-dark d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-list-ul me-2"></i>汇总记录列表
</h5>
<span class="badge bg-light text-info">{{ summary_records|length }} 条</span>
</div>
<div class="card-body">
<table class="table table-striped">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>分类</th>
<th>发言人</th>
<th style="width: 100px;">分类</th>
<th style="width: 100px;">发言人</th>
<th>内容</th>
<th>来源</th>
<th>操作</th>
<th style="width: 120px;">来源</th>
<th style="width: 120px;">操作</th>
</tr>
</thead>
<tbody>
{% for summary in summary_records %}
<tr>
<td>{{ summary.category.name }}</td>
<td>{{ summary.speaker.name }}</td>
<td>{{ summary.content|truncatechars:100 }}</td>
<td>{{ summary.source|default:"-" }}</td>
<td>
<span class="badge bg-primary">{{ summary.category.name }}</span>
</td>
<td>
<span class="badge bg-secondary">{{ summary.speaker.name }}</span>
</td>
<td>
<p class="mb-0">{{ summary.content|truncatechars:150 }}</p>
</td>
<td>
{% if summary.source %}
<small class="text-muted">
<i class="bi bi-link-45deg me-1"></i>{{ summary.source }}
</small>
{% else %}
<span class="text-muted">-</span>
{% endif %}
</td>
<td>
<div class="btn-group">
{% if summary.file %}
<a href="{{ summary.file.url }}" class="btn btn-sm btn-info" title="查看附件" target="_blank">
<i class="bi bi-file-earmark"></i>
@@ -42,6 +68,7 @@
<a href="{% url 'delete_summary' summary.id %}" class="btn btn-sm btn-danger" title="删除">
<i class="bi bi-trash"></i>
</a>
</div>
</td>
</tr>
{% endfor %}
@@ -49,10 +76,16 @@
</table>
</div>
</div>
</div>
{% else %}
<div class="card">
<div class="card-body">
<p class="text-muted">昨日没有汇总记录,点击上方按钮添加</p>
<div class="card-body text-center py-5">
<i class="bi bi-inbox text-muted" style="font-size: 5rem;"></i>
<h5 class="text-muted mt-3">昨日没有汇总记录</h5>
<p class="text-muted">点击上方按钮添加您的第一条汇总记录</p>
<a href="{% url 'add_summary' %}" class="btn btn-primary">
<i class="bi bi-plus-lg me-1"></i>添加汇总记录
</a>
</div>
</div>
{% endif %}

View File

@@ -1,21 +1,37 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>系统配置</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-gear me-2 text-secondary"></i>系统配置
</h2>
</div>
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">系统配置设置</h5>
<h5 class="card-title mb-0">
<i class="bi bi-sliders me-2"></i>系统配置设置
</h5>
</div>
<div class="card-body">
<form method="post" class="mt-4">
<form method="post" class="mt-2">
{% csrf_token %}
<div class="row">
<!-- 邮件配置 -->
<div class="col-md-6">
<h6>邮件配置</h6>
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-light">
<h6 class="mb-0">
<i class="bi bi-envelope me-2 text-primary"></i>邮件配置
</h6>
</div>
<div class="card-body">
<div class="mb-3">
<label for="{{ form.smtp_server.id_for_label }}" class="form-label">{{ form.smtp_server.label }}</label>
<label for="{{ form.smtp_server.id_for_label }}" class="form-label">
<i class="bi bi-server me-1"></i>{{ form.smtp_server.label }}
</label>
{{ form.smtp_server }}
{% if form.smtp_server.help_text %}
<div class="form-text">{{ form.smtp_server.help_text }}</div>
@@ -26,7 +42,9 @@
</div>
<div class="mb-3">
<label for="{{ form.smtp_port.id_for_label }}" class="form-label">{{ form.smtp_port.label }}</label>
<label for="{{ form.smtp_port.id_for_label }}" class="form-label">
<i class="bi bi-plug me-1"></i>{{ form.smtp_port.label }}
</label>
{{ form.smtp_port }}
{% if form.smtp_port.help_text %}
<div class="form-text">{{ form.smtp_port.help_text }}</div>
@@ -37,7 +55,9 @@
</div>
<div class="mb-3">
<label for="{{ form.smtp_username.id_for_label }}" class="form-label">{{ form.smtp_username.label }}</label>
<label for="{{ form.smtp_username.id_for_label }}" class="form-label">
<i class="bi bi-person me-1"></i>{{ form.smtp_username.label }}
</label>
{{ form.smtp_username }}
{% if form.smtp_username.help_text %}
<div class="form-text">{{ form.smtp_username.help_text }}</div>
@@ -48,7 +68,9 @@
</div>
<div class="mb-3">
<label for="{{ form.smtp_password.id_for_label }}" class="form-label">{{ form.smtp_password.label }}</label>
<label for="{{ form.smtp_password.id_for_label }}" class="form-label">
<i class="bi bi-lock me-1"></i>{{ form.smtp_password.label }}
</label>
{{ form.smtp_password }}
{% if form.smtp_password.help_text %}
<div class="form-text">{{ form.smtp_password.help_text }}</div>
@@ -58,12 +80,22 @@
{% endfor %}
</div>
</div>
</div>
</div>
<!-- 发送配置 -->
<div class="col-md-6">
<h6>发送配置</h6>
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-light">
<h6 class="mb-0">
<i class="bi bi-send me-2 text-success"></i>发送配置
</h6>
</div>
<div class="card-body">
<div class="mb-3">
<label for="{{ form.send_time.id_for_label }}" class="form-label">{{ form.send_time.label }}</label>
<label for="{{ form.send_time.id_for_label }}" class="form-label">
<i class="bi bi-clock me-1"></i>{{ form.send_time.label }}
</label>
{{ form.send_time }}
{% if form.send_time.help_text %}
<div class="form-text">{{ form.send_time.help_text }}</div>
@@ -74,7 +106,9 @@
</div>
<div class="mb-3">
<label for="{{ form.recipient_email.id_for_label }}" class="form-label">{{ form.recipient_email.label }}</label>
<label for="{{ form.recipient_email.id_for_label }}" class="form-label">
<i class="bi bi-envelope-at me-1"></i>{{ form.recipient_email.label }}
</label>
{{ form.recipient_email }}
{% if form.recipient_email.help_text %}
<div class="form-text">{{ form.recipient_email.help_text }}</div>
@@ -86,8 +120,35 @@
</div>
</div>
<div class="mt-4">
<button type="submit" class="btn btn-primary">保存配置</button>
<!-- 系统信息 -->
<div class="card border-0 shadow-sm">
<div class="card-header bg-light">
<h6 class="mb-0">
<i class="bi bi-info-circle me-2 text-info"></i>系统信息
</h6>
</div>
<div class="card-body">
<div class="d-flex align-items-center mb-3">
<i class="bi bi-check-circle-fill text-success me-2"></i>
<span>系统运行正常</span>
</div>
<div class="d-flex align-items-center mb-3">
<i class="bi bi-calendar-check text-primary me-2"></i>
<span>当前日期:{{ today }}</span>
</div>
<div class="d-flex align-items-center">
<i class="bi bi-shield-check text-info me-2"></i>
<span>安全配置已启用</span>
</div>
</div>
</div>
</div>
</div>
<div class="mt-4 text-center">
<button type="submit" class="btn btn-primary btn-lg px-5">
<i class="bi bi-save me-2"></i>保存配置
</button>
</div>
</form>
</div>

View File

@@ -1,34 +1,48 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>今日计划</h2>
<!-- 添加计划按钮 -->
<div class="mb-4">
<a href="{% url 'add_today_plan' %}" class="btn btn-primary">添加今日计划</a>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-calendar-check me-2 text-success"></i>今日计划
<span class="badge bg-success ms-2">{{ today }}</span>
</h2>
<div>
<a href="{% url 'add_today_plan' %}" class="btn btn-primary">
<i class="bi bi-plus-lg me-1"></i>添加今日计划
</a>
</div>
</div>
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">今日计划列表</h5>
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-list-task me-2"></i>今日计划列表
</h5>
<span class="badge bg-light text-primary">{{ plans|length }} 项</span>
</div>
<div class="card-body">
{% if plans %}
<table class="table table-striped">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>类型</th>
<th style="width: 100px;">类型</th>
<th>内容</th>
<th>优先级</th>
<th>状态</th>
<th>操作</th>
<th style="width: 100px;">优先级</th>
<th style="width: 100px;">状态</th>
<th style="width: 180px;">操作</th>
</tr>
</thead>
<tbody>
{% for plan in plans %}
<tr>
<td>{{ plan.get_type_display }}</td>
<td>{{ plan.content }}</td>
<tr class="{% if plan.status == 'completed' %}table-success{% endif %}">
<td>
<span class="badge bg-secondary">{{ plan.get_type_display }}</span>
</td>
<td>
<strong>{{ plan.content }}</strong>
</td>
<td>
<span class="badge {% if plan.priority == 'high' %}bg-danger{% elif plan.priority == 'medium' %}bg-warning{% else %}bg-info{% endif %}">
{{ plan.get_priority_display }}
@@ -40,11 +54,12 @@
</span>
</td>
<td>
<a href="{% url 'toggle_today_plan' plan.id %}" class="btn btn-sm btn-success toggle-status-btn">
<div class="btn-group">
<a href="{% url 'toggle_today_plan' plan.id %}" class="btn btn-sm btn-success toggle-status-btn" title="切换状态">
{% if plan.status == 'completed' %}
<i class="bi bi-check2-square"></i> 已完成
<i class="bi bi-check2-square"></i>
{% else %}
<i class="bi bi-square"></i> 标记完成
<i class="bi bi-square"></i>
{% endif %}
</a>
<a href="{% url 'edit_today_plan' plan.id %}" class="btn btn-sm btn-warning" title="编辑">
@@ -53,13 +68,22 @@
<a href="{% url 'delete_today_plan' plan.id %}" class="btn btn-sm btn-danger" title="删除">
<i class="bi bi-trash"></i>
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">今天还没有计划,快去添加吧!</p>
<div class="text-center py-5">
<i class="bi bi-calendar-x text-muted" style="font-size: 5rem;"></i>
<h5 class="text-muted mt-3">今天还没有计划</h5>
<p class="text-muted">点击上方按钮添加您的第一条计划</p>
<a href="{% url 'add_today_plan' %}" class="btn btn-primary">
<i class="bi bi-plus-lg me-1"></i>添加今日计划
</a>
</div>
{% endif %}
</div>
</div>

View File

@@ -1,43 +1,93 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>今日记录 ({{ today }})</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-calendar-event me-2 text-primary"></i>今日记录
<span class="badge bg-primary ms-2">{{ today }}</span>
</h2>
<div>
<a href="{% url 'index' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回首页
</a>
</div>
</div>
<!-- 添加记录按钮 -->
<div class="mb-4">
<a href="{% url 'add_today_reading' %}" class="btn btn-primary">添加阅读记录</a>
<a href="{% url 'add_today_insight' %}" class="btn btn-success">添加感悟记录</a>
<div class="row mb-4">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="row g-3">
<div class="col-md-6">
<a href="{% url 'add_today_reading' %}" class="btn btn-primary w-100 py-3">
<i class="bi bi-book me-2" style="font-size: 1.2rem;"></i>
<span>添加阅读记录</span>
</a>
</div>
<div class="col-md-6">
<a href="{% url 'add_today_insight' %}" class="btn btn-success w-100 py-3">
<i class="bi bi-lightbulb me-2" style="font-size: 1.2rem;"></i>
<span>添加感悟记录</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<!-- 阅读记录 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">阅读记录</h5>
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-book me-2"></i>阅读记录
</h5>
<span class="badge bg-light text-primary">{{ reading_records|length }} 条</span>
</div>
<div class="card-body">
{% if reading_records %}
<table class="table table-striped">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>类型</th>
<th style="width: 80px;">类型</th>
<th>标题</th>
<th>来源</th>
<th>进度</th>
<th>笔记</th>
<th>操作</th>
<th style="width: 100px;">操作</th>
</tr>
</thead>
<tbody>
{% for reading in reading_records %}
<tr>
<td>{{ reading.get_type_display }}</td>
<td>{{ reading.title }}</td>
<td>{{ reading.source|default:"-" }}</td>
<td>{{ reading.progress|default:"-" }}</td>
<td>{{ reading.note|truncatechars:50|default:"-" }}</td>
<td>
<span class="badge bg-secondary">{{ reading.get_type_display }}</span>
</td>
<td>
<strong>{{ reading.title }}</strong>
{% if reading.source %}
<div class="small text-muted">
<i class="bi bi-link-45deg me-1"></i>{{ reading.source }}
</div>
{% endif %}
{% if reading.progress %}
<div class="mt-1">
<div class="progress" style="height: 4px; width: 100px;">
<div class="progress-bar bg-primary" role="progressbar" style="width: {{ reading.progress }}%"></div>
</div>
<small class="text-muted">{{ reading.progress }}%</small>
</div>
{% endif %}
{% if reading.note %}
<div class="small text-muted mt-1">
<i class="bi bi-sticky me-1"></i>{{ reading.note|truncatechars:30 }}
</div>
{% endif %}
</td>
<td>
<div class="btn-group">
{% if reading.file %}
<a href="{{ reading.file.url }}" class="btn btn-sm btn-info" title="查看附件" target="_blank">
<i class="bi bi-file-earmark"></i>
@@ -49,56 +99,69 @@
<a href="{% url 'delete_today_reading' reading.id %}" class="btn btn-sm btn-danger" title="删除">
<i class="bi bi-trash"></i>
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">今日没有阅读记录,点击上方按钮添加</p>
<div class="text-center py-5">
<i class="bi bi-inbox text-muted" style="font-size: 4rem;"></i>
<p class="text-muted mt-3">今日没有阅读记录</p>
<a href="{% url 'add_today_reading' %}" class="btn btn-primary btn-sm">
<i class="bi bi-plus-lg me-1"></i>添加阅读记录
</a>
</div>
{% endif %}
</div>
</div>
</div>
<!-- 感悟记录 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-success text-white">
<h5 class="card-title mb-0">感悟记录</h5>
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-success text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-lightbulb me-2"></i>感悟记录
</h5>
<span class="badge bg-light text-success">{{ insight_records|length }} 条</span>
</div>
<div class="card-body">
{% if insight_records %}
<table class="table table-striped">
<thead>
<tr>
<th>内容</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<div class="list-group">
{% for insight in insight_records %}
<tr>
<td>{{ insight.content }}</td>
<td>
<div class="list-group-item">
<div class="d-flex justify-content-between align-items-start">
<div class="flex-grow-1">
<p class="mb-2">{{ insight.content }}</p>
{% if insight.file %}
<a href="{{ insight.file.url }}" class="btn btn-sm btn-info" title="查看附件" target="_blank">
<i class="bi bi-file-earmark"></i>
<a href="{{ insight.file.url }}" class="file-link" target="_blank">
<i class="bi bi-paperclip me-1"></i>查看附件
</a>
{% endif %}
</div>
<div class="btn-group ms-2">
<a href="{% url 'edit_today_insight' insight.id %}" class="btn btn-sm btn-warning" title="编辑">
<i class="bi bi-pencil"></i>
</a>
<a href="{% url 'delete_today_insight' insight.id %}" class="btn btn-sm btn-danger" title="删除">
<i class="bi bi-trash"></i>
</a>
</td>
</tr>
</div>
</div>
</div>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">今日没有感悟记录,点击上方按钮添加</p>
<div class="text-center py-5">
<i class="bi bi-inbox text-muted" style="font-size: 4rem;"></i>
<p class="text-muted mt-3">今日没有感悟记录</p>
<a href="{% url 'add_today_insight' %}" class="btn btn-success btn-sm">
<i class="bi bi-plus-lg me-1"></i>添加感悟记录
</a>
</div>
{% endif %}
</div>
</div>

View File

@@ -1,43 +1,93 @@
{% extends 'core/base.html' %}
{% block content %}
<h2>昨日记录 ({{ yesterday }})</h2>
<!-- 页面标题 -->
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">
<i class="bi bi-clock-history me-2 text-secondary"></i>昨日记录
<span class="badge bg-secondary ms-2">{{ yesterday }}</span>
</h2>
<div>
<a href="{% url 'index' %}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left me-1"></i>返回首页
</a>
</div>
</div>
<!-- 添加记录按钮 -->
<div class="mb-4">
<a href="{% url 'add_reading' %}" class="btn btn-primary">添加阅读记录</a>
<a href="{% url 'add_insight' %}" class="btn btn-success">添加感悟记录</a>
<div class="row mb-4">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="row g-3">
<div class="col-md-6">
<a href="{% url 'add_reading' %}" class="btn btn-primary w-100 py-3">
<i class="bi bi-book me-2" style="font-size: 1.2rem;"></i>
<span>添加阅读记录</span>
</a>
</div>
<div class="col-md-6">
<a href="{% url 'add_insight' %}" class="btn btn-success w-100 py-3">
<i class="bi bi-lightbulb me-2" style="font-size: 1.2rem;"></i>
<span>添加感悟记录</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<!-- 阅读记录 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-primary text-white">
<h5 class="card-title mb-0">阅读记录</h5>
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-primary text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-book me-2"></i>阅读记录
</h5>
<span class="badge bg-light text-primary">{{ reading_records|length }} 条</span>
</div>
<div class="card-body">
{% if reading_records %}
<table class="table table-striped">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>类型</th>
<th style="width: 80px;">类型</th>
<th>标题</th>
<th>来源</th>
<th>进度</th>
<th>笔记</th>
<th>操作</th>
<th style="width: 100px;">操作</th>
</tr>
</thead>
<tbody>
{% for reading in reading_records %}
<tr>
<td>{{ reading.get_type_display }}</td>
<td>{{ reading.title }}</td>
<td>{{ reading.source|default:"-" }}</td>
<td>{{ reading.progress|default:"-" }}</td>
<td>{{ reading.note|truncatechars:50|default:"-" }}</td>
<td>
<span class="badge bg-secondary">{{ reading.get_type_display }}</span>
</td>
<td>
<strong>{{ reading.title }}</strong>
{% if reading.source %}
<div class="small text-muted">
<i class="bi bi-link-45deg me-1"></i>{{ reading.source }}
</div>
{% endif %}
{% if reading.progress %}
<div class="mt-1">
<div class="progress" style="height: 4px; width: 100px;">
<div class="progress-bar bg-primary" role="progressbar" style="width: {{ reading.progress }}%"></div>
</div>
<small class="text-muted">{{ reading.progress }}%</small>
</div>
{% endif %}
{% if reading.note %}
<div class="small text-muted mt-1">
<i class="bi bi-sticky me-1"></i>{{ reading.note|truncatechars:30 }}
</div>
{% endif %}
</td>
<td>
<div class="btn-group">
{% if reading.file %}
<a href="{{ reading.file.url }}" class="btn btn-sm btn-info" title="查看附件" target="_blank">
<i class="bi bi-file-earmark"></i>
@@ -49,56 +99,69 @@
<a href="{% url 'delete_reading' reading.id %}" class="btn btn-sm btn-danger" title="删除">
<i class="bi bi-trash"></i>
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">昨日没有阅读记录,点击上方按钮添加</p>
<div class="text-center py-5">
<i class="bi bi-inbox text-muted" style="font-size: 4rem;"></i>
<p class="text-muted mt-3">昨日没有阅读记录</p>
<a href="{% url 'add_reading' %}" class="btn btn-primary btn-sm">
<i class="bi bi-plus-lg me-1"></i>添加阅读记录
</a>
</div>
{% endif %}
</div>
</div>
</div>
<!-- 感悟记录 -->
<div class="col-md-6">
<div class="card">
<div class="card-header bg-success text-white">
<h5 class="card-title mb-0">感悟记录</h5>
<div class="col-lg-6">
<div class="card h-100">
<div class="card-header bg-success text-white d-flex justify-content-between align-items-center">
<h5 class="card-title mb-0">
<i class="bi bi-lightbulb me-2"></i>感悟记录
</h5>
<span class="badge bg-light text-success">{{ insight_records|length }} 条</span>
</div>
<div class="card-body">
{% if insight_records %}
<table class="table table-striped">
<thead>
<tr>
<th>内容</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<div class="list-group">
{% for insight in insight_records %}
<tr>
<td>{{ insight.content }}</td>
<td>
<div class="list-group-item">
<div class="d-flex justify-content-between align-items-start">
<div class="flex-grow-1">
<p class="mb-2">{{ insight.content }}</p>
{% if insight.file %}
<a href="{{ insight.file.url }}" class="btn btn-sm btn-info" title="查看附件" target="_blank">
<i class="bi bi-file-earmark"></i>
<a href="{{ insight.file.url }}" class="file-link" target="_blank">
<i class="bi bi-paperclip me-1"></i>查看附件
</a>
{% endif %}
</div>
<div class="btn-group ms-2">
<a href="{% url 'edit_insight' insight.id %}" class="btn btn-sm btn-warning" title="编辑">
<i class="bi bi-pencil"></i>
</a>
<a href="{% url 'delete_insight' insight.id %}" class="btn btn-sm btn-danger" title="删除">
<i class="bi bi-trash"></i>
</a>
</td>
</tr>
</div>
</div>
</div>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<p class="text-muted">昨日没有感悟记录,点击上方按钮添加</p>
<div class="text-center py-5">
<i class="bi bi-inbox text-muted" style="font-size: 4rem;"></i>
<p class="text-muted mt-3">昨日没有感悟记录</p>
<a href="{% url 'add_insight' %}" class="btn btn-success btn-sm">
<i class="bi bi-plus-lg me-1"></i>添加感悟记录
</a>
</div>
{% endif %}
</div>
</div>