1311 lines
25 KiB
Python
1311 lines
25 KiB
Python
import os
|
||
from django.core.management.base import BaseCommand
|
||
from learn.models import Course, Chapter, ChapterContent, CourseMaterial
|
||
|
||
|
||
SAMPLE_VIDEO_URL = "https://www.bilibili.com/video/BV1uv411q7Mv"
|
||
|
||
|
||
CHAPTER_CONTENT_MAP = {
|
||
"HTML 基础结构": """# HTML 基础结构
|
||
|
||
## 学习目标
|
||
- 理解 HTML 的作用和基本概念
|
||
- 掌握 HTML 文档的基本结构
|
||
- 熟悉常用的 HTML 标签
|
||
|
||
## 什么是 HTML?
|
||
|
||
HTML(HyperText Markup Language)是一种用于创建网页的标记语言。它使用标签来描述网页的结构和内容。
|
||
|
||
## HTML 文档结构
|
||
|
||
```html
|
||
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>页面标题</title>
|
||
</head>
|
||
<body>
|
||
<h1>欢迎来到我的网页</h1>
|
||
<p>这是一个段落。</p>
|
||
</body>
|
||
</html>
|
||
```
|
||
|
||
## 常用标签
|
||
|
||
| 标签 | 说明 |
|
||
|------|------|
|
||
| `<h1>` ~ `<h6>` | 标题标签 |
|
||
| `<p>` | 段落标签 |
|
||
| `<a>` | 链接标签 |
|
||
| `<img>` | 图片标签 |
|
||
| `<div>` | 块级容器 |
|
||
| `<span>` | 行内容器 |
|
||
|
||
## 动手练习
|
||
|
||
尝试创建一个包含标题、段落和个人简介的简单网页。
|
||
""",
|
||
|
||
"Python 简介与环境搭建": """# Python 简介与环境搭建
|
||
|
||
## 学习目标
|
||
- 了解 Python 语言特点
|
||
- 掌握 Python 安装方法
|
||
- 学会使用 IDLE 和命令行
|
||
|
||
## Python 简介
|
||
|
||
Python 是一种**解释型、高级、面向对象**的编程语言,由 Guido van Rossum 于 1991 年创建。
|
||
|
||
### 为什么选择 Python?
|
||
|
||
1. **简单易学** - 语法接近自然语言
|
||
2. **应用广泛** - Web开发、数据分析、人工智能
|
||
3. **社区活跃** - 丰富的第三方库
|
||
4. **跨平台** - Windows、macOS、Linux 通用
|
||
|
||
## 安装 Python
|
||
|
||
### Windows 安装步骤
|
||
|
||
1. 访问 [python.org](https://www.python.org/)
|
||
2. 下载最新版本 Python 3.x
|
||
3. 安装时勾选 **"Add Python to PATH"**
|
||
4. 点击 Install Now
|
||
|
||
### 验证安装
|
||
|
||
打开命令行输入:
|
||
|
||
```bash
|
||
python --version
|
||
```
|
||
|
||
## 第一个 Python 程序
|
||
|
||
```python
|
||
print("Hello, World!")
|
||
print("你好,Python!")
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 安装 Python 环境
|
||
2. 运行 `print("Hello, World!")`
|
||
3. 尝试使用不同的 print 输出
|
||
""",
|
||
|
||
"变量与数据类型": """# 变量与数据类型
|
||
|
||
## 学习目标
|
||
- 理解变量的概念
|
||
- 掌握 Python 的基本数据类型
|
||
- 学会使用 type() 函数
|
||
|
||
## 什么是变量?
|
||
|
||
变量是用于存储数据的容器。Python 中的变量不需要声明类型,直接赋值即可创建。
|
||
|
||
```python
|
||
name = "小明" # 字符串
|
||
age = 25 # 整数
|
||
height = 1.75 # 浮点数
|
||
is_student = True # 布尔值
|
||
```
|
||
|
||
## 基本数据类型
|
||
|
||
| 类型 | 说明 | 示例 |
|
||
|------|------|------|
|
||
| `int` | 整数 | `42`, `-10` |
|
||
| `float` | 浮点数 | `3.14`, `-0.5` |
|
||
| `str` | 字符串 | `"Hello"` |
|
||
| `bool` | 布尔值 | `True`, `False` |
|
||
| `list` | 列表 | `[1, 2, 3]` |
|
||
| `dict` | 字典 | `{"name": "Tom"}` |
|
||
|
||
## 类型转换
|
||
|
||
```python
|
||
x = int("10") # 字符串转整数
|
||
y = str(42) # 整数转字符串
|
||
z = float("3.14") # 字符串转浮点数
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 创建不同类型的变量
|
||
2. 使用 type() 查看变量类型
|
||
3. 练习类型转换
|
||
""",
|
||
|
||
"条件判断与循环": """# 条件判断与循环
|
||
|
||
## 学习目标
|
||
- 掌握 if-elif-else 条件判断
|
||
- 学会使用 for 循环
|
||
- 掌握 while 循环
|
||
|
||
## 条件判断
|
||
|
||
```python
|
||
age = 18
|
||
if age < 18:
|
||
print("未成年人")
|
||
elif age < 60:
|
||
print("成年人")
|
||
else:
|
||
print("老年人")
|
||
```
|
||
|
||
## for 循环
|
||
|
||
```python
|
||
# 遍历列表
|
||
fruits = ["apple", "banana", "cherry"]
|
||
for fruit in fruits:
|
||
print(fruit)
|
||
|
||
# 使用 range
|
||
for i in range(5):
|
||
print(i) # 输出 0, 1, 2, 3, 4
|
||
```
|
||
|
||
## while 循环
|
||
|
||
```python
|
||
count = 0
|
||
while count < 5:
|
||
print(count)
|
||
count += 1
|
||
```
|
||
|
||
## 循环控制
|
||
|
||
- `break` - 跳出循环
|
||
- `continue` - 跳过当前迭代
|
||
|
||
## 动手练习
|
||
|
||
1. 编写程序判断奇偶数
|
||
2. 使用循环打印乘法表
|
||
3. 计算 1 到 100 的和
|
||
""",
|
||
|
||
"函数与模块": """# 函数与模块
|
||
|
||
## 学习目标
|
||
- 理解函数的作用
|
||
- 掌握函数的定义和调用
|
||
- 了解模块的使用
|
||
|
||
## 定义函数
|
||
|
||
```python
|
||
def greet(name):
|
||
'''打招呼函数'''
|
||
return f"你好,{name}!"
|
||
|
||
# 调用函数
|
||
message = greet("小明")
|
||
print(message) # 输出:你好,小明!
|
||
```
|
||
|
||
## 参数类型
|
||
|
||
```python
|
||
# 默认参数
|
||
def power(base, exponent=2):
|
||
return base ** exponent
|
||
|
||
print(power(3)) # 9
|
||
print(power(2, 3)) # 8
|
||
```
|
||
|
||
## 导入模块
|
||
|
||
```python
|
||
import math
|
||
print(math.sqrt(16)) # 4.0
|
||
|
||
from random import randint
|
||
print(randint(1, 100))
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 编写计算圆面积的函数
|
||
2. 创建判断素数的函数
|
||
3. 使用 math 模块进行数学计算
|
||
""",
|
||
|
||
"列表与字典": """# 列表与字典
|
||
|
||
## 学习目标
|
||
- 掌握列表的操作方法
|
||
- 理解字典的键值对结构
|
||
- 学会遍历和推导式
|
||
|
||
## 列表 (List)
|
||
|
||
```python
|
||
numbers = [1, 2, 3, 4, 5]
|
||
numbers.append(6) # 添加元素
|
||
numbers.pop() # 移除最后一个
|
||
numbers[0] # 索引访问
|
||
numbers[1:3] # 切片
|
||
```
|
||
|
||
## 字典 (Dict)
|
||
|
||
```python
|
||
student = {
|
||
"name": "小明",
|
||
"age": 20,
|
||
"grade": "A"
|
||
}
|
||
print(student["name"]) # 访问值
|
||
student["age"] = 21 # 修改值
|
||
```
|
||
|
||
## 列表推导式
|
||
|
||
```python
|
||
squares = [x**2 for x in range(10)]
|
||
evens = [x for x in range(10) if x % 2 == 0]
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 创建学生成绩列表并排序
|
||
2. 使用字典存储书籍信息
|
||
3. 使用推导式生成斐波那契数列
|
||
""",
|
||
|
||
"面向对象编程": """# 面向对象编程
|
||
|
||
## 学习目标
|
||
- 理解类和对象的概念
|
||
- 掌握类的定义和使用
|
||
- 了解继承和多态
|
||
|
||
## 定义类
|
||
|
||
```python
|
||
class Dog:
|
||
def __init__(self, name, age):
|
||
self.name = name
|
||
self.age = age
|
||
|
||
def bark(self):
|
||
return f"{self.name} 汪汪叫!"
|
||
|
||
# 创建对象
|
||
my_dog = Dog("旺财", 3)
|
||
print(my_dog.bark())
|
||
```
|
||
|
||
## 继承
|
||
|
||
```python
|
||
class Animal:
|
||
def __init__(self, name):
|
||
self.name = name
|
||
|
||
def speak(self):
|
||
pass
|
||
|
||
class Cat(Animal):
|
||
def speak(self):
|
||
return f"{self.name} 喵喵叫!"
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 创建一个 BankAccount 类
|
||
2. 实现存款和取款方法
|
||
3. 使用继承创建不同类型的账户
|
||
""",
|
||
|
||
"文件操作与异常处理": """# 文件操作与异常处理
|
||
|
||
## 学习目标
|
||
- 掌握文件的读写操作
|
||
- 理解异常处理机制
|
||
- 学会使用 with 语句
|
||
|
||
## 文件读写
|
||
|
||
```python
|
||
# 写入文件
|
||
with open("test.txt", "w", encoding="utf-8") as f:
|
||
f.write("Hello World\n")
|
||
|
||
# 读取文件
|
||
with open("test.txt", "r", encoding="utf-8") as f:
|
||
content = f.read()
|
||
print(content)
|
||
```
|
||
|
||
## 异常处理
|
||
|
||
```python
|
||
try:
|
||
result = 10 / 0
|
||
except ZeroDivisionError:
|
||
print("不能除以零!")
|
||
finally:
|
||
print("执行完毕")
|
||
```
|
||
|
||
## 常见异常类型
|
||
|
||
| 异常类型 | 说明 |
|
||
|----------|------|
|
||
| `ValueError` | 值错误 |
|
||
| `TypeError` | 类型错误 |
|
||
| `FileNotFoundError` | 文件不存在 |
|
||
| `ZeroDivisionError` | 除零错误 |
|
||
|
||
## 动手练习
|
||
|
||
1. 读取 CSV 文件并统计数据
|
||
2. 使用异常处理保证程序健壮性
|
||
3. 实现日志记录功能
|
||
""",
|
||
|
||
"常用标准库": """# 常用标准库
|
||
|
||
## 学习目标
|
||
- 熟悉 Python 标准库
|
||
- 掌握 os、datetime、json 等模块
|
||
- 学会使用第三方库
|
||
|
||
## os 模块
|
||
|
||
```python
|
||
import os
|
||
print(os.getcwd()) # 当前目录
|
||
os.listdir(".") # 列出文件
|
||
os.path.exists("test.txt") # 判断文件是否存在
|
||
```
|
||
|
||
## datetime 模块
|
||
|
||
```python
|
||
from datetime import datetime
|
||
now = datetime.now()
|
||
print(now.strftime("%Y-%m-%d %H:%M:%S"))
|
||
```
|
||
|
||
## json 模块
|
||
|
||
```python
|
||
import json
|
||
|
||
data = {"name": "Tom", "age": 25}
|
||
json_str = json.dumps(data, ensure_ascii=False)
|
||
parsed = json.loads(json_str)
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 批量重命名文件
|
||
2. 计算日期差值
|
||
3. 解析 JSON 配置文件
|
||
""",
|
||
|
||
"项目实战:爬虫入门": """# 项目实战:爬虫入门
|
||
|
||
## 学习目标
|
||
- 了解爬虫的基本原理
|
||
- 掌握 requests 库的使用
|
||
- 学会使用 BeautifulSoup 解析 HTML
|
||
|
||
## 什么是爬虫?
|
||
|
||
爬虫是自动获取网页数据的程序,常用于数据采集、监控等场景。
|
||
|
||
## requests 库
|
||
|
||
```python
|
||
import requests
|
||
|
||
url = "https://api.github.com"
|
||
response = requests.get(url)
|
||
print(response.status_code)
|
||
print(response.json())
|
||
```
|
||
|
||
## BeautifulSoup 解析
|
||
|
||
```python
|
||
from bs4 import BeautifulSoup
|
||
|
||
html = "<h1>Hello</h1><p>World</p>"
|
||
soup = BeautifulSoup(html, "html.parser")
|
||
print(soup.h1.text) # Hello
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. 遵守网站的 robots.txt
|
||
2. 控制请求频率
|
||
3. 不要爬取敏感数据
|
||
|
||
## 动手练习
|
||
|
||
1. 爬取天气数据显示在控制台
|
||
2. 获取豆瓣电影 Top 250
|
||
3. 制作每日新闻聚合器
|
||
""",
|
||
|
||
"CSS 选择器与样式": """# CSS 选择器与样式
|
||
|
||
## 学习目标
|
||
- 理解 CSS 的作用
|
||
- 掌握 CSS 选择器
|
||
- 学会使用常见样式属性
|
||
|
||
## CSS 语法
|
||
|
||
```css
|
||
选择器 {
|
||
属性名: 值;
|
||
属性名: 值;
|
||
}
|
||
```
|
||
|
||
## 选择器类型
|
||
|
||
| 选择器 | 说明 | 示例 |
|
||
|--------|------|------|
|
||
| 元素选择器 | 选中所有该元素 | `p { }` |
|
||
| 类选择器 | 选中 class 属性 | `.box { }` |
|
||
| ID 选择器 | 选中 id 属性 | `#header { }` |
|
||
| 后代选择器 | 选中后代元素 | `div p { }` |
|
||
|
||
## 常用属性
|
||
|
||
```css
|
||
.box {
|
||
color: #333;
|
||
font-size: 16px;
|
||
background-color: #f5f5f5;
|
||
padding: 10px;
|
||
margin: 5px;
|
||
border: 1px solid #ddd;
|
||
}
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 为之前的 HTML 页面添加样式
|
||
2. 使用不同选择器设置样式
|
||
3. 实现一个卡片组件
|
||
""",
|
||
|
||
"CSS 布局与响应式": """# CSS 布局与响应式
|
||
|
||
## 学习目标
|
||
- 掌握 Flexbox 布局
|
||
- 学会 Grid 布局
|
||
- 理解响应式设计
|
||
|
||
## Flexbox 布局
|
||
|
||
```css
|
||
.container {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
}
|
||
```
|
||
|
||
## Grid 布局
|
||
|
||
```css
|
||
.grid-container {
|
||
display: grid;
|
||
grid-template-columns: repeat(3, 1fr);
|
||
gap: 20px;
|
||
}
|
||
```
|
||
|
||
## 响应式设计
|
||
|
||
```css
|
||
/* 移动端优先 */
|
||
.box { width: 100%; }
|
||
|
||
/* 平板 */
|
||
@media (min-width: 768px) {
|
||
.box { width: 50%; }
|
||
}
|
||
|
||
/* 桌面 */
|
||
@media (min-width: 1024px) {
|
||
.box { width: 33.33%; }
|
||
}
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 使用 Flexbox 实现导航栏
|
||
2. 使用 Grid 实现图片画廊
|
||
3. 制作响应式登录页面
|
||
""",
|
||
|
||
"JavaScript 基础语法": """# JavaScript 基础语法
|
||
|
||
## 学习目标
|
||
- 了解 JavaScript 的作用
|
||
- 掌握变量和数据类型
|
||
- 学会函数定义
|
||
|
||
## JavaScript 简介
|
||
|
||
JavaScript 是一种轻量级编程语言,用于网页交互开发。
|
||
|
||
## 变量声明
|
||
|
||
```javascript
|
||
let name = "小明"; // 可变变量
|
||
const PI = 3.14159; // 常量
|
||
// var 已不推荐使用
|
||
```
|
||
|
||
## 数据类型
|
||
|
||
```javascript
|
||
let str = "Hello"; // 字符串
|
||
let num = 42; // 数字
|
||
let bool = true; // 布尔
|
||
let arr = [1, 2, 3]; // 数组
|
||
let obj = { name: "Tom" }; // 对象
|
||
```
|
||
|
||
## 函数定义
|
||
|
||
```javascript
|
||
// 函数声明
|
||
function greet(name) {
|
||
return `你好,${name}!`;
|
||
}
|
||
|
||
// 箭头函数
|
||
const add = (a, b) => a + b;
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 声明不同类型的变量
|
||
2. 编写计算两数之和的函数
|
||
3. 使用箭头函数处理数组
|
||
""",
|
||
|
||
"DOM 操作与事件": """# DOM 操作与事件
|
||
|
||
## 学习目标
|
||
- 理解 DOM 树结构
|
||
- 掌握元素选择方法
|
||
- 学会事件处理
|
||
|
||
## 选择元素
|
||
|
||
```javascript
|
||
document.getElementById("header");
|
||
document.querySelector(".title");
|
||
document.querySelectorAll("p");
|
||
```
|
||
|
||
## 修改内容
|
||
|
||
```javascript
|
||
const el = document.querySelector("h1");
|
||
el.textContent = "新标题";
|
||
el.style.color = "red";
|
||
el.classList.add("active");
|
||
```
|
||
|
||
## 事件处理
|
||
|
||
```javascript
|
||
const btn = document.querySelector("button");
|
||
btn.addEventListener("click", function() {
|
||
console.log("按钮被点击了!");
|
||
});
|
||
```
|
||
|
||
## 常见事件
|
||
|
||
| 事件 | 说明 |
|
||
|------|------|
|
||
| `click` | 点击事件 |
|
||
| `mouseover` | 鼠标悬停 |
|
||
| `keydown` | 键盘按下 |
|
||
| `submit` | 表单提交 |
|
||
|
||
## 动手练习
|
||
|
||
1. 实现点击按钮改变背景色
|
||
2. 制作图片轮播效果
|
||
3. 实现表单验证功能
|
||
""",
|
||
|
||
"HTML 表单与多媒体": """# HTML 表单与多媒体
|
||
|
||
## 学习目标
|
||
- 掌握表单元素
|
||
- 学会插入图片和视频
|
||
- 理解语义化标签
|
||
|
||
## 表单元素
|
||
|
||
```html
|
||
<form action="/submit" method="post">
|
||
<input type="text" name="username" placeholder="用户名">
|
||
<input type="password" name="password" placeholder="密码">
|
||
<input type="email" name="email" placeholder="邮箱">
|
||
<select name="city">
|
||
<option value="beijing">北京</option>
|
||
<option value="shanghai">上海</option>
|
||
</select>
|
||
<button type="submit">提交</button>
|
||
</form>
|
||
```
|
||
|
||
## 多媒体标签
|
||
|
||
```html
|
||
<img src="image.jpg" alt="图片描述">
|
||
<video src="video.mp4" controls></video>
|
||
<audio src="audio.mp3" controls></audio>
|
||
```
|
||
|
||
## 语义化标签
|
||
|
||
| 标签 | 说明 |
|
||
|------|------|
|
||
| `<header>` | 页面头部 |
|
||
| `<nav>` | 导航栏 |
|
||
| `<main>` | 主内容区 |
|
||
| `<footer>` | 页脚 |
|
||
|
||
## 动手练习
|
||
|
||
1. 制作用户注册表单
|
||
2. 在页面中插入图片和视频
|
||
3. 使用语义化标签重构页面
|
||
""",
|
||
|
||
"Java 基础回顾": """# Java 基础回顾
|
||
|
||
## 学习目标
|
||
- 复习 Java 语法基础
|
||
- 掌握面向对象特性
|
||
- 熟悉集合框架
|
||
|
||
## Java 简介
|
||
|
||
Java 是一种面向对象的跨平台编程语言,广泛应用于企业级开发。
|
||
|
||
## 基本语法
|
||
|
||
```java
|
||
public class HelloWorld {
|
||
public static void main(String[] args) {
|
||
System.out.println("Hello, World!");
|
||
}
|
||
}
|
||
```
|
||
|
||
## 数据类型
|
||
|
||
```java
|
||
int age = 25; // 整数
|
||
double price = 99.9; // 浮点数
|
||
String name = "Tom"; // 字符串
|
||
boolean isActive = true; // 布尔
|
||
int[] numbers = {1, 2, 3}; // 数组
|
||
```
|
||
|
||
## 面向对象
|
||
|
||
```java
|
||
public class Student {
|
||
private String name;
|
||
private int age;
|
||
|
||
public Student(String name, int age) {
|
||
this.name = name;
|
||
this.age = age;
|
||
}
|
||
|
||
public void study() {
|
||
System.out.println(name + " is studying");
|
||
}
|
||
}
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 创建学生类并实现方法
|
||
2. 使用 ArrayList 存储数据
|
||
3. 实现继承和多态
|
||
""",
|
||
|
||
"Spring Boot 入门": """# Spring Boot 入门
|
||
|
||
## 学习目标
|
||
- 了解 Spring Boot 框架
|
||
- 掌握项目创建方法
|
||
- 学会创建 REST API
|
||
|
||
## Spring Boot 简介
|
||
|
||
Spring Boot 是简化 Spring 应用开发的框架,提供自动配置和快速启动能力。
|
||
|
||
## 创建项目
|
||
|
||
使用 [Spring Initializr](https://start.spring.io/) 创建项目,选择:
|
||
- Maven
|
||
- Java 17
|
||
- Spring Web 依赖
|
||
|
||
## 第一个 Controller
|
||
|
||
```java
|
||
@RestController
|
||
@RequestMapping("/api")
|
||
public class HelloController {
|
||
|
||
@GetMapping("/hello")
|
||
public String hello() {
|
||
return "Hello, Spring Boot!";
|
||
}
|
||
}
|
||
```
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
src/
|
||
├── main/
|
||
│ ├── java/com/example/demo/
|
||
│ │ ├── DemoApplication.java
|
||
│ │ └── controller/
|
||
│ └── resources/
|
||
│ └── application.properties
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 创建 Spring Boot 项目
|
||
2. 实现一个简单的 REST API
|
||
3. 使用 Postman 测试接口
|
||
""",
|
||
|
||
"MySQL 数据库设计": """# MySQL 数据库设计
|
||
|
||
## 学习目标
|
||
- 掌握 SQL 基础语法
|
||
- 理解数据库设计原则
|
||
- 学会建表和查询
|
||
|
||
## SQL 基础
|
||
|
||
```sql
|
||
-- 创建数据库
|
||
CREATE DATABASE mydb;
|
||
|
||
-- 创建表
|
||
CREATE TABLE users (
|
||
id INT PRIMARY KEY AUTO_INCREMENT,
|
||
name VARCHAR(50) NOT NULL,
|
||
email VARCHAR(100) UNIQUE,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 插入数据
|
||
INSERT INTO users (name, email) VALUES ('Tom', 'tom@example.com');
|
||
|
||
-- 查询数据
|
||
SELECT * FROM users WHERE name LIKE '%T%';
|
||
```
|
||
|
||
## 表关系
|
||
|
||
- 一对一 (One-to-One)
|
||
- 一对多 (One-to-Many)
|
||
- 多对多 (Many-to-Many)
|
||
|
||
## 动手练习
|
||
|
||
1. 设计博客系统的数据库
|
||
2. 创建用户和文章表
|
||
3. 编写复杂查询语句
|
||
""",
|
||
|
||
"RESTful API 开发": """# RESTful API 开发
|
||
|
||
## 学习目标
|
||
- 理解 REST 架构风格
|
||
- 掌握 API 设计规范
|
||
- 学会使用 Spring Boot 开发 API
|
||
|
||
## REST 设计规范
|
||
|
||
| HTTP 方法 | 路径 | 说明 |
|
||
|-----------|------|------|
|
||
| GET | /users | 获取用户列表 |
|
||
| GET | /users/{id} | 获取单个用户 |
|
||
| POST | /users | 创建用户 |
|
||
| PUT | /users/{id} | 更新用户 |
|
||
| DELETE | /users/{id} | 删除用户 |
|
||
|
||
## 实现示例
|
||
|
||
```java
|
||
@RestController
|
||
@RequestMapping("/api/users")
|
||
public class UserController {
|
||
|
||
@GetMapping
|
||
public List<User> getAllUsers() {
|
||
return userService.findAll();
|
||
}
|
||
|
||
@PostMapping
|
||
public User createUser(@RequestBody User user) {
|
||
return userService.save(user);
|
||
}
|
||
}
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 设计一套完整的 RESTful API
|
||
2. 实现 CRUD 操作
|
||
3. 添加参数校验和异常处理
|
||
""",
|
||
|
||
"JWT 认证与授权": """# JWT 认证与授权
|
||
|
||
## 学习目标
|
||
- 理解 JWT 原理
|
||
- 掌握 Spring Security 配置
|
||
- 学会实现认证和授权
|
||
|
||
## JWT 简介
|
||
|
||
JWT (JSON Web Token) 是一种无状态的认证机制,由 Header、Payload、Signature 三部分组成。
|
||
|
||
## Spring Security 配置
|
||
|
||
```java
|
||
@Configuration
|
||
@EnableWebSecurity
|
||
public class SecurityConfig {
|
||
|
||
@Bean
|
||
public SecurityFilterChain filterChain(HttpSecurity http) {
|
||
http.csrf().disable()
|
||
.authorizeHttpRequests(auth -> auth
|
||
.requestMatchers("/api/auth/**").permitAll()
|
||
.anyRequest().authenticated()
|
||
);
|
||
return http.build();
|
||
}
|
||
}
|
||
```
|
||
|
||
## JWT 工具类
|
||
|
||
```java
|
||
public class JwtUtils {
|
||
private static final String SECRET = "your-secret-key";
|
||
|
||
public static String generateToken(String username) {
|
||
return Jwts.builder()
|
||
.setSubject(username)
|
||
.setIssuedAt(new Date())
|
||
.setExpiration(new Date(System.currentTimeMillis() + 86400000))
|
||
.signWith(SignatureAlgorithm.HS256, SECRET)
|
||
.compact();
|
||
}
|
||
}
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 实现用户登录接口
|
||
2. 添加 JWT 过滤器
|
||
3. 实现基于角色的权限控制
|
||
""",
|
||
|
||
"Vue 3 组合式 API": """# Vue 3 组合式 API
|
||
|
||
## 学习目标
|
||
- 理解 Options API vs Composition API
|
||
- 掌握 setup 语法
|
||
- 学会使用响应式 API
|
||
|
||
## Composition API 简介
|
||
|
||
Composition API 是 Vue 3 推荐的编写方式,使用函数组合替代选项式配置。
|
||
|
||
## 基础用法
|
||
|
||
```vue
|
||
<script setup>
|
||
import { ref, computed, onMounted } from 'vue'
|
||
|
||
const count = ref(0)
|
||
const doubled = computed(() => count.value * 2)
|
||
|
||
function increment() {
|
||
count.value++
|
||
}
|
||
|
||
onMounted(() => {
|
||
console.log('组件已挂载')
|
||
})
|
||
</script>
|
||
|
||
<template>
|
||
<button @click="increment">{{ count }} × 2 = {{ doubled }}</button>
|
||
</template>
|
||
```
|
||
|
||
## 常用 API
|
||
|
||
| API | 说明 |
|
||
|-----|------|
|
||
| `ref()` | 响应式变量 |
|
||
| `reactive()` | 响应式对象 |
|
||
| `computed()` | 计算属性 |
|
||
| `watch()` | 监听器 |
|
||
| `onMounted()` | 挂载后 |
|
||
|
||
## 动手练习
|
||
|
||
1. 使用 Composition API 实现计数器
|
||
2. 创建待办事项列表
|
||
3. 使用 watch 监听数据变化
|
||
""",
|
||
|
||
"TypeScript 基础": """# TypeScript 基础
|
||
|
||
## 学习目标
|
||
- 理解 TypeScript 的优势
|
||
- 掌握类型注解
|
||
- 学会接口和泛型
|
||
|
||
## TypeScript 简介
|
||
|
||
TypeScript 是 JavaScript 的超集,添加了静态类型系统。
|
||
|
||
## 类型注解
|
||
|
||
```typescript
|
||
let name: string = "Tom"
|
||
let age: number = 25
|
||
let isActive: boolean = true
|
||
let hobbies: string[] = ["coding", "reading"]
|
||
```
|
||
|
||
## 接口
|
||
|
||
```typescript
|
||
interface User {
|
||
id: number
|
||
name: string
|
||
email?: string // 可选属性
|
||
}
|
||
|
||
function printUser(user: User) {
|
||
console.log(user.name)
|
||
}
|
||
```
|
||
|
||
## 泛型
|
||
|
||
```typescript
|
||
function identity<T>(arg: T): T {
|
||
return arg
|
||
}
|
||
|
||
const result = identity<string>("Hello")
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 为变量添加类型注解
|
||
2. 定义用户接口
|
||
3. 使用泛型创建通用函数
|
||
""",
|
||
|
||
"Pinia 状态管理": """# Pinia 状态管理
|
||
|
||
## 学习目标
|
||
- 了解状态管理必要性
|
||
- 掌握 Pinia 基本用法
|
||
- 学会模块化管理
|
||
|
||
## Pinia 简介
|
||
|
||
Pinia 是 Vue 3 官方推荐的状态管理库,替代 Vuex。
|
||
|
||
## 定义 Store
|
||
|
||
```typescript
|
||
import { defineStore } from 'pinia'
|
||
|
||
export const useCounterStore = defineStore('counter', {
|
||
state: () => ({
|
||
count: 0
|
||
}),
|
||
getters: {
|
||
doubled: (state) => state.count * 2
|
||
},
|
||
actions: {
|
||
increment() {
|
||
this.count++
|
||
}
|
||
}
|
||
})
|
||
```
|
||
|
||
## 使用 Store
|
||
|
||
```vue
|
||
<script setup>
|
||
import { useCounterStore } from '@/stores/counter'
|
||
|
||
const counter = useCounterStore()
|
||
</script>
|
||
|
||
<template>
|
||
<button @click="counter.increment">
|
||
{{ counter.count }} × 2 = {{ counter.doubled }}
|
||
</button>
|
||
</template>
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 创建用户状态 Store
|
||
2. 实现登录状态管理
|
||
3. 使用持久化插件
|
||
""",
|
||
|
||
"Vue Router 路由": """# Vue Router 路由
|
||
|
||
## 学习目标
|
||
- 掌握路由配置
|
||
- 学会路由导航
|
||
- 理解路由守卫
|
||
|
||
## 路由配置
|
||
|
||
```typescript
|
||
import { createRouter, createWebHistory } from 'vue-router'
|
||
|
||
const router = createRouter({
|
||
history: createWebHistory(),
|
||
routes: [
|
||
{ path: '/', component: () => import('./Home.vue') },
|
||
{ path: '/about', component: () => import('./About.vue') },
|
||
{ path: '/user/:id', component: () => import('./User.vue') }
|
||
]
|
||
})
|
||
```
|
||
|
||
## 编程式导航
|
||
|
||
```typescript
|
||
import { useRouter } from 'vue-router'
|
||
|
||
const router = useRouter()
|
||
router.push('/about')
|
||
router.push({ name: 'user', params: { id: '123' } })
|
||
```
|
||
|
||
## 路由守卫
|
||
|
||
```typescript
|
||
router.beforeEach((to, from, next) => {
|
||
if (to.meta.requiresAuth && !isLoggedIn()) {
|
||
next('/login')
|
||
} else {
|
||
next()
|
||
}
|
||
})
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 配置嵌套路由
|
||
2. 实现面包屑导航
|
||
4. 添加登录守卫
|
||
""",
|
||
|
||
"项目实战:后台管理系统": """# 项目实战:后台管理系统
|
||
|
||
## 学习目标
|
||
- 综合运用 Vue 3 + TypeScript
|
||
- 掌握组件化开发
|
||
- 学会项目结构设计
|
||
|
||
## 技术栈
|
||
|
||
- Vue 3 + TypeScript
|
||
- Element Plus
|
||
- Pinia
|
||
- Vue Router
|
||
- Axios
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
src/
|
||
├── api/ # 接口请求
|
||
├── components/ # 公共组件
|
||
├── views/ # 页面视图
|
||
├── stores/ # 状态管理
|
||
├── router/ # 路由配置
|
||
└── utils/ # 工具函数
|
||
```
|
||
|
||
## 核心功能
|
||
|
||
1. 用户登录认证
|
||
2. 权限管理
|
||
3. 数据统计图表
|
||
4. CRUD 操作
|
||
|
||
## 动手练习
|
||
|
||
1. 搭建项目脚手架
|
||
2. 实现登录页面
|
||
3. 开发用户管理模块
|
||
""",
|
||
}
|
||
|
||
|
||
MATERIALS_SAMPLE = [
|
||
{"title": "课程源代码", "file_type": "code", "file_size": 102400},
|
||
{"title": "练习题答案", "file_type": "pdf", "file_size": 512000},
|
||
{"title": "课程思维导图", "file_type": "pdf", "file_size": 204800},
|
||
]
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = '为所有课程章节填充示例视频、文档和配套资料'
|
||
|
||
def handle(self, *args, **options):
|
||
self.stdout.write("开始为课程填充内容...\n")
|
||
|
||
# 1. 为所有章节添加视频
|
||
self._populate_videos()
|
||
|
||
# 2. 为所有章节添加文档内容
|
||
self._populate_content()
|
||
|
||
# 3. 为所有章节添加配套资料
|
||
self._populate_materials()
|
||
|
||
self.stdout.write(self.style.SUCCESS("\n✅ 所有内容填充完成!"))
|
||
|
||
def _populate_videos(self):
|
||
"""为所有章节添加示例视频"""
|
||
chapters = Chapter.objects.filter(video_url='')
|
||
count = chapters.update(video_url=SAMPLE_VIDEO_URL, video_source='bilibili')
|
||
self.stdout.write(self.style.SUCCESS(f"📹 已添加视频: {count} 个章节"))
|
||
|
||
def _populate_content(self):
|
||
"""为所有章节添加文档内容"""
|
||
chapters = Chapter.objects.all()
|
||
count = 0
|
||
for chapter in chapters:
|
||
content = CHAPTER_CONTENT_MAP.get(chapter.title)
|
||
if not content:
|
||
content = self._generate_content(chapter)
|
||
|
||
obj, created = ChapterContent.objects.update_or_create(
|
||
chapter=chapter,
|
||
defaults={'content_md': content, 'content_html': content}
|
||
)
|
||
if created:
|
||
count += 1
|
||
self.stdout.write(self.style.SUCCESS(f"📄 已添加文档: {count} 个章节"))
|
||
|
||
def _populate_materials(self):
|
||
"""为所有章节添加配套资料"""
|
||
chapters = Chapter.objects.all()
|
||
count = 0
|
||
for chapter in chapters:
|
||
existing = CourseMaterial.objects.filter(chapter=chapter).count()
|
||
if existing >= 3:
|
||
continue
|
||
for mat in MATERIALS_SAMPLE:
|
||
CourseMaterial.objects.create(
|
||
chapter=chapter,
|
||
title=mat["title"],
|
||
file_type=mat["file_type"],
|
||
file_size=mat["file_size"],
|
||
)
|
||
count += 1
|
||
self.stdout.write(self.style.SUCCESS(f"📦 已添加资料: {count} 条记录"))
|
||
|
||
def _generate_content(self, chapter):
|
||
"""为没有预设内容的章节生成通用文档"""
|
||
course_name = chapter.course.title
|
||
return f"""# {chapter.title}
|
||
|
||
## 学习目标
|
||
- 掌握 {chapter.title} 的核心概念
|
||
- 能够运用所学知识解决实际问题
|
||
- 培养独立思考和动手能力
|
||
|
||
## 前言
|
||
|
||
本章是《{course_name}》课程的重要组成部分。通过本章学习,你将掌握相关技术在实际开发中的应用。
|
||
|
||
## 核心知识点
|
||
|
||
### 1. 基本概念
|
||
|
||
理解本章涉及的基本术语和概念是学习的第一步。
|
||
|
||
### 2. 实践应用
|
||
|
||
通过实际案例演示知识点的应用场景。
|
||
|
||
### 3. 最佳分享
|
||
|
||
分享开发中的最佳实践和注意事项。
|
||
|
||
## 代码示例
|
||
|
||
```python
|
||
# 本章示例代码
|
||
def example():
|
||
print("Hello, {chapter.title}!")
|
||
|
||
example()
|
||
```
|
||
|
||
## 动手练习
|
||
|
||
1. 阅读本章内容并理解核心概念
|
||
2. 完成课后练习题
|
||
3. 尝试独立编写一个小项目
|
||
"""
|