高考备考网络平台的设计方案
1 前言
本篇博客的任务是针对之前一篇博客分析的高考备考网络平台关于需求分析和概念原型的部分进行深化,同时结合课上课下所学到的软件工程中软件结构特点(包括了软件架构风格与策略等),并采用不同的视图来描述项目的软件系统概念原型。
设计模式是在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。软件开发要实现可维护、可扩展,就必须尽量复用代码,并且降低代码的耦合度,从一定程度上来讲,就是避免重复造轮子。软件设计从设计模式上来讲,它是从代码具体实现的粒度上来说的。
而软件架构则比较抽象了,粒度相对而言比较粗。比如说我们最熟悉的分层模式,这也是springboot最经典的模式,它包括了
- 表示层(也称为 UI 层)
- 应用层(也称为服务层)
- 业务逻辑层(也称为领域层)
- 数据访问层(也称为持久化层)
这四种层,每种层各司其职。某种意义上来讲,分层结构也因为每个层的独立作用而实现了代码的重用。
架构风格则是最高级别的粒度,它指定应用程序的层、高级模块,以及这些模块和层之间如何交互,以及它们之间的关系。
2 项目介绍
对于高考备考生来说,在传统的高考备考中,学生通过学校安排复习阶段,老师课堂授课和课外大量刷题的方式进行备考。他们想要获取高考相关的热点信息,一般通过学校、老师的通知获知,或者自己在网上进行查找。学生在学习中遇到问题,大多数情况是向老师或者同学请教,而在时间上往往是受限制的。
互联网不断发展的过程中,在线学习受到越来越多学生的青睐,而线上平台是在线学习不可缺少的一部分。如何在众多的学习平台和软件中获取自己想要的信息则显得十分重要。学生要查看最新的高考动态,需要到各大新闻网站或者教育网站进行查看,搜索信息便花费了大量的时间。想要知道往年学校的录取分数,需要实体的志愿填报指导书或者到网站上搜索,缺少对比。
因此,将高考备考辅导和网络学习结合起来,设计一个备考网络平台,为学生提供辅导帮助,可让学生了解到更多的高考动态,获取更多的学习资源,对学生和社会来说,具有现实价值和意义。所以我们做了这样一个高考备考网络平台。
3 系统架构和技术选型
本篇所分析的高考备考网络平台运用前后端分离和MVC模式的思想,开发了一个高考备考网络平台。主要完成了用户界面的设计、权限访问控制、对数据的操作和请求跨域以及云端对象存储空间的使用。实现了高考新闻查看、论坛交流、高校录取分数检索、各科模拟试题测试、慕课学习以及管理员后台等功能。该平台为备考生获取高考资讯、在线学习、在线交流以及在线测试提供了一个可行性方案。
MVC模式,根据业务流程,对数据的状态拆分为数据持久化、数据处理和数据展示,分为三个部分:Model(模型层),Controller(控制器)和View(视图层)。Model指MyBatis里的Mapper和Spring Boot里的entity,负责对数据的持久化,数据处理和数据访问。View指前端中各种页面的展示,在Vue作为前端框架进行的网页开发中,其管理和开发的各个页面充当这一部分。Controller是负责转发请求的中间层,将View层提交的请求与Model层进行匹配,接收来自视图层的表单输入,传输到模型层中,模型层对数据进行格式修改或操作,再将处理好的数据返回View,在Spring Boot中使用注释可以快速注册Controller。
MVC设计思想体现了系统逻辑处理与网站视图展示的分离,允许在不修改模型层和控制层等后端数据处理代码的情况下,想要达到改变数据展示的目的,仅需要对视图层代码的修改。同样,对模型层修改后,只要数据返回格式正确,视图层仍然能够正确地显示结果,大大降低了代码的耦合度且易于维护。

网站技术架构中,前端采用Vue框架进行页面开发和组件管理,后端使用Spring Boot框架实现视图层与模型层之间的数据传输和数据处理,持久层使用MyBatis框架搭建数据库的访问环境和操作数据,使用Oracle的MySQL数据库进行关系型数据管理,使用七牛云提供的对象存储空间进行文件存储。为了获取实时数据,使用了Java库中的HTML解析器中的Jsoup解析器进行爬取特定的高考资讯网站的热点新闻。
Vue用于构建网站系统界面,是一套前端综合框架。它只关心视图层,双向数据绑定是Vue的非常重要的一个特点,它的实现方法是通过使用的是一种数据劫持和观察者模式的方法来绑定数据。
Spring Boot在项目初始化的过程中,已经预先完成了大多数配置,除此之外还内置了习惯性配置,方便了开发者的配置需求,免去手动配置的工作,项目因此能够快速部署运行。其简化了maven 配置,仅通过Java Config和默认的习惯性配置,比如说@Controller来进行配置。
MyBatis是一个半自动化的持久层框架,选择它单纯是因为和springboot比较适配。
4 软件系统概念原型视图
4.1 分解视图
分解是构建软件架构模型的关键步骤,分解视图也是描述软件架构模型的关键视图,一般分解视图呈现为较为明晰的分解结构(breakdown structure)特点。分解视图用软件模块勾画出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。分解视图由子系统(Subsystem)、包(Package)、类(Class)、组件(Component)、库(Library)、软件模块(Module)、软件单元(Software unit)等部分组成。
1)功能性需求:
1.a) 考生:
- 注册和登录: 鉴权实现
- 修改个人信息:包括头像·、性别、隐私信息等
- 在线学习:包括做题练习和在线考试
- 查询信息: 目标高校录取政策和分数线、新闻和视频等
- 讨论区: 使用论坛进行学习上或生活上的讨论
1.b) 管理员:
- 用户管理: 用户信息的维护
- 信息更新: 使用各种方式更新数据和题目等
所以根据上述需求画出了用例图。

根据之前一篇博客的分析,高考备考平台包括了四个模块,分别是用户信息管理(学生登录、注册及管理员对账号管理)、在线学习(练习及考试)、查询信息和在线讨论。所以高考备考网络平台的分解视图如下:

4.2 依赖视图
依赖是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。在代码上主要表现为局部变量、方法的参数或者对静态方法的调用。依赖视图展现了软件模块之间的依赖关系。它对于我们的意义是:比如它能帮助我们找到没有依赖关系的软件模块或子系统,以便独立开发和测试,同时进一步根据依赖关系确定开发和测试软件模块的先后次序。比如它能有效帮助我们理清一个软件模块的变更对其他软件模块带来影响范围。

4.3 泛化视图
泛化视图展现了软件模块之间的一般化或具体化的关系,从中可以看出模块和模块、类与类之间的继承关系。
系统中人的角色有两个:学生和管理员。学生学习模块有一个,包括了在线学习、查询信息和在线讨论。学生信息管理模块有一个,包括了学生注册和学生登录、学生修改个人信息。用户鉴权模块包括了学生信息管理模块和管理员管理模块。



4.4 执行视图
执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行实体可以最终分解到软件的基本元素和软件的基本结构,因而与软件代码具有比较直接的映射关系。在设计与实现过程中,我们一般将执行视图转换为伪代码之后,再进一步转换为实现代码。
以用户注册、登录然后开始在线学习为例:

4.5 实现视图
实现视图是描述软件架构与源文件之间的映射关系。一般我们通过目录和源文件的命名来对应软件架构中的包、类等静态结构单元,这样典型的实现视图就可以由软件项目的源文件目录树来呈现。
我对于实现视图的理解是:一个软件具体模块、构造敲定之后,怎么去确定每个模块、每个类、每个函数放在哪里呢?这就涉及到类似于高类聚低耦合这样的代码设计方法,而它的结果,往往就是代码在编辑器“构造”栏中所显示的结构,即源文件代码数。实现视图与软件架构的静态结构之间映射关系越是对应的一致性高,越有利于软件的维护,因此实现视图是一种非常关键的架构视图。
所以实现视图可以用一层层代码分级来体现。

4.6 部署视图
部署视图是将执行实体和计算机资源建立映射关系。部署视图有助于设计人员分析一个设计的质量属性,比如软件处理网络高并发的能力、软件对处理器的计算需求等。
实际上,部署视图就是为了清晰地呈现进程间的网络通信和部署环境的网络结构特点而设立的,从上面可以直观看出它在哪里运行、是否用到数据库、是否是分布式的软件等等。

4.7 工作分配视图
所谓工作分配视图,就是将工作分配视图将系统分解成可独立完成的工作任务,以便分配给各项目团队和成员。工作分配视图有利于跟踪不同项目团队和成员的工作任务的进度,也有利于在个项目团队和成员之间合理地分配和调整项目资源,甚至在项目计划阶段工作分配视图对于进度规划、项目评估和经费预算都能起到有益的作用。
因为项目进行初期没有考虑到做这样的计划,所以工作分配视图从略。
5 数据库设计
所作数据建模如下:
(1)用户表:
用户表用于存储用户和管理员的个人信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
u_id |
int |
用户编号 |
否 |
是 |
|
type |
int |
用户类型 |
否 |
否 |
|
user_name |
varchar(20) |
用户名 |
否 |
否 |
|
pass_word |
varchar(20) |
密码 |
否 |
否 |
|
nick_name |
varchar(20) |
昵称 |
是 |
否 |
|
|
varchar(100) |
绑定邮箱 |
是 |
否 |
|
sign |
varchar(200) |
个人签名 |
是 |
否 |
|
avatar |
varchar(100) |
头像 |
是 |
否 |
(2)发言表:
发言表用于存储论坛模块中用户的发言信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
art_id |
int |
发言编号 |
否 |
是 |
|
au_id |
int |
作者编号,外键 |
否 |
否 |
|
content |
varchar(500) |
发言内容 |
是 |
否 |
|
com_counts |
int |
评论数 |
是 |
否 |
|
art_date |
varchar(30) |
发言日期 |
是 |
否 |
(3)评论表:
评论表用于存储与发言表相关联的评论,以用户表的用户编号,发言表的文章编号作为外键引用
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
com_id |
int |
评论编号 |
否 |
是 |
|
u_id |
int |
作者编号,外键 |
否 |
否 |
|
art_id |
int |
文章编号外键 |
否 |
否 |
|
com_date |
varchar(30) |
评论日期 |
是 |
否 |
|
com_content |
varchar(300) |
评论内容 |
是 |
否 |
(4)新闻表:
新闻表用于存储管理员上传的站内新闻信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
news_id |
int |
新闻编号 |
否 |
是 |
|
title |
varchar(100) |
新闻标题 |
是 |
否 |
|
content |
varchar(2000) |
新闻内容 |
是 |
否 |
|
date |
varchar(30) |
上传日期 |
是 |
否 |
(5)试卷表:
试卷表用于存储试卷的题目信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
paper_id |
int |
试卷编号 |
是 |
是 |
|
question_type |
int |
题目类型 |
是 |
是 |
|
question_id |
int |
题目编号 |
是 |
是 |
(6)考试表:
考试表用于存储考试的基本信息,以试卷编号作为外键获取试卷信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
exam_code |
int |
考试编号 |
是 |
是 |
|
description |
varchar(255) |
考试试卷标题 |
是 |
否 |
|
subject |
varchar(20) |
科目 |
是 |
否 |
|
paper_id |
int |
试卷编号,外键 |
是 |
否 |
|
exam_date |
vchar(10) |
组卷日期 |
是 |
否 |
|
total_time |
int |
考试时长 |
是 |
否 |
|
total_score |
int |
卷面总分 |
是 |
否 |
|
tips |
varchar(255) |
考试提醒 |
是 |
否 |
(7)填空题表:
填空题表用于存储填空题的基本信息,因为各个题型的存储信息不同,所以分成多个表进行存储
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
question_id |
int |
题目编号 |
否 |
是 |
|
subject |
varchar(10) |
科目 |
是 |
否 |
|
question |
varchar(500) |
问题 |
是 |
否 |
|
picture |
varchar(100) |
问题插图 |
是 |
否 |
|
answer |
varchar(255) |
正确答案 |
是 |
否 |
|
analysis |
varchar(255) |
答案解析 |
是 |
否 |
|
score |
int |
题目分值 |
是 |
否 |
|
level |
varchar(10) |
题目难度 |
是 |
否 |
(8)简答题表:
简答题表用于存储简答题的基本信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
question_id |
int |
题目编号 |
否 |
是 |
|
subject |
varchar(10) |
科目 |
是 |
否 |
|
question |
varchar(500) |
问题 |
是 |
否 |
|
picture |
varchar(100) |
问题插图 |
是 |
否 |
|
answer |
varchar(255) |
正确答案 |
是 |
否 |
|
analysis |
varchar(255) |
答案解析 |
是 |
否 |
|
score |
int |
题目分值 |
是 |
否 |
|
level |
varchar(10) |
题目难度 |
是 |
否 |
(9)选择题表:
选择题表用于存储选择题的基本信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
question_id |
int |
题目编号 |
否 |
是 |
|
subject |
varchar(10) |
科目 |
是 |
否 |
|
question |
varchar(255) |
问题 |
是 |
否 |
|
picture |
varchar(100) |
问题插图 |
是 |
否 |
|
choice_a |
varchar(255) |
选项a |
是 |
否 |
|
choice_b |
varchar(255) |
选项b |
是 |
否 |
|
choice_c |
varchar(255) |
选项c |
是 |
否 |
|
choice_d |
varchar(255) |
选项d |
是 |
否 |
|
answer |
varchar(4) |
正确答案 |
是 |
否 |
|
analysis |
varchar(255) |
答案解析 |
是 |
否 |
|
score |
int |
题目分值 |
是 |
否 |
|
level |
varchar(10) |
题目难度 |
是 |
否 |
(10)视频表:
视频表用于存储视频的基本信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
v_id |
int |
视频编号 |
是 |
是 |
|
subject |
varchar(5) |
科目 |
是 |
否 |
|
pic |
varchar(150) |
视频封面 |
是 |
否 |
|
title |
varchar(20) |
视频标题 |
是 |
否 |
|
inner_html |
varchar(300) |
视频链接 |
是 |
否 |
|
type |
varchar(10) |
视频类型 |
是 |
否 |
(11)学校表:
学校表用于存放高校的基本信息
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
uni_id |
int |
学校编号 |
是 |
是 |
|
uni_area |
varchar(15) |
学校省份 |
是 |
否 |
|
uni_name |
varchar(20) |
学校名称 |
是 |
否 |
(12)录取情况表:
录取情况表用于存放各高校的录取情况,以学校编号为外键引用
|
字段名 |
类型 |
说明 |
是否为空 |
关键字 |
|
line_id |
int |
录取编号 |
是 |
是 |
|
uni_id |
int |
学校编号,外键 |
是 |
否 |
|
stu_area |
varchar(15) |
学生所在省份 |
是 |
否 |
|
year |
int |
录取年份 |
是 |
否 |
|
low_line |
int |
录取最低分 |
是 |
否 |
|
height_line |
int |
录取最高分 |
是 |
否 |
|
stu_number |
int |
录取人数 |
是 |
否 |
|
wenli |
varchar(3) |
文理分科情况 |
是 |
否 |
6 总结
本篇博客主要是对于项目高考备考网络平台的软件架构、系统概念原型的分析和回顾。服务器端运行于linux服务器,客户端可以是任意设备的浏览器。软件概念原型视图数量较多,分为分解视图、依赖视图、泛化视图、执行视图、实现视图、部署视图、工作分配视图等,通过多方面多角度的信息来准确描述系统的构建特点。
系统概念原型一共有两个:学生和管理员。数据模型包括了第五节所述的12张表。工作流程为:用户首先登录,如果没有账号需要注册。登陆成功后,管理员可以管理学生用户;学生用户可以选择学生信息管理、在线学习、信息获取、在线讨论中的功能进行使用。

浙公网安备 33010602011771号