2026-01-04 19:21:52 +08:00
|
|
|
|
# 家庭日报系统
|
|
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
专注于家庭生活的轻量级日报系统,使用Django框架开发。
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 功能特性
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-07 21:37:18 +08:00
|
|
|
|
- 阅读记录管理(支持添加阅读笔记)
|
2026-01-06 22:03:14 +08:00
|
|
|
|
- 感悟记录管理
|
2026-01-07 21:37:18 +08:00
|
|
|
|
- 家庭事项管理(支持自定义事项类型)
|
2026-01-06 22:03:14 +08:00
|
|
|
|
- 今日计划管理
|
|
|
|
|
|
- 报告生成
|
|
|
|
|
|
- 邮件发送
|
2026-01-07 21:37:18 +08:00
|
|
|
|
- 后台管理界面(访问路径:/houtai)
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 技术栈
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
- Python 3.10+
|
|
|
|
|
|
- Django 4.2+
|
|
|
|
|
|
- Bootstrap 5
|
|
|
|
|
|
- SQLite(开发环境)
|
|
|
|
|
|
- PostgreSQL/MySQL(生产环境)
|
|
|
|
|
|
- Gunicorn + Nginx(生产部署)
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 快速开始
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
|
|
|
|
|
### 安装依赖
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
### 运行开发服务器
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python manage.py runserver
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 访问系统
|
|
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
打开浏览器访问:http://127.0.0.1:8000
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 数据库迁移指南
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
### 基本迁移流程
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
1. 生成迁移文件:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python manage.py makemigrations
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
2. 查看迁移文件内容(重要!):
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cat core/migrations/000x_xxx.py
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
3. 应用迁移:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python manage.py migrate
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
### 当数据库有数据时增加字段
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
#### 问题说明
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
当数据库中已有数据时,通过Django的migrate命令增加新字段**不会删除原有数据**,但需要注意以下几点:
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
1. 如果新字段设置为**非空**(`null=False, blank=False`),则必须提供默认值,否则迁移会失败
|
|
|
|
|
|
2. 如果新字段设置为**可空**(`null=True, blank=True`),则迁移会自动执行,原有记录的新字段值为NULL
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
#### 正确部署流程
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
1. **在开发环境测试**:
|
|
|
|
|
|
- 首先在开发环境生成迁移文件
|
|
|
|
|
|
- 检查迁移文件内容,确保:
|
|
|
|
|
|
- 新字段设置为可空(`null=True, blank=True`),或者
|
|
|
|
|
|
- 新字段提供了合理的默认值
|
|
|
|
|
|
- 在开发环境执行迁移,测试功能是否正常
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
2. **备份生产数据库**(重要!):
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# PostgreSQL示例
|
|
|
|
|
|
pg_dump -U username -d dbname > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
|
|
|
|
|
|
|
|
|
|
# MySQL示例
|
|
|
|
|
|
mysqldump -u username -p dbname > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
3. **在生产环境执行迁移**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 进入项目目录
|
|
|
|
|
|
cd /path/to/diary-family
|
|
|
|
|
|
|
|
|
|
|
|
# 激活虚拟环境
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 生成迁移文件(如果在开发环境已生成,可跳过)
|
|
|
|
|
|
python manage.py makemigrations
|
|
|
|
|
|
|
|
|
|
|
|
# 应用迁移
|
|
|
|
|
|
python manage.py migrate
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
4. **验证迁移结果**:
|
|
|
|
|
|
- 检查应用是否正常运行
|
|
|
|
|
|
- 验证新功能是否可用
|
|
|
|
|
|
- 检查数据是否完整
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
#### 示例:增加阅读笔记(note)字段
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
1. 在模型中添加字段(`core/models.py`):
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 正确的做法:设置为可空字段
|
|
|
|
|
|
note = models.TextField(blank=True, null=True, verbose_name="阅读笔记")
|
|
|
|
|
|
|
|
|
|
|
|
# 或者:提供默认值
|
|
|
|
|
|
note = models.TextField(default="", blank=True, verbose_name="阅读笔记")
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
2. 生成迁移文件:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python manage.py makemigrations
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
3. 检查迁移文件,确保新字段设置正确:
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 迁移文件示例(0003_readingrecord_note.py)
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
|
|
dependencies = [
|
|
|
|
|
|
('core', '0002_xxx'),
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
operations = [
|
|
|
|
|
|
migrations.AddField(
|
|
|
|
|
|
model_name='readingrecord',
|
|
|
|
|
|
name='note',
|
|
|
|
|
|
field=models.TextField(blank=True, null=True, verbose_name='阅读笔记'),
|
|
|
|
|
|
),
|
|
|
|
|
|
]
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
4. 应用迁移:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python manage.py migrate
|
|
|
|
|
|
```
|
2026-01-05 21:33:18 +08:00
|
|
|
|
|
2026-01-08 17:58:04 +08:00
|
|
|
|
## CSV数据导入指南
|
|
|
|
|
|
|
|
|
|
|
|
### 生成CSV文件
|
|
|
|
|
|
|
|
|
|
|
|
项目包含一个`generate_import_csv.py`脚本,用于生成符合数据库表结构的CSV文件并导入数据。
|
|
|
|
|
|
|
|
|
|
|
|
1. 生成CSV文件:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python generate_import_csv.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
2. 生成的CSV文件:
|
|
|
|
|
|
- `reading_type.csv` - 阅读记录类型
|
|
|
|
|
|
- `insight_record.csv` - 感悟记录
|
|
|
|
|
|
- `reading_record.csv` - 阅读记录
|
|
|
|
|
|
|
|
|
|
|
|
### CSV文件格式说明
|
|
|
|
|
|
|
|
|
|
|
|
#### reading_type.csv(阅读记录类型)
|
|
|
|
|
|
| 字段名 | 类型 | 说明 |
|
|
|
|
|
|
|-------|------|------|
|
|
|
|
|
|
| name | 字符串 | 阅读类型名称(如:书籍、文章、论文等) |
|
|
|
|
|
|
|
|
|
|
|
|
#### insight_record.csv(感悟记录)
|
|
|
|
|
|
| 字段名 | 类型 | 说明 |
|
|
|
|
|
|
|-------|------|------|
|
|
|
|
|
|
| date | 日期 | 记录日期(格式:YYYY-MM-DD) |
|
|
|
|
|
|
| content | 文本 | 感悟内容 |
|
|
|
|
|
|
|
|
|
|
|
|
#### reading_record.csv(阅读记录)
|
|
|
|
|
|
| 字段名 | 类型 | 说明 |
|
|
|
|
|
|
|-------|------|------|
|
|
|
|
|
|
| date | 日期 | 记录日期(格式:YYYY-MM-DD) |
|
|
|
|
|
|
| type_id | 整数 | 阅读类型ID(关联reading_type表的id字段) |
|
|
|
|
|
|
| title | 字符串 | 阅读标题 |
|
|
|
|
|
|
| source | 字符串 | 阅读来源 |
|
|
|
|
|
|
| progress | 字符串 | 阅读进度(如:已完成、进行中、未开始) |
|
|
|
|
|
|
| note | 文本 | 阅读笔记 |
|
|
|
|
|
|
|
|
|
|
|
|
### 自定义CSV数据
|
|
|
|
|
|
|
|
|
|
|
|
你可以手动编辑生成的CSV文件,添加或修改数据,然后再次运行导入脚本将数据导入到数据库。
|
|
|
|
|
|
|
|
|
|
|
|
### 数据导入
|
|
|
|
|
|
|
|
|
|
|
|
脚本会自动将CSV数据导入到数据库中,导入流程:
|
|
|
|
|
|
|
|
|
|
|
|
1. 清空ReadingType表的现有数据(避免类型ID冲突)
|
|
|
|
|
|
2. 导入ReadingType数据
|
|
|
|
|
|
3. 导入InsightRecord数据
|
|
|
|
|
|
4. 导入ReadingRecord数据
|
|
|
|
|
|
|
|
|
|
|
|
### 验证导入结果
|
|
|
|
|
|
|
|
|
|
|
|
可以使用Django shell查询数据库,验证数据是否正确导入:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python -c "import os; os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'diary_family.settings'); import django; django.setup(); from core.models import ReadingType, InsightRecord, ReadingRecord; print('ReadingType数量:', ReadingType.objects.count()); print('InsightRecord数量:', InsightRecord.objects.count()); print('ReadingRecord数量:', ReadingRecord.objects.count()); print('ReadingType数据:', [rt.name for rt in ReadingType.objects.all()])"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 生产部署
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
### 使用Gunicorn + Nginx
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
1. 安装Gunicorn:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pip install gunicorn
|
|
|
|
|
|
```
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
2. 启动Gunicorn:
|
2026-01-04 19:21:52 +08:00
|
|
|
|
```bash
|
2026-01-06 22:03:14 +08:00
|
|
|
|
gunicorn diary_family.wsgi:application --bind 0.0.0.0:8000
|
2026-01-04 19:21:52 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
3. 配置Nginx(`/etc/nginx/sites-available/diary-family`):
|
|
|
|
|
|
```nginx
|
|
|
|
|
|
server {
|
|
|
|
|
|
listen 80;
|
|
|
|
|
|
server_name example.com;
|
|
|
|
|
|
|
|
|
|
|
|
location / {
|
|
|
|
|
|
proxy_pass http://127.0.0.1:8000;
|
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
|
|
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
location /static/ {
|
|
|
|
|
|
alias /path/to/diary-family/static/;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
location /media/ {
|
|
|
|
|
|
alias /path/to/diary-family/media/;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
4. 启用Nginx配置:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
ln -s /etc/nginx/sites-available/diary-family /etc/nginx/sites-enabled/
|
|
|
|
|
|
systemctl restart nginx
|
|
|
|
|
|
```
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-07 21:37:18 +08:00
|
|
|
|
## 常规代码更新流程
|
|
|
|
|
|
|
|
|
|
|
|
当需要更新代码时,可以使用以下命令:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd /var/www/diary-family
|
|
|
|
|
|
|
|
|
|
|
|
# 1. 拉取远程最新代码(只获取,不合并)
|
|
|
|
|
|
git fetch origin
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 硬重置本地分支到远程分支的最新版本(会覆盖所有本地未提交修改)
|
|
|
|
|
|
# 注意:将 main 替换为你的分支名(如 master、dev 等)
|
|
|
|
|
|
git reset --hard origin/main
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 激活虚拟环境
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 4. 安装新依赖(如果有)
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
|
|
|
|
|
|
# 5. 收集静态文件(如果有静态文件更新)
|
|
|
|
|
|
python manage.py collectstatic --noinput
|
|
|
|
|
|
|
|
|
|
|
|
# 6. 重启服务
|
|
|
|
|
|
sudo supervisorctl restart all
|
|
|
|
|
|
sudo systemctl restart nginx
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 系统配置
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
在系统配置页面可以设置:
|
|
|
|
|
|
- SMTP服务器信息
|
|
|
|
|
|
- 邮件发送时间
|
|
|
|
|
|
- 收件人邮箱
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 注意事项
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
1. 定期备份数据库
|
|
|
|
|
|
2. 生产环境建议使用PostgreSQL或MySQL数据库
|
|
|
|
|
|
3. 定期清理过期数据
|
|
|
|
|
|
4. 保持依赖包更新
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
## 许可证
|
2026-01-04 19:21:52 +08:00
|
|
|
|
|
2026-01-06 22:03:14 +08:00
|
|
|
|
MIT License
|