PureStudy:学科知识分享——个人网站开发全解

项目描述

PureStudy,学科知识分享网站

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

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

PureStudy将会有几个核心功能

学科与章节的分类导航:学生们可以在网站找到正确的学科、章节和知识点。

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

知识思维导图的展示:学生们可以观看大幅的思维导图,获取整体的知识脉络,了解学科的知识点之间的逻辑联系。

复习总结与考试总结:学生们可以观看前辈们的学科复习笔记与考试总结,来增强自身对于学科考试的准备。

主要页面:

思维导图:


用户与需求概述

用户认知

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

其中大多数为学生,以大学生为主。因为学生们普遍有着明确的考试需求,需要通过学科考试或者取得高分,因此会积极的去获取知识,提升自身的学习效果。

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

目标用户有着以下明确特点:

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

辅助学习:学生们普遍有着自己的学习知识来源,比如课堂、教科书,他们并不需要大而全、事无巨细的知识描述,因为他们在课堂或者教科书里已经见够这个了。他们需要的是,对知识点的掌握、对重点的把控、理解知识点之间的联系、建立知识体系。因此,网站的作用,主要是辅助他们学习,总结归纳逻辑和知识点,帮助学生们获取更好的学习效果,而非代替课堂和教科书,成为学生们的一切知识来源。

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

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

渴望建立单一学科之外的专业知识体系:这一点暂不是普遍用户的普遍特点,暂且只是作者个人的个人体会与大学总结。但个人觉得它很重要,并且比较引人注目,所以列出来。大多数大学学生,对此有着实际的需求。以学分切割的各个课程,将各个专业的整体知识体系,切割得过于凌乱了,以至于很多学生难以建立整体专业和行业所需的知识体系。

用户需求

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

核心需求

学生们可以在网站上展示自己的复习笔记,和一些学习资料。

知识将会以学科、知识点的形式进行构建。

!!核心需求加一:夜间模式。(晚上看,突然觉得很亮。)

业务流程

用户通过学科、章节、知识点的分类和标签进行知识检索,查找到自己想要的内容

学生通过大纲模式进行简便、直接的阅读,可以在网页上进行清晰的阅读

学生们可以通过大而全的知识导图图片,进行总体的复习

额外内容

此外,学生们要可以通过客服邮件,发送自己的反馈,和送出想要给网站增添的内容

邮件将会由运营直接处理


功能简要解析

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 %}

PureStudy:学科知识分享——个人网站开发全解的更多相关文章

  1. Echarts数据可视化series-scatter散点图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  2. Echarts数据可视化series-radar雷达图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  3. Echarts数据可视化series-pie饼图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  4. Echarts数据可视化series-map地图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  5. Echarts数据可视化series-line线图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  6. Echarts数据可视化series-heatmap热力图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  7. Echarts数据可视化series-graph关系图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  8. Echarts数据可视化series-effectscatter特效散点图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  9. Echarts数据可视化radar雷达坐标系,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

随机推荐

  1. windows driver 简单的驱动和通信

    sysmain.c #pragma once #pragma warning(disable: 4100) #include <ntifs.h> #include <ntddk.h& ...

  2. vue v-io 父子组件双向绑定多个数据

    vue-io-directive 可以减少使用emit,组件自带的v-model好像也只能设置一个 安装 npm i vue-io-directive 使用 import Vue from 'vue' ...

  3. 翻译:《实用的Python编程》01_07_Functions

    目录 | 上一节 (1.6 文件) | 下一节 (2.0 处理数据) 1.7 函数 随着程序开始变大,我们会想要有条理地组织这些程序.本节简要介绍函数.库模块以及带有异常的错误处理. 自定义函数 对你 ...

  4. C++算法代码——Tuna

    这道题像个水题啊,可是在我做的这个OJ上就十几人做出来-- 题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=2084 题目描述 渔民抓住 ...

  5. git配置了公钥,在下载项目时为什么还要输入密码

    配置git地址:https://www.cnblogs.com/lz0925/p/10794616.html 原文链接:https://blog.csdn.net/xiaomengzi_16/arti ...

  6. Vue框架简介及简单使用

    目录 一.前端框架介绍 二.vue框架简介 三.vue使用初体验 1. vue如何在页面中引入 2. 插值表达式 3. 文本指令 4. 方法指令(事件指令) 5. 属性指令 四.js数据类型补充 1. ...

  7. Go的switch

    目录 go的switch 一.语法 二.默认情况 三.多表达式判断 四.无表达式 五.Fallthrough go的switch switch 是一个条件语句,用于多条件匹配,可以替换多个if els ...

  8. AWS Switching to an IAM role (AWS CLI)

    一,引言 今天额外分享一篇 AWS 的技术内容,需要在 EC2 切换到跨账号 IAM 角色(AWS CLI).假设我们使用两个 AWS 账户,A账号,B账号.我们希望允许 A 账号用于 "i ...

  9. CentOS7系统重置root密码

    https://blog.csdn.net/qq_42969074/article/details/88080821

  10. DatePicker 多时间粒度选择器组件

    使用方法: 在.vue文件引入 import ruiDatePicker from '@/components/rattenking-dtpicker/rattenking-dtpicker.vue' ...