PureStudy:学科知识分享——我的网站开发全解

PureStudy:学科知识分享——我的网站开发全解

项目描述

PureStudy,学科知识分享网站css

学生可使用这个网站,来浏览相应学科的知识点、学习总结,获取相关的资料。此外,他们能够选择上传文件,保存和分享自身的学习笔记。html

总之,学生们可使用这个网站,来浏览所学学科的相应知识点和学习笔记,以获得加强学习成果的做用。前端

PureStudy将会有几个核心功能python

学科与章节的分类导航:学生们能够在网站找到正确的学科、章节和知识点。数据库

知识大纲与学习笔记的展现:学生们能够浏览静态的知识大纲和相应的学习笔记,获取学科的相应知识与要点。django

知识思惟导图的展现:学生们能够观看大幅的思惟导图,获取总体的知识脉络,了解学科的知识点之间的逻辑联系。后端

复习总结与考试总结:学生们能够观看前辈们的学科复习笔记与考试总结,来加强自身对于学科考试的准备。架构

主要页面:
框架

思惟导图:
ide


用户与需求概述

用户认知

此网站的主要用户群体,是对于诸多学科有明确学习需求的人群

其中大多数为学生,以大学生为主。由于学生们广泛有着明确的考试需求,须要经过学科考试或者取得高分,所以会积极的去获取知识,提高自身的学习效果。

此网站就是为这些人群所服务的。网站所提供的主要功能,将致力于提高学生们对于知识点的掌握程度,连贯知识脉络,创建知识体系。

目标用户有着如下明确特色:

目标明确:有着肯定的目标和学习需求,不会由于一时而改变。

辅助学习:学生们广泛有着本身的学习知识来源,好比课堂、教科书,他们并不须要大而全、事无巨细的知识描述,由于他们在课堂或者教科书里已经见够这个了。他们须要的是,对知识点的掌握、对重点的把控、理解知识点之间的联系、创建知识体系。所以,网站的做用,主要是辅助他们学习,总结概括逻辑和知识点,帮助学生们获取更好的学习效果,而非代替课堂和教科书,成为学生们的一切知识来源。

用户群体集中且联系密切:学生们,以大学生为例,集中在大学校园里学习,平时生活、学习、交流的场所也较为集中,而且,同一个学校、专业、班级的学生们,广泛联系密切。这一点比社会上的职员们有过之而无不及。此外,学平生日里的交流和讨论,将会有很大一部分,涉及到学科、考试和学科知识。

所学知识点和学科体系重合程度大,变化较少:在大多数学校,同一个专业或相近专业,对于某一学科的学习要求与知识体系,大多重合程度高。大多只是考试范围、教科书版本的区别,对于同一知识点、同一学科、同一学科考题,多数区别不大,考试题型也较为相近。于是,四川的某一大学生,和上海的某一大学生,能够用同一套网站的学科知识分享,完成对同一学科的知识学习,阅读知识总结与思惟导图,并应对考试。于是,这些学科知识,对于这些用户们而言,具备通用性。此外,大多数学科,或者大学考试科目,相应变化较少。此点能够查阅不一样年份的考试试卷得知。某些少数学科,学科重点知识和考试重点,将会发生变化,这点暂不做重点讨论。

渴望创建单一学科以外的专业知识体系:这一点暂不是广泛用户的广泛特色,暂且只是做者我的的我的体会与大学总结。但我的以为它很重要,而且比较引人注目,因此列出来。大多数大学学生,对此有着实际的需求。以学分切割的各个课程,将各个专业的总体知识体系,切割得过于凌乱了,以致于不少学生难以创建总体专业和行业所需的知识体系。

用户需求

如下其实是产品实际上的需求分析。第一次迭代,将首先知足用户所须要的核心需求。

核心需求
学生们能够在网站上展现本身的复习笔记,和一些学习资料。
知识将会以学科、知识点的形式进行构建。
!!核心需求加一:夜间模式。(晚上看,忽然以为很亮。)

业务流程
用户经过学科、章节、知识点的分类和标签进行知识检索,查找到本身想要的内容
学生经过大纲模式进行简便、直接的阅读,能够在网页上进行清晰的阅读
学生们能够经过大而全的知识导图图片,进行整体的复习

额外内容
此外,学生们要能够经过客服邮件,发送本身的反馈,和送出想要给网站增添的内容
邮件将会由运营直接处理


功能简要解析

emmm,再贴一遍。

如下其实是产品实际上的需求分析。第一次迭代,将首先知足用户所须要的核心需求。

核心需求
学生们能够在网站上展现本身的复习笔记,和一些学习资料。
知识将会以学科、知识点的形式进行构建。
!!核心需求加一:夜间模式。(晚上看,忽然以为很亮。)

业务流程
用户经过学科、章节、知识点的分类和标签进行知识检索,查找到本身想要的内容
学生经过大纲模式进行简便、直接的阅读,能够在网页上进行清晰的阅读
学生们能够经过大而全的知识导图图片,进行整体的复习

额外内容
此外,学生们要能够经过客服邮件,发送本身的反馈,和送出想要给网站增添的内容
邮件将会由运营直接处理


使用情景

此网站将会主要有两种使用情景。

平日学习

学生们在平日里对学科知识进行学习。

考试复习

学生们在考试前的复习阶段,对学科知识进行学习。所以,主要以:“时间紧迫,快速创建知识体系,找到重点”,来考虑。


内部代码逻辑

接下来将会是实现部分

网站主要以python——Django框架的MVC架构,来进行搭建。

我将内部代码主要分为三类:数据类,前端类,逻辑类。

在整体逻辑上,主要是:构建数据库,构建数据与网页之间的内部逻辑,构建前端视图。

其实不麻烦。我也认可,这并非一个很复杂、很难的网站啦。好用就成。也只须要好用。

感兴趣的读者,能够观看Django官方中文文档: https://docs.djangoproject.com/zh-hans/3.0/ ,里面详细介绍了我所用到的技术和框架的逻辑。

数据类:

主要创建了五张表。最重要的是Chapter表,这里面将会存放网站的主要内容。其余的表都是为它而服务的。

前端类:

先写前端类。

以下图所见,前端主要分为四个部分:

主要用于学科导航的导航栏;

展现当前学科名,用于章节导航的右侧侧边栏;

展现主要学习笔记内容(大纲)的正文部分;

有利于学生构建知识体系,目前放置在最下方,以大图展现的学科知识思惟导图部分。

其中,下图为主要部分的前端,也就是用户最经常使用的页面。此外还有网站的首页、学科页面、制做人页面,这些都是用于网站的导航分类,便于用户找到本身须要的信息。这些页面都是基于同一套模板,页面类似,这里暂不作讨论。

前端主要使用了Bootsrtap技术。并未费太多功夫,感兴趣的观众,能够关注Bootstrap官方中文文档:https://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 %}
相关文章
相关标签/搜索