0. 概述
本文主要针对学生选课系统这一工程实践项目,从设计模式、软件架构和各类视图角度分析了软件系统的特点,结合项目的接口API、数据库设计,基于上述分析,形成了该软件系统的概念原型[1]。
对于该项目的基础需求分析,可以参见上一文“从学生选课系统的设计中体会《从需求分析到软件设计》”。该系统可以为学生、教师和管理员三者提供选课、退课、成绩登记等功能[2]。
1. 系统架构
在系统架构方面,选课系统项目采用Web系统常用的MVC的模式开发,使用SpringMVC作为项目的主要架构。MVC模式是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),即MVC。下图给出了一个通用MVC的三层架构图。模型和视图有着业务层面的业务数据紧密耦合关系,控制器的核心工作就是业务逻辑处理。这种架构的最大特点就是用户界面容易随着需求的变更而改变,可以包容需求上的变化导致修改用户界面的程序而不变影响软件的核心功能代码。不难想到,鉴于MVC架构的特点,可以较为完善的解决我们的需求。
结合MVC和选课系统的业务特点,我们将系统的数据流通过的过程分为三层:视图层、应用层和数据层。视图层主要负责数据的展现;应用层主要负责业务逻辑处理;数据库层负责数据的读写以及数据的持久化。系统架构图、实现方案如下图所示。由SpringMVC+MyBatis为主要框架,前端采用bootsrap框架,后端使用mysql8.0配置主从复制实现读写分离[3]。
2. 接口API
该项目的接口较为众多且繁杂,这里以学生登录用例为例子说明在MVC架构下的系统的接口API设计。在MVC架构下,我们采取的设计模式为“中介者模式”,其接口的UML图如下所示:
在登录用例中,学生模型中封装了学生类这一数据结构,并对外提供了访问学生类信息的接口(get,set方法)。视图设定为登录视图,用于显示登录信息、按钮等相关信息,完成交互。将视图和模型联系起来的便是登录控制器,将从页面获得的账号密码信息在数据库中查询,完成核心的逻辑操作。
3. 系统视图
3.1 执行视图
执行视图如系统流图,可以较为明显的展现了系统运行时的时序结构特点,他可以最终分解到软件的基本元素和软件的基本结构,可以对系统整体的业务逻辑有较为直观的体现。下图给出了本项目的系统视图,从不同用户的登录用例开始,根据用户的需求,系统会根据用户的交互结果依次执行下去。
3.2 分解视图
分解视图通过划分软件系统为子系统、包、类、组件等不同的系统结构,可以体现出不同的抽象层级中软件模块的层次化结构。下图给出了本项目的分解视图:我们将选课系统划分为三个子系统,即登录子系统、选课子系统和信息子系统,对于这些子系统,又可以划分为若干类,如课程类、学生类、管理员类等。
3.3 泛化视图
泛化视图展现了软件模块之间的一般化或者具体化的关系,典型的例子就是类之间的继承关系。如下图所示了本项目的继承关系,学生、教师和管理员这三种用户类型都继承自基本用户,并通过课程进行相互联系。这种视图有利于我们了解系统的抽象层次结构,也有利于系统功能的扩展。
3.4 项目活动视图
活动是某件事情正在进行时的状态,它既可以是现实生活中正在进行的某一项工作,也可以是软件系统中正在运行的某个对象的一个操作。活动具体表现为一系列动作组成的视图,而活动图就可以用于描述用例内部的工作流程。下图给出了学生选课用例的活动视图,可以看到学生用户和管理员内部在该用例下的联系和工作方式。
3.5 部署视图
由SpringMVC+MyBatis为主要框架,mysql8.0配置主从复制实现读写分离,主机丛机分别为腾讯云的服务器,而项目部署在阿里云上。具体实现视图如下所示:
3.6 工作分配视图
工作分配视图可以清晰的展现出项目分工。工作分配视图有利于跟踪不同项目团队和成员的工作任务的进度,对于不同团队成员所擅长的地方进行合适的分工可以较大限度的提升团队的工作效率。下图给出了本项目的一个工作分配视图。
4. 数据库设计
4.1 学生表
数据名 |
数据类型 |
数据长度 |
能否NULL |
是否为主键 |
备注 |
student_id |
bigint |
16 |
N |
Y |
学生id |
account |
varchar |
20 |
N |
N |
账号 |
password |
varchar |
20 |
N |
N |
密码 |
name |
varchar |
20 |
N |
N |
姓名 |
college |
varchar |
20 |
N |
N |
所属学院 |
major |
varchar |
20 |
N |
N |
专业 |
phonenumber |
bigint |
16 |
Y |
N |
电话 |
|
varchar |
20 |
Y |
N |
邮箱地址 |
lesson |
set |
1000 |
Y |
N |
所选课程 |
4.2 教师表
数据名 |
数据类型 |
数据长度 |
能否NULL |
是否为主键 |
备注 |
Teacher_id |
bigint |
16 |
N |
Y |
教师id |
account |
varchar |
20 |
N |
N |
账号 |
password |
varchar |
20 |
N |
N |
密码 |
name |
varchar |
20 |
N |
N |
姓名 |
phonenumber |
bigint |
16 |
Y |
N |
电话 |
|
varchar |
20 |
Y |
N |
邮箱地址 |
college |
varchar |
20 |
Y |
N |
所属学院 |
lesson |
set |
1000 |
Y |
N |
教学课程 |
4,3 管理员表
数据名 |
数据类型 |
数据长度 |
能否为NULL |
是否为主键 |
备注 |
account_id |
bigint |
16 |
N |
Y |
管理员id |
account |
varchar |
20 |
N |
N |
账号 |
password |
varchar |
20 |
N |
N |
密码 |
name |
varchar |
20 |
N |
N |
姓名 |
jurisdiction |
int |
16 |
N |
N |
权限等级 |
phonenumber |
bigint |
16 |
Y |
N |
电话 |
|
varchar |
20 |
Y |
N |
邮箱地址 |
4.4 课程表
数据名 |
数据类型 |
数据长度 |
能否为NULL |
是否为主键 |
备注 |
lesson_id |
bigint |
16 |
N |
Y |
课程id |
lesson_time |
varchar |
20 |
N |
N |
课程时间 |
lesson_name |
varchar |
20 |
N |
N |
课程名 |
teacher_id |
bigint |
16 |
N |
N |
教师id |
credit |
bigint |
16 |
N |
N |
学分 |
5. 项目实现视图
实现视图是描述软件架构和源文件之间的映射关系,通常可以由软件的项目源文件的目录树呈现。
下图给出了本项目的实现视图。回顾本项目的系统架构为MVC架构,下面就此架构说明项目的实现视图。
模型部分由selc.sql文件和pojo文件下定义的类决定(如course、student、teacher类等),并在mapper文件夹中定义了这些类的访问接口。
视图部分由webapp文件夹决定,以webapp文件下的student为例,提供了各类交互方法,如退选课程、选择课程、修改个人信息等操作:
控制器部分,以handler文件为例,其中实现了将视图层和模型层联系起来的众多方法,如LoginHandler代码中,集成了教师、学生和管理员的登录和退出登录的操作,这些操作完成的时候,会将模型数据和页面显示结合起来,即实现了MVC架构的核心功能。
public class LoginHandler { @Autowired AdminService adminServiceImpl; @Autowired StudentService studentService; @Autowired TeacherService teacherService; //管理员登录 @RequestMapping("/adminlogin") public String loginStudent(@RequestParam("aname") String aname, @RequestParam("apassword") String apassword, Model model, HttpSession httpSession) { ... } // 管理员退出登录 @RequestMapping("/adminlogout") public ModelAndView adminLogout(HttpSession httpSession) { ... return new ModelAndView(new RedirectView("/StudentInfo/index.jsp")); } // 学生登录 @RequestMapping("/studentlogin") public ModelAndView loginStudent(@RequestParam("sid") String sid, @RequestParam("spassword") String spassword, Model model, HttpSession httpSession, HttpServletRequest httpRequest) { ... } // 学生退出登录 @RequestMapping("/studentlogout") public ModelAndView studentLogout(HttpSession httpSession) { ... return new ModelAndView(new RedirectView("/StudentInfo/index.jsp")); } // 教师登录 @RequestMapping("/teacherlogin") public ModelAndView loginTeacher(@RequestParam("tid") String tid, @RequestParam("tpassword") String tpassword, Model model, HttpSession httpSession) { ... } // 教师退出登录 @RequestMapping("/teacherlogout") public ModelAndView teacherLogout(HttpSession httpSession) { ... return new ModelAndView(new RedirectView("/StudentInfo/index.jsp")); } }
6. 系统运行环境
本项目的运行环境和技术选型如下表所示:由SpringMVC+MyBatis为主要框架,mysql8.0配置主从复制实现读写分离,主机丛机分别为腾讯云的服务器,而项目部署在阿里云上。前端主要由bootstrap完成,背景用particles.js插件。数据库交互查询用到pagehelper分页。
开发工具 |
Eclipse、navicat |
系统运行环境 |
JDK1.8、tomcat9.0、mysql8.0 |
前端工具 |
JavaScript、jQuery、bootstrap4、particles.js |
后端工具 |
maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybatis分页 |
7. 概念原型及工作机制
7.1 概念原型概念
概念是人对能代表某种事物或者发展过程的特点及其意义所形成的思维结论,而概念原型是一种虚拟化的、理想化的软件产品形式。我们可以得到这样的公式:概念原型=用例+数据模型。[5]
7.2 系统工作机制
概念原型需要结合具体的用例与数据模型去分析,就好像程序是由算法和数据结构两部分组成的。
学生用户输入学号和密码,登录系统,可以点击个人中心修改个人信息(登录密码、邮箱、出生年月、联系方式等);在选课允许的时间内,选择和退选课程,查看课表和成绩,这些都是业务操作的结果。在教师用例下,教师用户登录后,可以查看自己的课程安排,在期末的时候也能对学生的课程进行成绩评定。而对于管理员用例来说,具有最高的权限,统筹课程、用户和成绩的管理,对于这些信息进行全局的维护与增删改查,完成相关业务工作后,管理员即可退出系统。对于这些业务操作都是经过相应的操作器,完成后端数据模型和视图进行交互。
8. 总结
本文从系统架构为基础,从设计模式出发,从项目的各种视图角度分析了项目的层次角度和工作原理,结合数据库设计、API接口设计,得出了系统的概念原型和系统的工作机制。由于本人才疏学浅,项目也处于初级阶段,文章也可能存在诸多问题,还希望大家多多见谅,批评指正。
参考文献
[1] https://gitee.com/mengning997/se/tree/master/ppt,软件科学基础概论
[2] https://www.cnblogs.com/cszjc/p/14076994.html,从学生选课系统的设计中体会《从需求分析到软件设计》
[3]基于分布式缓存和消息中间件的选课系统设计与实现,陈鹏
[4] https://github.com/fuzui/StudentInfo, 基于SSM的学生信息管理系统(选课)
[5] https://gitee.com/mengning997/se/tree/master/ppt,从需求分析到软件设计