142 lines
6.8 KiB
Python
142 lines
6.8 KiB
Python
from django.core.management.base import BaseCommand
|
||
from django.contrib.auth import get_user_model
|
||
from learn.models import Course, Chapter
|
||
|
||
User = get_user_model()
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = '初始化编程学习课程数据'
|
||
|
||
def handle(self, *args, **options):
|
||
admin = User.objects.filter(is_superuser=True).first()
|
||
if not admin:
|
||
admin = User.objects.first()
|
||
if not admin:
|
||
self.stdout.write(self.style.ERROR('未找到任何用户,请先创建用户'))
|
||
return
|
||
|
||
# 保留的课程标题(覆盖所有难度和分类)
|
||
keep_titles = [
|
||
'Python 零基础入门',
|
||
'前端入门(HTML + CSS + JS)',
|
||
'Java 后端开发进阶',
|
||
'Vue 3 企业级实战',
|
||
]
|
||
|
||
# 删除不在保留列表中的课程
|
||
deleted_count = Course.objects.exclude(title__in=keep_titles).count()
|
||
Course.objects.exclude(title__in=keep_titles).delete()
|
||
self.stdout.write(f'已清理 {deleted_count} 个旧课程')
|
||
|
||
courses_data = [
|
||
{
|
||
'title': 'Python 零基础入门',
|
||
'description': '从零开始学习 Python 编程,掌握基础语法、数据类型、函数和面向对象编程',
|
||
'category': 'backend',
|
||
'level': 'beginner',
|
||
'color': '#667eea',
|
||
'icon_name': 'PythonOutlined',
|
||
'is_hot': True,
|
||
'is_new': True,
|
||
'sort_order': 100,
|
||
'chapters': [
|
||
{'title': 'Python 简介与环境搭建', 'sort_order': 1, 'duration': '30分钟', 'is_free': True},
|
||
{'title': '变量与数据类型', 'sort_order': 2, 'duration': '45分钟', 'is_free': True},
|
||
{'title': '条件判断与循环', 'sort_order': 3, 'duration': '60分钟', 'is_free': True},
|
||
{'title': '函数与模块', 'sort_order': 4, 'duration': '50分钟', 'is_free': True},
|
||
{'title': '列表与字典', 'sort_order': 5, 'duration': '55分钟', 'is_free': True},
|
||
{'title': '面向对象编程', 'sort_order': 6, 'duration': '70分钟', 'is_free': True},
|
||
{'title': '文件操作与异常处理', 'sort_order': 7, 'duration': '45分钟', 'is_free': True},
|
||
{'title': '常用标准库', 'sort_order': 8, 'duration': '50分钟', 'is_free': True},
|
||
{'title': '项目实战:爬虫入门', 'sort_order': 9, 'duration': '90分钟', 'is_free': True},
|
||
]
|
||
},
|
||
{
|
||
'title': '前端入门(HTML + CSS + JS)',
|
||
'description': '系统学习网页开发三大基础技术:HTML 结构、CSS 样式和 JavaScript 交互',
|
||
'category': 'frontend',
|
||
'level': 'beginner',
|
||
'color': '#4facfe',
|
||
'icon_name': 'Html5Outlined',
|
||
'is_hot': True,
|
||
'is_new': True,
|
||
'sort_order': 90,
|
||
'chapters': [
|
||
{'title': 'HTML 基础结构', 'sort_order': 1, 'duration': '30分钟', 'is_free': True},
|
||
{'title': 'HTML 表单与多媒体', 'sort_order': 2, 'duration': '40分钟', 'is_free': True},
|
||
{'title': 'CSS 选择器与样式', 'sort_order': 3, 'duration': '50分钟', 'is_free': True},
|
||
{'title': 'CSS 布局与响应式', 'sort_order': 4, 'duration': '60分钟', 'is_free': True},
|
||
{'title': 'JavaScript 基础语法', 'sort_order': 5, 'duration': '55分钟', 'is_free': True},
|
||
{'title': 'DOM 操作与事件', 'sort_order': 6, 'duration': '45分钟', 'is_free': True},
|
||
]
|
||
},
|
||
{
|
||
'title': 'Java 后端开发进阶',
|
||
'description': '深入学习 Java 后端开发,掌握 Spring Boot、MySQL 和 RESTful API 设计',
|
||
'category': 'backend',
|
||
'level': 'advanced',
|
||
'color': '#f093fb',
|
||
'icon_name': 'ApiOutlined',
|
||
'is_hot': True,
|
||
'is_new': False,
|
||
'sort_order': 80,
|
||
'chapters': [
|
||
{'title': 'Java 基础回顾', 'sort_order': 1, 'duration': '40分钟', 'is_free': True},
|
||
{'title': 'Spring Boot 入门', 'sort_order': 2, 'duration': '60分钟', 'is_free': True},
|
||
{'title': 'MySQL 数据库设计', 'sort_order': 3, 'duration': '50分钟', 'is_free': True},
|
||
{'title': 'RESTful API 开发', 'sort_order': 4, 'duration': '70分钟', 'is_free': True},
|
||
{'title': 'JWT 认证与授权', 'sort_order': 5, 'duration': '45分钟', 'is_free': True},
|
||
]
|
||
},
|
||
{
|
||
'title': 'Vue 3 企业级实战',
|
||
'description': '使用 Vue 3 + TypeScript + Pinia 开发企业级单页应用',
|
||
'category': 'frontend',
|
||
'level': 'advanced',
|
||
'color': '#43e97b',
|
||
'icon_name': 'CodeOutlined',
|
||
'is_hot': False,
|
||
'is_new': True,
|
||
'sort_order': 70,
|
||
'chapters': [
|
||
{'title': 'Vue 3 组合式 API', 'sort_order': 1, 'duration': '45分钟', 'is_free': True},
|
||
{'title': 'TypeScript 基础', 'sort_order': 2, 'duration': '50分钟', 'is_free': True},
|
||
{'title': 'Pinia 状态管理', 'sort_order': 3, 'duration': '55分钟', 'is_free': True},
|
||
{'title': 'Vue Router 路由', 'sort_order': 4, 'duration': '40分钟', 'is_free': True},
|
||
{'title': '项目实战:后台管理系统', 'sort_order': 5, 'duration': '90分钟', 'is_free': True},
|
||
]
|
||
},
|
||
]
|
||
|
||
created_count = 0
|
||
chapter_count = 0
|
||
|
||
for course_data in courses_data:
|
||
chapters_data = course_data.pop('chapters', [])
|
||
course_data['author'] = admin
|
||
course_data['status'] = 'published'
|
||
|
||
course, created = Course.objects.update_or_create(
|
||
title=course_data['title'],
|
||
defaults=course_data
|
||
)
|
||
|
||
if created:
|
||
created_count += 1
|
||
|
||
for chapter_data in chapters_data:
|
||
chapter, ch_created = Chapter.objects.update_or_create(
|
||
course=course,
|
||
title=chapter_data['title'],
|
||
defaults=chapter_data
|
||
)
|
||
if ch_created:
|
||
chapter_count += 1
|
||
|
||
self.stdout.write(
|
||
self.style.SUCCESS(
|
||
f'成功创建 {created_count} 个课程,共 {chapter_count} 个章节'
|
||
)
|
||
)
|