1. 程式人生 > >Django+xadmin打造在線教育平臺(一)

Django+xadmin打造在線教育平臺(一)

inf lba user XA 放大 ons record min 後臺管理

Django+xadmin打造在線教育平臺(一)

代碼

github下載

一、前言

代碼下載:

開發環境:

    python: 3.6.4

    Django: 2.0.2

後臺管理:xadmin

1.1.項目介紹

系統概括:

  • 系統具有完整的用戶登錄註冊以及找回密碼功能,擁有完整個人中心。
  • 個人中心: 修改頭像,修改密碼,修改郵箱,可以看到我的課程以及我的收藏。可以刪除收藏,我的消息。
  • 導航欄: 公開課,授課講師,授課機構,全局搜索。
  • 點擊公開課–> 課程列表,排序-搜索。熱門課程推薦,課程的分頁。
  • 點擊課程–> 課程詳情頁中對課程進行收藏,取消收藏。富文本展示課程內容。
  • 點擊開始學習–> 課程的章節信息,課程的評論信息。課程資源的下載鏈接。
  • 點擊授課講師–>授課講師列表頁,對講師進行人氣排序以及分頁,右邊有講師排行榜。
  • 點擊講師的詳情頁面–> 對講師進行收藏和分享,以及講師的全部課程。
  • 導航欄: 授課機構有分頁,排序篩選功能。
  • 機構列表頁右側有快速提交我要學習的表單。
  • 點擊機構–> 左側:機構首頁,機構課程,機構介紹,機構講師。
  • 後臺管理系統可以切換主題。左側每一個功能都有列表顯示, 增刪改查,篩選功能。
  • 課程列表頁可以對不同字段進行排序。選擇多條記錄進行刪除操作。
  • 課程列表頁:過濾器->選擇字段範圍等,搜索,導出csv,xml,json。
  • 課程新增頁面上傳圖片,富文本的編輯。時間選擇,添加章節,添加課程資源。
  • 日誌記錄:記錄後臺人員的操作

技術分享圖片

技術分享圖片

1.2.創建工程

創建工程

python manage.py startproject MxOnline

然後開始項目的開發

二、models設計

項目的開發都是從models設計開始,後臺的管理和前端的渲染無非就是對數據庫的增刪改查,所以models設計的好壞對整個項目的開發起著至關重要的因素。

下面是我畫的圖,可以很直觀的看出來我們需要的models。

技術分享圖片

放大顯示:

技術分享圖片

技術分享圖片

創建四個app

技術分享圖片
python manage.py startapp users

python manage.py startapp course

python manage.py startapp organization

python manage.py startapp operation
技術分享圖片

然後分別設計每個app的models

2.1.users 用戶

自定義userProfile

系統自動生成的user表如下:

技術分享圖片

  • id: 主鍵, password 密碼, last_login Django自動記錄用戶最後登錄時間,。
  • is_superuser 表明用戶是否是超級用戶(後臺管理會用到)。
  • username 用戶名字段不要隨便改動, email 郵箱,
  • is_staff 表示是否是員工(後臺管理會用到)。
  • is_active 用戶是否是激活狀態, date_joined 註冊時間。
我們要擴展user表,添加需要的字段

個人中心頁面信息:

技術分享圖片

users/models.py添加代碼:

技術分享圖片
# users/models.py

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=5,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
技術分享圖片

然後做下面的一些設置

因為Image字段需要用到pillow所以需要安裝該庫

pip install pillow

註冊app

技術分享圖片
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘users‘
]
技術分享圖片

重載AUTH_USER_MODEL

AUTH_USER_MODEL = ‘users.UserProfile‘

設計數據庫為Mysql

技術分享圖片
# DATABASES = {
#     ‘default‘: {
#         ‘ENGINE‘: ‘django.db.backends.sqlite3‘,
#         ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
#     }
# }

DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘mxonline‘,        #數據庫名字
        ‘USER‘: ‘root‘,          #賬號
        ‘PASSWORD‘: ‘123456‘,      #密碼
        ‘HOST‘: ‘127.0.0.1‘,    #IP
        ‘PORT‘: ‘3306‘,                   #端口
    }
}
技術分享圖片

init.py裏面導入pymysql模塊

# user/__init__.py

import pymysql
pymysql.install_as_MySQLdb()

遷移數據庫

python manage.py makemigrations

python manage.py migrate

user中還需要添加的表(這些功能比較獨立):

  • EmailVerifyRecord - 郵箱驗證碼
  • Banner - 輪播圖

EmailVerifyRecord 驗證碼

代碼如下:

技術分享圖片
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
技術分享圖片

Banner 輪播圖

代碼如下:

技術分享圖片
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的三張表就創建完了

寫代碼要根據PEP8規範

技術分享圖片

每個class之間要空兩格

技術分享圖片

2.2.Course 課程

課程app中需要四張表

  • Course 課程表
  • Lesson 張傑信息
  • Video 視頻
  • CourseResource 課程資源

(1)Course 課程表

代碼如下:

技術分享圖片
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
技術分享圖片

(2)Lesson 章節信息表

代碼如下:

技術分享圖片
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)
技術分享圖片

(3)Video 視頻

代碼如下:

技術分享圖片
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
技術分享圖片

(4)CourseResourse 課程資源

技術分享圖片
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
技術分享圖片

2.3.organization 機構

總共三張表

  • CourseOrg 課程機構基本信息
  • Teacher 教師基本信息
  • CityDict 城市信息

(1)CourseOrg

代碼如下:

技術分享圖片
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
技術分享圖片

(2)CityDict

代碼如下:

技術分享圖片
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
技術分享圖片

(3)Teacher

代碼如下:

技術分享圖片
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)
技術分享圖片

2.4.operation

總共五張表

  • UseAsk 用戶咨詢
  • UserMessage 用戶消息表
  • CourseComments 用戶評論
  • UserCourse 用戶學習的課程
  • UserFavorite 用戶收藏

(1)UserAsk

代碼如下:

技術分享圖片
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
技術分享圖片

(2)UserMessage

user字段,默認0代表消息是發給所有用戶,而不是某個單獨的用戶;可以通過user.id發給特定用戶消息

技術分享圖片
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
技術分享圖片

(3)CourseComments

代碼如下:

技術分享圖片
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
技術分享圖片

(4)UserCourse

代碼如下:

技術分享圖片
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
技術分享圖片

(5)UserFavorite

代碼如下:

技術分享圖片
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
技術分享圖片

上面所有models的完整代碼如下:

技術分享圖片 users/models.py 技術分享圖片 course/models.py 技術分享圖片 operations/models.py 技術分享圖片 organization/models.py

創建完models後一定要把所有的apps添加到settings的“INSTALLED_APPS”裏面

技術分享圖片
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘users‘,
    ‘course‘,
    ‘organization‘,
    ‘operation‘,
]
技術分享圖片

遷移到數據庫

python manage.py makemigrations

python manage.py migrate

2.5.把四個app放到一個文件夾

創建package: apps

把之前的四個app全部剪切到apps包裏面

不要選“Search for references”

技術分享圖片

去掉searchfor的勾選。拖進去之後會報錯,說找不到那些import的模塊了。

解決方案:右鍵MarksourceRoot。根目錄下找不到的,會去apps下搜索。

但是這時候cmd下還是會報錯。需要在settings設置

插入第0是希望它先搜索我們app下東西:

import os
import sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,os.path.join(BASE_DIR,‘apps‘))

技術分享圖片

再運行就可以成功啟動了

技術分享圖片

此時的目錄

技術分享圖片

Django+xadmin打造在線教育平臺(一)