PureStudy:學科知識分享——個人網站開發全解

PureStudy:學科知識分享——個人網站開發全解

項目描述

PureStudy,學科知識分享網站

學生可以使用這個網站,來瀏覽相應學科的知識點、學習總結,獲取相關的資料。此外,他們可以選擇上傳文件,保存和分享自身的學習筆記。

總之,學生們可以使用這個網站,來瀏覽所學學科的相應知識點和學習筆記,以得到增強學習成果的作用。

PureStudy將會有幾個核心功能

學科與章節的分類導航:學生們可以在網站找到正確的學科、章節和知識點。

知識大綱與學習筆記的展示:學生們可以瀏覽靜態的知識大綱和相應的學習筆記,獲取學科的相應知識與要點。

知識思維導圖的展示:學生們可以觀看大幅的思維導圖,獲取整體的知識脈絡,了解學科的知識點之間的邏輯聯繫。

複習總結與考試總結:學生們可以觀看前輩們的學科複習筆記與考試總結,來增強自身對於學科考試的準備。

主要頁面:

思維導圖:


用戶與需求概述

用戶認知

此網站的主要用戶群體,是對於諸多學科有明確學習需求的人群

其中大多數為學生,以大學生為主。因為學生們普遍有著明確的考試需求,需要通過學科考試或者取得高分,因此會積極的去獲取知識,提升自身的學習效果。

此網站就是為這些人群所服務的。網站所提供的主要功能,將致力於提升學生們對於知識點的掌握程度,連貫知識脈絡,建立知識體系。

目標用戶有著以下明確特點:

目標明確:有著確定的目標和學習需求,不會因為一時而改變。

輔助學習:學生們普遍有著自己的學習知識來源,比如課堂、教科書,他們並不需要大而全、事無巨細的知識描述,因為他們在課堂或者教科書里已經見夠這個了。他們需要的是,對知識點的掌握、對重點的把控、理解知識點之間的聯繫、建立知識體系。因此,網站的作用,主要是輔助他們學習,總結歸納邏輯和知識點,幫助學生們獲取更好的學習效果,而非代替課堂和教科書,成為學生們的一切知識來源。

用戶群體集中且聯繫密切:學生們,以大學生為例,集中在大學校園裡學習,平時生活、學習、交流的場所也較為集中,並且,同一個學校、專業、班級的學生們,普遍聯繫密切。這一點比社會上的職員們有過之而無不及。此外,學生平日里的交流和討論,將會有很大一部分,涉及到學科、考試和學科知識。

所學知識點和學科體系重合程度大,變化較少:在大多數學校,同一個專業或相近專業,對於某一學科的學習要求與知識體系,大多重合程度高。大多只是考試範圍、教科書版本的區別,對於同一知識點、同一學科、同一學科考題,多數區別不大,考試題型也較為相近。因而,四川的某一大學生,和上海的某一大學生,可以用同一套網站的學科知識分享,完成對同一學科的知識學習,閱讀知識總結與思維導圖,並應對考試。因而,這些學科知識,對於這些用戶們而言,具有通用性。此外,大多數學科,或者大學考試科目,相應變化較少。此點可以查閱不同年份的考試試卷得知。某些少數學科,學科重點知識和考試重點,將會發生變化,這點暫不作重點討論。

渴望建立單一學科之外的專業知識體系:這一點暫不是普遍用戶的普遍特點,暫且只是作者個人的個人體會與大學總結。但個人覺得它很重要,並且比較引人注目,所以列出來。大多數大學學生,對此有著實際的需求。以學分切割的各個課程,將各個專業的整體知識體系,切割得過於凌亂了,以至於很多學生難以建立整體專業和行業所需的知識體系。

用戶需求

以下實際上是產品實際上的需求分析。第一次迭代,將首先滿足用戶所需要的核心需求。

核心需求
學生們可以在網站上展示自己的複習筆記,和一些學習資料。
知識將會以學科、知識點的形式進行構建。
!!核心需求加一:夜間模式。(晚上看,突然覺得很亮。)

業務流程
用戶通過學科、章節、知識點的分類和標籤進行知識檢索,查找到自己想要的內容
學生通過大綱模式進行簡便、直接的閱讀,可以在網頁上進行清晰的閱讀
學生們可以通過大而全的知識導圖圖片,進行總體的複習

額外內容
此外,學生們要可以通過客服郵件,發送自己的回饋,和送出想要給網站增添的內容
郵件將會由運營直接處理


功能簡要解析

emmm,再貼一遍。

以下實際上是產品實際上的需求分析。第一次迭代,將首先滿足用戶所需要的核心需求。

核心需求
學生們可以在網站上展示自己的複習筆記,和一些學習資料。
知識將會以學科、知識點的形式進行構建。
!!核心需求加一:夜間模式。(晚上看,突然覺得很亮。)

業務流程
用戶通過學科、章節、知識點的分類和標籤進行知識檢索,查找到自己想要的內容
學生通過大綱模式進行簡便、直接的閱讀,可以在網頁上進行清晰的閱讀
學生們可以通過大而全的知識導圖圖片,進行總體的複習

額外內容
此外,學生們要可以通過客服郵件,發送自己的回饋,和送出想要給網站增添的內容
郵件將會由運營直接處理


使用情景

此網站將會主要有兩種使用情景。

平日學習

學生們在平日里對學科知識進行學習。

考試複習

學生們在考試前的複習階段,對學科知識進行學習。因此,主要以:「時間緊迫,快速建立知識體系,找到重點」,來考慮。


內部程式碼邏輯

接下來將會是實現部分

網站主要以python——Django框架的MVC架構,來進行搭建。

我將內部程式碼主要分為三類:數據類,前端類,邏輯類。

在總體邏輯上,主要是:構建資料庫,構建數據與網頁之間的內部邏輯,構建前端視圖。

其實不麻煩。我也承認,這並不是一個很複雜、很難的網站啦。好用就成。也只需要好用。

感興趣的讀者,可以觀看Django官方中文文檔: //docs.djangoproject.com/zh-hans/3.0/ ,裡面詳細介紹了我所用到的技術和框架的邏輯。

數據類:

主要建立了五張表。最重要的是Chapter表,這裡面將會存放網站的主要內容。其他的表都是為它而服務的。

前端類:

先寫前端類。

如下圖所見,前端主要分為四個部分:

主要用於學科導航的導航欄;

展示當前學科名,用於章節導航的右側側邊欄;

展示主要學習筆記內容(大綱)的正文部分;

有利於學生構建知識體系,目前放置在最下方,以大圖展示的學科知識思維導圖部分。

其中,下圖為主要部分的前端,也就是用戶最常用的頁面。此外還有網站的首頁、學科頁面、製作人頁面,這些都是用於網站的導航分類,便於用戶找到自己需要的資訊。這些頁面都是基於同一套模板,頁面相似,這裡暫不做討論。

前端主要使用了Bootsrtap技術。並未費太多功夫,感興趣的觀眾,可以關注Bootstrap官方中文文檔://v3.bootcss.com/css/。所用技術並不複雜,都是基礎的前端知識。

前端主要以 Django 的 base.html(模板)為主。以base.html創建模板,然後各個部分,比如首頁、章節、學科、章節等等,分別使用 {% block %}
{% endblock %} 的部分,放入自己的內容,組成相應的實際網站。

此外,參數以雙括弧,類似於{{ chapter.name }},{{chapter.img}}(chapter為對象變數名)的方式,進行傳遞。可以觀看下方的程式碼段。

並且,在章節列表等涉及到循環展示的地方,以下列方式進行:

 {% for chapter in chapter_list %}
 		<h5><a href="{% url 'chapter' chapter.id %}">{{ chapter.name }}</a></h5>
 {% endfor %}

主要頁面:

思維導圖:

邏輯類

邏輯類程式碼,這裡主要指的是前後端連接部分。

也就是將目標數據從資料庫取出來,分類處理,並傳遞到前端網頁。同時,收集前端的表單部分等,將之存儲入資料庫。

PureStudy的第一次迭代版本,邏輯類程式碼並不複雜,其主要程式碼如下:


def get_chapter(request, chapter_id):
    chapter = Chapter.objects.get(id = int(chapter_id))
    course = chapter.course
    chapter_list = Chapter.objects.filter(course = course)

    all_chapter = Chapter.objects.all()
        # 判斷chaper_id是否為1或者最後一個
    if chapter.id == 1:
        previous_id = 1
        next_id = 2
        previous_chapter = Chapter.objects.get(id = previous_id)
        next_chapter = Chapter.objects.get(id = next_id)
        previous_text = "當前頁是第一章"
        next_text = "下一篇:" + next_chapter.name

    elif chapter.id == len(all_chapter):
        previous_id = chapter.id-1
        next_id = chapter.id
        previous_chapter = Chapter.objects.get(id = previous_id)
        next_chapter = Chapter.objects.get(id = next_id)
        previous_text = "上一篇:" + previous_chapter.name
        next_text = "當前頁是最後一章"

    # 如果不,則取到平常狀態下的前一篇和後一篇的id
    else:
        previous_id = chapter.id - 1
        next_id = chapter.id + 1
        previous_chapter = Chapter.objects.get(id = previous_id)
        next_chapter = Chapter.objects.get(id = next_id)
        previous_text = "上一篇:" + previous_chapter.name
        next_text = "下一篇:" + next_chapter.name

    # 根據id取出前一篇和後一篇章節的數據
    # previous_chapter = Chapter.objects.get(id = previous_id)
    # next_chapter = Chapter.objects.get(id = next_id)

    return render(request, 'read/chapter.html',{
        'chapter':chapter,
        'chapter_list': chapter_list,
        'course': course,
        'previous_chapter': previous_chapter,
        'next_chapter': next_chapter,
        'previous_text': previous_text,
        'next_text': next_text,
        })

def get_course(request, course_id):
    course = Course.objects.get(id = int(course_id))
    chapter_list = Chapter.objects.filter(course = course)
    leibie = course.leibie
    relat_course_list = Course.objects.filter(leibie = leibie)
    return render(request, 'read/course.html',{
        'course':course,
        'chapter_list':chapter_list,
        'relat_course_list': relat_course_list
        })

關鍵程式碼解析

定義資料庫(models.py):

from django.db import models

# Create your models here.

class Course(models.Model):
    name = models.CharField(max_length = 40, verbose_name = '課程名')
    about = models.CharField(max_length = 1000, default='', blank=True,
        null=True, verbose_name='課程描述')
    leibie = models.CharField(max_length = 40, verbose_name='課程類別')

    def __str__(self):
        return self.name

class Maker(models.Model):
    name = models.CharField(max_length = 40, verbose_name = '製作者')
    school = models.CharField(max_length = 40, default='', blank=True,
        null=True, verbose_name='所屬學校')

    def __str__(self):
        return self.name

class Chapter(models.Model):
    name = models.CharField(max_length = 40, verbose_name = '章節名')
    about = models.CharField(max_length = 1000, default='', blank=True,
        null=True, verbose_name='章節描述')
    text = models.TextField(verbose_name='章節文本')
    link = models.TextField(default='', blank=True,
        null=True, verbose_name='章節鏈接')
    course = models.ForeignKey(Course, on_delete = models.CASCADE)
    maker = models.ForeignKey(Maker, on_delete = models.CASCADE)
    img = models.ImageField(upload_to='img', verbose_name='思維導圖')
    img_name = models.CharField(max_length = 40,  default='', blank=True,
        null=True, verbose_name='導圖名')

    def __str__(self):
        return self.name

class Img(models.Model):
    img = models.ImageField(upload_to='img', verbose_name='影像')
    name = models.CharField(max_length = 40,  default='', blank=True,
        null=True, verbose_name='影像名')
   

    def __str__(self):
        return self.name

邏輯處理(views.py):

from django.shortcuts import render
from read.models import Chapter, Course
# Create your views here.
def index(request):
    return render(request, 'read/index.html')

def read(request):
    return render(request, 'read/read.html')


def get_chapter(request, chapter_id):
    chapter = Chapter.objects.get(id = int(chapter_id))
    course = chapter.course
    chapter_list = Chapter.objects.filter(course = course)

    all_chapter = Chapter.objects.all()
        # 判斷chaper_id是否為1或者最後一個
    if chapter.id == 1:
        previous_id = 1
        next_id = 2
        previous_chapter = Chapter.objects.get(id = previous_id)
        next_chapter = Chapter.objects.get(id = next_id)
        previous_text = "當前頁是第一章"
        next_text = "下一篇:" + next_chapter.name

    elif chapter.id == len(all_chapter):
        previous_id = chapter.id-1
        next_id = chapter.id
        previous_chapter = Chapter.objects.get(id = previous_id)
        next_chapter = Chapter.objects.get(id = next_id)
        previous_text = "上一篇:" + previous_chapter.name
        next_text = "當前頁是最後一章"

    # 如果不,則取到平常狀態下的前一篇和後一篇的id
    else:
        previous_id = chapter.id - 1
        next_id = chapter.id + 1
        previous_chapter = Chapter.objects.get(id = previous_id)
        next_chapter = Chapter.objects.get(id = next_id)
        previous_text = "上一篇:" + previous_chapter.name
        next_text = "下一篇:" + next_chapter.name

    # 根據id取出前一篇和後一篇章節的數據
    # previous_chapter = Chapter.objects.get(id = previous_id)
    # next_chapter = Chapter.objects.get(id = next_id)

    return render(request, 'read/chapter.html',{
        'chapter':chapter,
        'chapter_list': chapter_list,
        'course': course,
        'previous_chapter': previous_chapter,
        'next_chapter': next_chapter,
        'previous_text': previous_text,
        'next_text': next_text,
        })

def get_course(request, course_id):
    course = Course.objects.get(id = int(course_id))
    chapter_list = Chapter.objects.filter(course = course)
    leibie = course.leibie
    relat_course_list = Course.objects.filter(leibie = leibie)
    return render(request, 'read/course.html',{
        'course':course,
        'chapter_list':chapter_list,
        'relat_course_list': relat_course_list
        })

chapter.html網頁程式碼:

{% extends 'read/base.html' %}

{% block title %}{{course.name}}{% endblock title %}
{% block page_header %}
    <h2>使用PureStudy,學習{{course.name}}
    </h2>
{% endblock page_header %}

{% block main %}
       <h2>{{course.name}}</h2>
       <p>{{course.about}}</p>
       <h3>課程章節</h3>
            
            {% for chapter in chapter_list %}
            <h5><a href="{% url 'chapter' chapter.id %}">{{ chapter.name }}</a></h5>
            {% endfor %}
{% endblock main %}

{% block side %}
       <h3>與之相關的課程:</h3>
       {% for relat_course in relat_course_list %}
       <h4><a href="{% url 'course' relat_course.id %}">{{ relat_course.name }}</a></h4>
       {% endfor %}
{% endblock side %}