sync from local backup

This commit is contained in:
chunyu
2026-08-05 23:59:22 +08:00
commit a59f46b894
409 changed files with 166027 additions and 0 deletions
+187
View File
@@ -0,0 +1,187 @@
# 编程学习模块教学内容与资料下载实现计划
## 需求总结
为编程学习模块(Python基础)添加三部分教学内容:
1. **文章教学** - Markdown格式的章节内容
2. **视频学习** - 章节视频播放
3. **资料下载** - 新增功能,支持下载课程资料(代码、PDF等)
## 当前状态分析
### 现有架构
- **Course** → **Chapter** → **ChapterContent**(Markdown内容)
- 章节已有 `video_url` 字段,但**缺少资料下载功能**
- `CourseLearn.tsx` 已有视频和文档标签页,但无下载入口
### 需要新增的内容
- 5个Python基础章节的完整Markdown教学内容
- 视频链接(使用免费教学视频)
- **资料下载功能**(新模型 + 前端UI)
## 实现方案
### 1. 新增资料下载模型
**文件**:`learn/models.py`
**新增模型** `CourseMaterial`:
```python
class CourseMaterial(models.Model):
chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE, related_name='materials', verbose_name='章节')
title = models.CharField(max_length=200, verbose_name='资料名称')
file = models.FileField(upload_to='learn/materials/%Y/%m/', verbose_name='文件')
file_type = models.CharField(max_length=20, choices=[('pdf', 'PDF'), ('code', '代码'), ('other', '其他')], default='other')
file_size = models.PositiveIntegerField(default=0, verbose_name='文件大小(字节)')
download_count = models.PositiveIntegerField(default=0, verbose_name='下载次数')
sort_order = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['sort_order']
verbose_name = '课程资料'
verbose_name_plural = '课程资料'
```
### 2. 新增资料下载API
**文件**:`learn/views.py`
**新增视图**:
- `MaterialListView` - 获取章节资料列表
- `MaterialDownloadView` - 文件下载接口(增加下载次数统计)
**文件**:`learn/serializers.py`
**新增序列化器**:
- `MaterialSerializer` - 资料列表序列化
### 3. 前端资料下载UI
**文件**:`CourseLearn.tsx`
**修改内容**:
- 新增"资料"标签页,显示当前章节的可下载资料
- 资料卡片展示:文件名、类型图标、大小、下载次数
- 点击下载按钮触发文件下载
- 支持PDF、代码文件、压缩包等类型图标
### 4. Python基础教学内容
**文件**:`learn/management/commands/seed_python_content.py`
**新增种子命令**,为Python课程填充5个章节内容:
#### 章节1:Python 简介与安装
- **文章内容**:Python历史、特点、安装步骤、第一个程序
- **视频**:B站Python入门视频链接
- **资料**:Python安装包链接、练习题
#### 章节2:变量与数据类型
- **文章内容**:变量命名、数字、字符串、列表、字典、元组
- **视频**:数据类型详解视频
- **资料**:练习题代码、速查表PDF
#### 章节3:条件判断与循环
- **文章内容**:if/else、for循环、while循环、break/continue
- **视频**:流程控制教学视频
- **资料**:编程练习题、示例代码
#### 章节4:函数与模块
- **文章内容**:函数定义、参数、返回值、模块导入、标准库
- **视频**:函数与模块视频
- **资料**:常用模块速查表、练习代码
#### 章节5:面向对象编程
- **文章内容**:类与对象、继承、多态、封装、魔术方法
- **视频**:OOP教学视频
- **资料**:完整示例代码、OOP设计模式PDF
### 5. 种子数据更新
**文件**:`seed_courses.py`
在创建章节时,同时创建示例 `ChapterContent` 内容(Markdown格式)。
## 涉及文件
### 后端(Django)
| 文件 | 修改类型 | 说明 |
|------|----------|------|
| `learn/models.py` | 修改 | 新增 `CourseMaterial` 模型 |
| `learn/serializers.py` | 修改 | 新增 `MaterialSerializer` |
| `learn/views.py` | 修改 | 新增资料列表和下载接口 |
| `learn/urls.py` | 修改 | 新增资料相关路由 |
| `learn/admin.py` | 修改 | 注册 `CourseMaterial` 模型 |
| `learn/management/commands/seed_python_content.py` | 新增 | Python基础内容种子命令 |
### 前端(React)
| 文件 | 修改类型 | 说明 |
|------|----------|------|
| `CourseLearn.tsx` | 修改 | 新增资料下载标签页和UI |
| `CourseLearn.css` | 修改 | 资料卡片样式 |
| `api/request.ts` | 修改 | 新增资料API调用 |
| `locales/zh.json` | 修改 | 新增资料相关文本 |
## 资料下载功能设计
### 数据库流程
```
Chapter → CourseMaterial(1:N)
用户点击下载 → API查询文件 → 文件流返回 → download_count + 1
```
### 前端展示
```
[视频] [文档] [资料] ← 标签页
┌─────────────────────────┐
│ 📄 Python基础速查表.pdf │
│ 📝 1.2 MB | 128次下载 │
│ [ 立即下载 ] │
├─────────────────────────┤
│ 💻 示例代码.zip │
│ 📝 856 KB | 89次下载 │
│ [ 立即下载 ] │
└─────────────────────────┘
```
### 支持的文件类型
| 类型 | 扩展名 | 图标 |
|------|--------|------|
| PDF | .pdf | 📄 |
| 代码 | .py, .js, .html, .css | 💻 |
| 压缩包 | .zip, .rar, .7z | 📦 |
| 文档 | .doc, .docx, .md | 📝 |
| 其他 | * | 📎 |
## 验证步骤
1. **模型迁移**
```bash
python manage.py makemigrations learn
python manage.py migrate
```
2. **种子数据**
```bash
python manage.py seed_python_content
```
3. **API测试**
- GET /api/learn/materials/?chapter_id=1 - 获取资料列表
- GET /api/learn/materials/1/download/ - 下载文件
4. **前端测试**
- 进入Python课程 → 选择章节 → 点击"资料"标签
- 显示资料列表 → 点击下载按钮 → 文件下载成功
## 风险评估
- 文件上传需要配置 `MEDIA_ROOT` 和 `MEDIA_URL`
- 大文件下载可能需要流式传输
- 下载权限控制(是否需要登录)
- 文件大小限制和存储配额
## 后续优化
- 资料上传进度条
- 批量下载(打包为zip)
- 资料搜索功能
- 用户上传资料审核