首页 > 其他 > 详细

在线教育平台 (一)

时间:2020-05-31 10:01:41      阅读:52      评论:0      收藏:0      [点我收藏+]

一.环境搭建

 

1.1 安装xadmin及相关依赖

 

①.下载

pip install pillow                                # 图片处理

pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 # xadmin

pip install django-simple-captcha # 验证码

pip install django-pure-pagination # 分页
 

 

1.2 创建四个app及超级用户

 

①.app创建

python manage.py startapp users

python manage.py startapp course

python manage.py startapp organization

python manage.py startapp operation

 

②.超级用户

python manage.py createsuperuser

 

二.各models设计及settings设置

 

2.1 各app的models

 

①.course.models

技术分享图片
from datetime import datetime

from django.db import models


class Course(models.Model):
    DEGREE_CHOICES = (
        ("cj", "初级"),
        ("zj", "中级"),
        ("gj", "高级")
    )
    name = models.CharField("课程名",max_length=50)
    desc = models.CharField("课程描述",max_length=300)
    detail = models.TextField("课程详情")
    degree = models.CharField(难度,choices=DEGREE_CHOICES, max_length=2)
    learn_times = models.IntegerField("学习时长(分钟数)",default=0)
    students = models.IntegerField("学习人数",default=0)
    fav_nums = models.IntegerField("收藏人数",default=0)
    image = models.ImageField("封面图",upload_to="courses/%Y/%m",max_length=100)
    click_nums = models.IntegerField("点击数",default=0)
    add_time = models.DateTimeField("添加时间",default=datetime.now,)

    class Meta:
        verbose_name = "课程"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

class Lesson(models.Model):
    course = models.ForeignKey(Course,verbose_name=课程,on_delete=models.CASCADE)
    name = models.CharField("章节名",max_length=100)
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "章节"
        verbose_name_plural = verbose_name

    def __str__(self):
        return 《{0}》课程的章节 >> {1}.format(self.course, self.name)

class Video(models.Model):
    lesson = models.ForeignKey(Lesson, verbose_name="章节",on_delete=models.CASCADE)
    name = models.CharField("视频名",max_length=100)
    add_time = models.DateTimeField("添加时间", default=datetime.now)

    class Meta:
        verbose_name = "视频"
        verbose_name_plural = verbose_name


class CourseResource(models.Model):
    course = models.ForeignKey(Course, verbose_name="课程",on_delete=models.CASCADE)
    name = models.CharField("名称",max_length=100)
    download = models.FileField("资源文件",upload_to="course/resource/%Y/%m",max_length=100)
    add_time = models.DateTimeField("添加时间", default=datetime.now)

    class Meta:
        verbose_name = "课程资源"
        verbose_name_plural = verbose_name
course

 

②.operation.models

技术分享图片
from datetime import datetime

from django.db import models

from course.models import Course
from users.models import UserProfile


class UserAsk(models.Model):
    name = models.CharField(姓名,max_length=20)
    mobile = models.CharField(手机,max_length=11)
    course_name = models.CharField(课程名,max_length=50)
    add_time = models.DateTimeField(添加时间,default=datetime.now)

    class Meta:
        verbose_name = 用户咨询
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class CourseComments(models.Model):
    user = models.ForeignKey(UserProfile,verbose_name=用户,on_delete=models.CASCADE)
    course = models.ForeignKey(Course,verbose_name=课程,on_delete=models.CASCADE)
    comments = models.CharField(评论,max_length=200)
    add_time = models.DateTimeField(添加时间, default=datetime.now)

    class Meta:
        verbose_name = 课程评论
        verbose_name_plural = verbose_name


class UserFavorite(models.Model):
    FAV_TYPE = (
        (1,课程),
        (2,课程机构),
        (3,讲师)
    )

    user = models.ForeignKey(UserProfile,verbose_name=用户,on_delete=models.CASCADE)
    fav_id = models.IntegerField(数据id,default=0)
    fav_type = models.IntegerField(verbose_name=收藏类型,choices=FAV_TYPE,default=1)
    add_time = models.DateTimeField(添加时间, default=datetime.now)

    class Meta:
        verbose_name = 用户收藏
        verbose_name_plural = verbose_name


class UserMessage(models.Model):
    user = models.IntegerField(接受用户,default=0)
    message = models.CharField(消息内容,max_length=500)
    has_read = models.BooleanField(是否已读,default=False)
    add_time = models.DateTimeField(添加时间, default=datetime.now)

    class Meta:
        verbose_name = 用户消息
        verbose_name_plural = verbose_name


class UserCourse(models.Model):
    user = models.ForeignKey(UserProfile,verbose_name=用户,on_delete=models.CASCADE)
    course = models.ForeignKey(Course,verbose_name=课程,on_delete=models.CASCADE)
    add_time = models.DateTimeField(添加时间, default=datetime.now)

    class Meta:
        verbose_name = 用户课程
        verbose_name_plural = verbose_name
operation

 

③.organization.models

技术分享图片
from datetime import datetime

from django.db import models


class CityDict(models.Model):
    name = models.CharField(城市,max_length=20)
    desc = models.CharField(描述,max_length=200)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = 城市
        verbose_name_plural= verbose_name


class CourseOrg(models.Model):
    name = models.CharField(机构名称,max_length=50)
    desc = models.TextField(机构描述)
    click_nums = models.IntegerField(点击数,default=0)
    fav_nums = models.IntegerField(收藏数,default=0)
    image = models.ImageField(封面图,upload_to=org/%Y%m,max_length=100)
    address = models.CharField(机构地址,max_length=150,)
    city = models.ForeignKey(CityDict,verbose_name=所在城市,on_delete=models.CASCADE)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = 课程机构
        verbose_name_plural = verbose_name


class Teacher(models.Model):
    org = models.ForeignKey(CourseOrg,verbose_name=所属机构,on_delete=models.CASCADE)
    name = models.CharField(教师名,max_length=50)
    work_years = models.IntegerField(工作年限,default=0)
    work_company = models.CharField(就职公司,max_length=50)
    work_position = models.CharField(公司职位,max_length=50)
    points = models.CharField(教学特点,max_length=50)
    click_nums = models.IntegerField(点击数,default=0)
    fav_nums = models.IntegerField(收藏数,default=0)
    add_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = 教师
        verbose_name_plural = verbose_name

    def __str__(self):
        return "[{0}]的教师: {1}".format(self.org, self.name)
organization

 

④.users.models

技术分享图片
from datetime import datetime

from django.db import models
from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):

    gender_choices = (
        (male,),
        (female,)
    )

    nick_name = models.CharField(昵称,max_length=50,default=‘‘)
    birthday = models.DateField(生日,null=True,blank=True)
    gender = models.CharField(性别,max_length=10,choices=gender_choices,default=female)
    adress = models.CharField(地址,max_length=100,default=‘‘)
    mobile = models.CharField(手机号,max_length=11,null=True,blank=True)
    image = models.ImageField(upload_to=image/%Y%m,default=image/default.png,max_length=100)

    class Meta:
        verbose_name = 用户信息
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username


class EmailVerifyRecord(models.Model):
    send_choices = (
        (register,注册),
        (forget,找回密码)
    )

    code = models.CharField(验证码,max_length=20)
    email = models.EmailField(邮箱,max_length=50)
    send_type = models.CharField(choices=send_choices,max_length=10)
    send_time = models.DateTimeField(default=datetime.now)

    class Meta:
        verbose_name = 邮箱验证码
        verbose_name_plural = verbose_name


class Banner(models.Model):
    title = models.CharField(标题,max_length=100)
    image = models.ImageField(轮播图,upload_to=banner/%Y%m,max_length=100)
    url = models.URLField(访问地址,max_length=200)
    index = models.IntegerField(顺序,default=100)
    add_time = models.DateTimeField(添加时间,default=datetime.now)

    class Meta:
        verbose_name = 轮播图
        verbose_name_plural = verbose_name
users

 

2.2 settings设置

 

①.mysql设置

DATABASES = {
    default: {
        ENGINE: django.db.backends.mysql,
        NAME: rconline,        #数据库名字
        USER: zry,          #账号
        PASSWORD: 542858zry,      #密码
        HOST: 127.0.0.1,    #IP
        PORT: 3306,                   #端口
    }
}
import pymysql
pymysql.install_as_MySQLdb()

 

②.时区,时间设置

LANGUAGE_CODE = zh-hans

TIME_ZONE = Asia/Shanghai

USE_I18N = True

USE_L10N = True

USE_TZ = False

 

③.将xadmin,app等加入INSTALLED_APPS中

INSTALLED_APPS = [
    django.contrib.admin,
    django.contrib.auth,
    django.contrib.contenttypes,
    django.contrib.sessions,
    django.contrib.messages,
    django.contrib.staticfiles,

    course,
    operation,
    organization,
    users,

    xadmin,
    crispy_forms,
    captcha,
]

 

 

④.添加extra_apps和apps路径

sys.path.insert(0,os.path.join(BASE_DIR, apps))
sys.path.insert(0,os.path.join(BASE_DIR, extra_apps))

 

⑤.设置media保存路径

# 上传图片
MEDIA_URL = /media/
MEDIA_ROOT = os.path.join(BASE_DIR,media)

 

⑥.替换系统用户

#重载系统的用户,让UserProfile生效
AUTH_USER_MODEL = users.UserProfile

 

⑦.迁移生成数据库

python manage.py makemigrations

python manage.py migrate

 

三.xadmin后台设置

 

3.1 编辑后台内容

 

①.course

技术分享图片
import xadmin

from .models import Course, Lesson, Video, CourseResource


# Course的admin管理器
class CourseAdmin(object):
    ‘‘‘课程‘‘‘

    list_display = [ name,desc,detail,degree,learn_times,students]
    search_fields = [name, desc, detail, degree, students]
    list_filter = [ name,desc,detail,degree,learn_times,students]


class LessonAdmin(object):
    ‘‘‘章节‘‘‘

    list_display = [course, name, add_time]
    search_fields = [course, name]
    #这里course__name是根据课程名称过滤
    list_filter = [course__name, name, add_time]


class VideoAdmin(object):
    ‘‘‘视频‘‘‘

    list_display = [lesson, name, add_time]
    search_fields = [lesson, name]
    list_filter = [lesson, name, add_time]


class CourseResourceAdmin(object):
    ‘‘‘课程资源‘‘‘

    list_display = [course, name, download, add_time]
    search_fields = [course, name, download]
    list_filter = [course__name, name, download, add_time]


# 将管理器与model进行注册关联
xadmin.site.register(Course, CourseAdmin)
xadmin.site.register(Lesson, LessonAdmin)
xadmin.site.register(Video, VideoAdmin)
xadmin.site.register(CourseResource, CourseResourceAdmin)
adminx.py
技术分享图片
from django.apps import AppConfig


class CourseConfig(AppConfig):
    name = course
    verbose_name = 课程
apps.py
技术分享图片
default_app_config = course.apps.CourseConfig
__init__.py

 

②.operation

技术分享图片
import xadmin

from .models import UserAsk, UserCourse, UserMessage, CourseComments, UserFavorite


class UserAskAdmin(object):
    ‘‘‘用户表单我要学习‘‘‘

    list_display = [name, mobile, course_name, add_time]
    search_fields = [name, mobile, course_name]
    list_filter = [name, mobile, course_name, add_time]


#
class UserCourseAdmin(object):
    ‘‘‘用户课程学习‘‘‘

    list_display = [user, course, add_time]
    search_fields = [user, course]
    list_filter = [user, course, add_time]



class UserMessageAdmin(object):
    ‘‘‘用户消息后台‘‘‘

    list_display = [user, message, has_read, add_time]
    search_fields = [user, message, has_read]
    list_filter = [user, message, has_read, add_time]



class CourseCommentsAdmin(object):
    ‘‘‘用户评论后台‘‘‘

    list_display = [user, course, comments, add_time]
    search_fields = [user, course, comments]
    list_filter = [user, course, comments, add_time]



class UserFavoriteAdmin(object):
    ‘‘‘用户收藏后台‘‘‘

    list_display = [user, fav_id, fav_type, add_time]
    search_fields = [user, fav_id, fav_type]
    list_filter = [user, fav_id, fav_type, add_time]


# 将后台管理器与models进行关联注册。
xadmin.site.register(UserAsk, UserAskAdmin)
xadmin.site.register(UserCourse, UserCourseAdmin)
xadmin.site.register(UserMessage, UserMessageAdmin)
xadmin.site.register(CourseComments, CourseCommentsAdmin)
xadmin.site.register(UserFavorite, UserFavoriteAdmin)
adminx.py
技术分享图片
from django.apps import AppConfig


class OperationConfig(AppConfig):
    name = operation
    verbose_name = 用户操作
apps.py
技术分享图片
default_app_config = operation.apps.OperationConfig
__init__.py

 

③.organization

技术分享图片
import xadmin

from .models import CityDict, CourseOrg, Teacher



class CityDictAdmin(object):
    ‘‘‘城市‘‘‘
    
    list_display = [name, desc, add_time]
    search_fields = [name, desc]
    list_filter = [name, desc, add_time]


class CourseOrgAdmin(object):
    ‘‘‘机构‘‘‘
    
    list_display = [name, desc, click_nums, fav_nums,add_time ]
    search_fields = [name, desc, click_nums, fav_nums]
    list_filter = [name, desc, click_nums, fav_nums,city__name,address,add_time]


class TeacherAdmin(object):
    ‘‘‘老师‘‘‘
    
    list_display = [ name,org, work_years, work_company,add_time]
    search_fields = [org, name, work_years, work_company]
    list_filter = [org__name, name, work_years, work_company,click_nums, fav_nums, add_time]


xadmin.site.register(CityDict, CityDictAdmin)
xadmin.site.register(CourseOrg, CourseOrgAdmin)
xadmin.site.register(Teacher, TeacherAdmin)
adminx.py
技术分享图片
from django.apps import AppConfig


class OrganizationConfig(AppConfig):
    name = organization
    verbose_name = 机构
apps.py
技术分享图片
default_app_config = organization.apps.OrganizationConfig
__init__.py

 

④.users

技术分享图片
import xadmin

from .models import EmailVerifyRecord,Banner

from xadmin import views


# 创建xadmin的最基本管理器配置,并与view绑定
class BaseSetting(object):
    # 开启主题功能
    enable_themes = True
    use_bootswatch = True

# 全局修改,固定写法
class GlobalSettings(object):
    # 修改title
    site_title = NBA后台管理界面
    # 修改footer
    site_footer = 科比的公司
    # 收起菜单
    menu_style = accordion


#xadmin中这里是继承object,不再是继承admin
class EmailVerifyRecordAdmin(object):
    # 显示的列
    list_display = [code, email, send_type, send_time]
    # 搜索的字段
    search_fields = [code, email, send_type]
    # 过滤
    list_filter = [code, email, send_type, send_time]


class BannerAdmin(object):
    list_display = [title, image, url,index, add_time]
    search_fields = [title, image, url,index]
    list_filter = [title, image, url,index, add_time]


xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin)
xadmin.site.register(Banner,BannerAdmin)

# 将基本配置管理与view绑定
xadmin.site.register(views.BaseAdminView,BaseSetting)

# 将title和footer信息进行注册
xadmin.site.register(views.CommAdminView,GlobalSettings)
adminx.py
技术分享图片
from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = users
    verbose_name = 用户
apps.py
技术分享图片
default_app_config = users.apps.UsersConfig
__init__.py

 

⑤.urls.py配置

import xadmin

from django.urls import path

from django.views.generic import TemplateView

urlpatterns = [
    path(xadmin/, xadmin.site.urls),
    path(‘‘, TemplateView.as_view(template_name=index.html),name=index),
]

 

 此时的项目结构      # 其他一些前端,图片等文件可去GitHub下载

                  技术分享图片

在线教育平台 (一)

原文:https://www.cnblogs.com/JangNara/p/12996318.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!