feat: 重构所有模板页面,增强UI/UX体验
- 统一所有页面的卡片布局和样式 - 为表单页面添加图标和更好的视觉层次 - 改进表格的响应式和交互体验 - 为删除确认页面添加统一的警告样式 - 优化登录页面的视觉设计 - 为所有操作按钮添加图标增强可识别性 - 添加空状态提示和更友好的引导
This commit is contained in:
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user