一个家庭日报系统
This commit is contained in:
27
core/templates/core/add_family_task.html
Normal file
27
core/templates/core/add_family_task.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>添加家庭事项</h2>
|
||||
|
||||
<form method="post" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
27
core/templates/core/add_insight.html
Normal file
27
core/templates/core/add_insight.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>添加感悟记录</h2>
|
||||
|
||||
<form method="post" enctype="multipart/form-data" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
27
core/templates/core/add_reading.html
Normal file
27
core/templates/core/add_reading.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>添加阅读记录</h2>
|
||||
|
||||
<form method="post" enctype="multipart/form-data" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
27
core/templates/core/add_today_plan.html
Normal file
27
core/templates/core/add_today_plan.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>添加今日计划</h2>
|
||||
|
||||
<form method="post" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
130
core/templates/core/base.html
Normal file
130
core/templates/core/base.html
Normal file
@@ -0,0 +1,130 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>家庭日报系统</title>
|
||||
<!-- Bootstrap 5 CSS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<!-- Chart.js -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<style>
|
||||
/* 自定义样式 */
|
||||
.nav-item.active .nav-link {
|
||||
font-weight: bold;
|
||||
color: #0d6efd !important;
|
||||
}
|
||||
|
||||
.card {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
margin: 0 0.25rem;
|
||||
}
|
||||
|
||||
.file-link {
|
||||
font-size: 0.875rem;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 导航栏 -->
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="{% url 'index' %}">家庭日报系统</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {% if request.resolver_match.url_name == 'system_settings' %}active{% endif %}" href="{% url 'system_settings' %}">系统配置</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- 主要内容区域 -->
|
||||
<main class="container mt-4">
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert">
|
||||
{{ message }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</main>
|
||||
|
||||
<!-- 页脚 -->
|
||||
<footer class="bg-light text-center text-lg-start mt-5 py-3">
|
||||
<div class="container">
|
||||
<p class="text-muted">© 2024 家庭日报系统 - 专注于家庭生活的轻量级日报系统</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Bootstrap 5 JS -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<!-- 自定义JS -->
|
||||
<script>
|
||||
// 切换计划状态
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const toggleButtons = document.querySelectorAll('.toggle-status-btn');
|
||||
toggleButtons.forEach(btn => {
|
||||
btn.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
const url = this.getAttribute('href');
|
||||
const statusBadge = this.closest('tr').querySelector('.status-badge');
|
||||
|
||||
fetch(url, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'X-Requested-With': 'XMLHttpRequest'
|
||||
}
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.status === 'completed') {
|
||||
statusBadge.className = 'badge bg-success status-badge';
|
||||
statusBadge.textContent = '已完成';
|
||||
this.innerHTML = '<i class="bi bi-check2-square"></i> 已完成';
|
||||
} else {
|
||||
statusBadge.className = 'badge bg-warning status-badge';
|
||||
statusBadge.textContent = '待处理';
|
||||
this.innerHTML = '<i class="bi bi-square"></i> 标记完成';
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
18
core/templates/core/delete_family_task.html
Normal file
18
core/templates/core/delete_family_task.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% 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>
|
||||
|
||||
<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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
18
core/templates/core/delete_insight.html
Normal file
18
core/templates/core/delete_insight.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% 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>
|
||||
|
||||
<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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
18
core/templates/core/delete_reading.html
Normal file
18
core/templates/core/delete_reading.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% 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>
|
||||
|
||||
<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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
18
core/templates/core/delete_today_plan.html
Normal file
18
core/templates/core/delete_today_plan.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% 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>
|
||||
|
||||
<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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
27
core/templates/core/edit_family_task.html
Normal file
27
core/templates/core/edit_family_task.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>编辑家庭事项</h2>
|
||||
|
||||
<form method="post" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
27
core/templates/core/edit_insight.html
Normal file
27
core/templates/core/edit_insight.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>编辑感悟记录</h2>
|
||||
|
||||
<form method="post" enctype="multipart/form-data" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
27
core/templates/core/edit_reading.html
Normal file
27
core/templates/core/edit_reading.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>编辑阅读记录</h2>
|
||||
|
||||
<form method="post" enctype="multipart/form-data" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
27
core/templates/core/edit_today_plan.html
Normal file
27
core/templates/core/edit_today_plan.html
Normal file
@@ -0,0 +1,27 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>编辑今日计划</h2>
|
||||
|
||||
<form method="post" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</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>
|
||||
{% 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>
|
||||
</form>
|
||||
{% endblock %}
|
||||
61
core/templates/core/family_tasks.html
Normal file
61
core/templates/core/family_tasks.html
Normal file
@@ -0,0 +1,61 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>家庭事项</h2>
|
||||
|
||||
<!-- 添加事项按钮 -->
|
||||
<div class="mb-4">
|
||||
<a href="{% url 'add_family_task' %}" class="btn btn-primary">添加家庭事项</a>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="card-title mb-0">家庭事项列表</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if tasks %}
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>内容</th>
|
||||
<th>优先级</th>
|
||||
<th>状态</th>
|
||||
<th>截止日期</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for task in tasks %}
|
||||
<tr>
|
||||
<td>{{ task.get_type_display }}</td>
|
||||
<td>{{ task.content }}</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 }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge {% if task.status == 'completed' %}bg-success{% else %}bg-warning{% endif %}">
|
||||
{{ task.get_status_display }}
|
||||
</span>
|
||||
</td>
|
||||
<td>{{ task.deadline|default:"-" }}</td>
|
||||
<td>
|
||||
<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>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">还没有家庭事项,点击上方按钮添加</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
141
core/templates/core/index.html
Normal file
141
core/templates/core/index.html
Normal file
@@ -0,0 +1,141 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<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>
|
||||
<div class="card-body">
|
||||
<h6>日期:{{ today }}</h6>
|
||||
<div class="mt-4">
|
||||
<h5>今日计划</h5>
|
||||
{% if today_plan %}
|
||||
<ul class="list-group">
|
||||
{% for plan in today_plan %}
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<strong>{{ plan.content }}</strong>
|
||||
<small class="text-muted"> - {{ plan.get_type_display }} - {{ plan.get_priority_display }}</small>
|
||||
</div>
|
||||
<span class="badge {% if plan.status == 'completed' %}bg-success{% else %}bg-warning{% endif %} status-badge">
|
||||
{{ plan.get_status_display }}
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-muted">今天还没有计划,快去添加吧!</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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>
|
||||
<div class="card-body">
|
||||
{% if pending_family_tasks %}
|
||||
<ul class="list-group">
|
||||
{% for task in pending_family_tasks %}
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<div>
|
||||
<strong>{{ task.content }}</strong>
|
||||
<small class="text-muted"> - {{ task.get_type_display }}</small>
|
||||
</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>
|
||||
</div>
|
||||
|
||||
<!-- 快捷操作 -->
|
||||
<div class="card mt-4">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h5 class="card-title mb-0">快捷操作</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="btn-group-vertical w-100">
|
||||
<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">查看今日报告</a>
|
||||
<a href="{% url 'send_email' %}" class="btn btn-outline-success">发送今日邮件</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 昨日记录 -->
|
||||
<div class="row mt-4">
|
||||
<div class="col-md-12">
|
||||
<div class="card">
|
||||
<div class="card-header bg-secondary text-white">
|
||||
<h5 class="card-title mb-0">昨日记录 ({{ yesterday }})</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<!-- 昨日阅读 -->
|
||||
<div class="col-md-6">
|
||||
<h5>阅读记录</h5>
|
||||
{% if yesterday_reading %}
|
||||
<ul class="list-group">
|
||||
{% for reading in yesterday_reading %}
|
||||
<li class="list-group-item">
|
||||
<strong>{{ reading.title }}</strong> ({{ reading.get_type_display }})
|
||||
{% 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.file %}
|
||||
<div class="mt-1">
|
||||
<a href="{{ reading.file.url }}" class="file-link" target="_blank"><i class="bi bi-file-earmark"></i> 查看附件</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-muted">昨日没有阅读记录</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 昨日感悟 -->
|
||||
<div class="col-md-6">
|
||||
<h5>感悟记录</h5>
|
||||
{% if yesterday_insight %}
|
||||
<ul class="list-group">
|
||||
{% for insight in yesterday_insight %}
|
||||
<li class="list-group-item">
|
||||
{{ insight.content }}
|
||||
{% 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>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-muted">昨日没有感悟记录</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
171
core/templates/core/report.html
Normal file
171
core/templates/core/report.html
Normal file
@@ -0,0 +1,171 @@
|
||||
{% 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">
|
||||
<i class="bi bi-file-pdf"></i> 生成PDF报告
|
||||
</a>
|
||||
<a href="{% url 'send_email' %}" class="btn btn-success">
|
||||
<i class="bi bi-envelope"></i> 发送邮件
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="card-title mb-0">报告概览</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6>报告日期:{{ today }}</h6>
|
||||
<h6>昨日日期:{{ yesterday }}</h6>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="chart-container" style="height: 200px;">
|
||||
<canvas id="familyTaskChart"></canvas>
|
||||
</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>
|
||||
<div class="card-body">
|
||||
{% if yesterday_reading %}
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>标题</th>
|
||||
<th>来源</th>
|
||||
<th>进度</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for reading in yesterday_reading %}
|
||||
<tr>
|
||||
<td>{{ reading.get_type_display }}</td>
|
||||
<td>{{ reading.title }}</td>
|
||||
<td>{{ reading.source|default:"-" }}</td>
|
||||
<td>{{ reading.progress|default:"-" }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">昨日没有阅读记录</p>
|
||||
{% 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>
|
||||
<div class="card-body">
|
||||
{% if yesterday_insight %}
|
||||
<ul class="list-group">
|
||||
{% for insight in yesterday_insight %}
|
||||
<li class="list-group-item">{{ insight.content }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-muted">昨日没有感悟记录</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header bg-warning text-dark">
|
||||
<h5 class="card-title mb-0">今日计划</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if today_plan %}
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>内容</th>
|
||||
<th>优先级</th>
|
||||
<th>状态</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for plan in today_plan %}
|
||||
<tr>
|
||||
<td>{{ plan.get_type_display }}</td>
|
||||
<td>{{ plan.content }}</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 }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge {% if plan.status == 'completed' %}bg-success{% else %}bg-warning{% endif %}">
|
||||
{{ plan.get_status_display }}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">今天还没有计划</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// 家庭事项统计图表
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const ctx = document.getElementById('familyTaskChart').getContext('2d');
|
||||
const familyTaskStats = {% if family_task_stats %}{{ family_task_stats|safe }}{% else %}[]{% endif %};
|
||||
|
||||
const labels = familyTaskStats.map(stat => {
|
||||
return stat.type === 'purchase' ? '采购' : '家务';
|
||||
});
|
||||
const data = familyTaskStats.map(stat => stat.count);
|
||||
|
||||
new Chart(ctx, {
|
||||
type: 'doughnut',
|
||||
data: {
|
||||
labels: labels,
|
||||
datasets: [{
|
||||
data: data,
|
||||
backgroundColor: [
|
||||
'#0d6efd',
|
||||
'#198754'
|
||||
],
|
||||
borderWidth: 1
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
maintainAspectRatio: false,
|
||||
plugins: {
|
||||
title: {
|
||||
display: true,
|
||||
text: '家庭事项统计'
|
||||
},
|
||||
legend: {
|
||||
position: 'bottom'
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
203
core/templates/core/report_pdf.html
Normal file
203
core/templates/core/report_pdf.html
Normal file
@@ -0,0 +1,203 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>家庭日报 - {{ today }}</title>
|
||||
<style>
|
||||
/* PDF样式 */
|
||||
body {
|
||||
font-family: SimHei, Arial, sans-serif;
|
||||
margin: 20px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #333;
|
||||
text-align: center;
|
||||
margin-bottom: 30px;
|
||||
border-bottom: 2px solid #000;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: #555;
|
||||
font-size: 18px;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 15px;
|
||||
border-left: 4px solid #007bff;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #666;
|
||||
font-size: 16px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.summary {
|
||||
background-color: #f8f9fa;
|
||||
padding: 15px;
|
||||
border-radius: 5px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
table, th, td {
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
th {
|
||||
background-color: #f2f2f2;
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.section {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.no-data {
|
||||
text-align: center;
|
||||
color: #999;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin: 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.footer {
|
||||
margin-top: 40px;
|
||||
text-align: center;
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>家庭日报</h1>
|
||||
|
||||
<div class="summary">
|
||||
<h3>报告概览</h3>
|
||||
<p>报告日期:{{ today }}</p>
|
||||
<p>昨日日期:{{ yesterday }}</p>
|
||||
</div>
|
||||
|
||||
<!-- 昨日阅读记录 -->
|
||||
<div class="section">
|
||||
<h2>昨日阅读记录</h2>
|
||||
{% if yesterday_reading %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>标题</th>
|
||||
<th>来源</th>
|
||||
<th>进度</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for reading in yesterday_reading %}
|
||||
<tr>
|
||||
<td>{{ reading.get_type_display }}</td>
|
||||
<td>{{ reading.title }}</td>
|
||||
<td>{{ reading.source|default:"-" }}</td>
|
||||
<td>{{ reading.progress|default:"-" }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<div class="no-data">昨日没有阅读记录</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 昨日感悟记录 -->
|
||||
<div class="section">
|
||||
<h2>昨日感悟记录</h2>
|
||||
{% if yesterday_insight %}
|
||||
<ul>
|
||||
{% for insight in yesterday_insight %}
|
||||
<li>{{ insight.content }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<div class="no-data">昨日没有感悟记录</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 今日计划 -->
|
||||
<div class="section">
|
||||
<h2>今日计划</h2>
|
||||
{% if today_plan %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>内容</th>
|
||||
<th>优先级</th>
|
||||
<th>状态</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for plan in today_plan %}
|
||||
<tr>
|
||||
<td>{{ plan.get_type_display }}</td>
|
||||
<td>{{ plan.content }}</td>
|
||||
<td>{{ plan.get_priority_display }}</td>
|
||||
<td>{{ plan.get_status_display }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<div class="no-data">今天还没有计划</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- 家庭事项统计 -->
|
||||
<div class="section">
|
||||
<h2>家庭事项统计</h2>
|
||||
{% if family_task_stats %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>数量</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for stat in family_task_stats %}
|
||||
<tr>
|
||||
<td>{{ stat.type|yesno:"采购,家务" }}</td>
|
||||
<td>{{ stat.count }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<div class="no-data">没有家庭事项统计数据</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
<p>此报告由家庭日报系统自动生成</p>
|
||||
<p>生成时间:{{ today|date:"Y年m月d日 H:i:s" }}</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
95
core/templates/core/system_settings.html
Normal file
95
core/templates/core/system_settings.html
Normal file
@@ -0,0 +1,95 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>系统配置</h2>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="card-title mb-0">系统配置设置</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" class="mt-4">
|
||||
{% csrf_token %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h6>邮件配置</h6>
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.smtp_server.id_for_label }}" class="form-label">{{ form.smtp_server.label }}</label>
|
||||
{{ form.smtp_server }}
|
||||
{% if form.smtp_server.help_text %}
|
||||
<div class="form-text">{{ form.smtp_server.help_text }}</div>
|
||||
{% endif %}
|
||||
{% for error in form.smtp_server.errors %}
|
||||
<div class="invalid-feedback d-block">{{ error }}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.smtp_port.id_for_label }}" class="form-label">{{ form.smtp_port.label }}</label>
|
||||
{{ form.smtp_port }}
|
||||
{% if form.smtp_port.help_text %}
|
||||
<div class="form-text">{{ form.smtp_port.help_text }}</div>
|
||||
{% endif %}
|
||||
{% for error in form.smtp_port.errors %}
|
||||
<div class="invalid-feedback d-block">{{ error }}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.smtp_username.id_for_label }}" class="form-label">{{ form.smtp_username.label }}</label>
|
||||
{{ form.smtp_username }}
|
||||
{% if form.smtp_username.help_text %}
|
||||
<div class="form-text">{{ form.smtp_username.help_text }}</div>
|
||||
{% endif %}
|
||||
{% for error in form.smtp_username.errors %}
|
||||
<div class="invalid-feedback d-block">{{ error }}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.smtp_password.id_for_label }}" class="form-label">{{ form.smtp_password.label }}</label>
|
||||
{{ form.smtp_password }}
|
||||
{% if form.smtp_password.help_text %}
|
||||
<div class="form-text">{{ form.smtp_password.help_text }}</div>
|
||||
{% endif %}
|
||||
{% for error in form.smtp_password.errors %}
|
||||
<div class="invalid-feedback d-block">{{ error }}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<h6>发送配置</h6>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.send_time.id_for_label }}" class="form-label">{{ form.send_time.label }}</label>
|
||||
{{ form.send_time }}
|
||||
{% if form.send_time.help_text %}
|
||||
<div class="form-text">{{ form.send_time.help_text }}</div>
|
||||
{% endif %}
|
||||
{% for error in form.send_time.errors %}
|
||||
<div class="invalid-feedback d-block">{{ error }}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.recipient_email.id_for_label }}" class="form-label">{{ form.recipient_email.label }}</label>
|
||||
{{ form.recipient_email }}
|
||||
{% if form.recipient_email.help_text %}
|
||||
<div class="form-text">{{ form.recipient_email.help_text }}</div>
|
||||
{% endif %}
|
||||
{% for error in form.recipient_email.errors %}
|
||||
<div class="invalid-feedback d-block">{{ error }}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
<button type="submit" class="btn btn-primary">保存配置</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
66
core/templates/core/today_plan.html
Normal file
66
core/templates/core/today_plan.html
Normal file
@@ -0,0 +1,66 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>今日计划</h2>
|
||||
|
||||
<!-- 添加计划按钮 -->
|
||||
<div class="mb-4">
|
||||
<a href="{% url 'add_today_plan' %}" class="btn btn-primary">添加今日计划</a>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="card-title mb-0">今日计划列表</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if plans %}
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>内容</th>
|
||||
<th>优先级</th>
|
||||
<th>状态</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for plan in plans %}
|
||||
<tr>
|
||||
<td>{{ plan.get_type_display }}</td>
|
||||
<td>{{ plan.content }}</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 }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge {% if plan.status == 'completed' %}bg-success{% else %}bg-warning{% endif %} status-badge">
|
||||
{{ plan.get_status_display }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{% url 'toggle_today_plan' plan.id %}" class="btn btn-sm btn-success toggle-status-btn">
|
||||
{% if plan.status == 'completed' %}
|
||||
<i class="bi bi-check2-square"></i> 已完成
|
||||
{% else %}
|
||||
<i class="bi bi-square"></i> 标记完成
|
||||
{% endif %}
|
||||
</a>
|
||||
<a href="{% url 'edit_today_plan' plan.id %}" class="btn btn-sm btn-warning" title="编辑">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<a href="{% url 'delete_today_plan' plan.id %}" class="btn btn-sm btn-danger" title="删除">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">今天还没有计划,快去添加吧!</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
105
core/templates/core/yesterday_records.html
Normal file
105
core/templates/core/yesterday_records.html
Normal file
@@ -0,0 +1,105 @@
|
||||
{% extends 'core/base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<h2>昨日记录 ({{ yesterday }})</h2>
|
||||
|
||||
<!-- 添加记录按钮 -->
|
||||
<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>
|
||||
|
||||
<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>
|
||||
<div class="card-body">
|
||||
{% if reading_records %}
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>类型</th>
|
||||
<th>标题</th>
|
||||
<th>来源</th>
|
||||
<th>进度</th>
|
||||
<th>操作</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>
|
||||
{% if reading.file %}
|
||||
<a href="{{ reading.file.url }}" class="btn btn-sm btn-info" title="查看附件" target="_blank">
|
||||
<i class="bi bi-file-earmark"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
<a href="{% url 'edit_reading' reading.id %}" class="btn btn-sm btn-warning" title="编辑">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<a href="{% url 'delete_reading' reading.id %}" class="btn btn-sm btn-danger" title="删除">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">昨日没有阅读记录,点击上方按钮添加</p>
|
||||
{% 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>
|
||||
<div class="card-body">
|
||||
{% if insight_records %}
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>内容</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for insight in insight_records %}
|
||||
<tr>
|
||||
<td>{{ insight.content }}</td>
|
||||
<td>
|
||||
{% 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>
|
||||
{% endif %}
|
||||
<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>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">昨日没有感悟记录,点击上方按钮添加</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user