sync from local backup
This commit is contained in:
@@ -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)
|
||||
- 资料搜索功能
|
||||
- 用户上传资料审核
|
||||
Reference in New Issue
Block a user