Skip to content

RWLinno/student-course-choosing

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

student-course-choosing

学生选课系统 —— 一种高并发环境下的高可用选课解决方案

选题的背景和目标

背景: 由于选课时间集中, 在同一时间进入系统抢占有限的资源, 导致系统服务响应速度明显下降, 严重时甚至会造成服务器崩溃。这种问题在目前实行学分制的国内高校中普遍存在。当系统软件不具备高并发性时,就无法顺畅承接超大流量,当请求过多,系统就会直接崩溃。

**目标:**本系统致力于针对原有选课系统的缺点,利用高并发技术的方法论以及设计原则,结合业务本身进行架构设计,以应对系统面临的流量冲击。从网络、架构、数据库等多方面进行系统优化,从而降低系统的响应时间,提高系统吞吐量,为学生提供一个高可用的选课系统,以达到系统能够在高并发下平稳处理大流量且自身依然运行良好的目的,让学生不再受系统崩溃所困扰。

系统需求分析

  • 普通用户(学生)
    • 登录注销、查看全校课程、查看方案内课程以及推荐班选课,选课退课、查看选课退课日志
  • 普通管理员
    • 学院、系、专业、班级管理,学生管理、课程管理、通知管理、选课轮次管理、课程紧急设置
  • 超级管理员
    • 进行系统设置,查看系统日志,对普通管理员用户进行设置

具体功能分析

学生

登录注销

学生可以通过学号和密码登入系统,登录后会保持一天的登入状态,登录凭证过期后再进行操作则会重新跳转至登录页面。也可以通过注销功能退出当前用户的登录。

选课退课

学生可以对显示的课程进行选课,该操作会判断学生学分是否足够、课程是否冲突、是否已完成先修课程的学习以及课程容量充足等一系列条件。对于通识课程,如果当前处于第一轮次选课,则会允许选择人数超过课程容量,后台会在之后筛选。

查看全校课程

学生进入选课系统后可以查看与搜索全校开设的课程班。可以通过是否必修、是否通识课、课程学分等条件进行课程筛选,也可以进行课程搜索。同时会根据学生已选课程显示课程是否出现时间冲突。

选课日志查询

学生可以查看当前学期自己已经选择的课程。同时也可以查看当前学期的退选日志,退选日志包括自己退选和系统退选。

查看方案内课程

学生可以查看自己所在班级的方案内课程,以及当前学期的推荐班选课。学生同样可以通过各种条件进行筛选和搜索,方便查找目的课程。

管理员

选课轮次

新增选课轮次、查看选课轮次、删除选课轮次

班级管理

院系专业、班级和方案内课程的增删改查

课程管理

课程依赖、课程以及课程班的增删改查

紧急设置

新增课程仅开放给某个班级、年级

通知管理

发布点对点通知以及群体公告

超级管理员

查看系统日志

查看前台学生的操作日志以及后台管理员的操作日志,可以通过学号、管理员编号以及是否请求异常和请求时间进行筛选。

修改系统设置

新增和删除用户黑名单、设置IP地址拦截、修改用户每分钟的请求次数限制。

管理普通管理员

可以新增管理员和删除管理员,允许修改管理员的信息和将普通管理员提权为超级管理员。

系统设计

开发环境与技术选型
  • 前端
    • Vue3 + Vue-Router + Vuex
    • Node.js + JavaScript + ElementUI
    • Axios + WebSocket
  • 后端
    • CentOS 7 + Java17
    • Maven + SpringBoot + MySQL / ShardingJDBC + Redis + RabbitMQ
    • Docker + Nginx
项目框架

image-20231105101821353

image-20231105101825302

数据库逻辑结构设计

(实体及实体关系图请见文件夹图片)

image-20231105101852910

image-20231105101858072

实体间关系的分析

image-20231105101957625

系统框架优化

  • 基于DNS对WEB站点层进行水平扩展
  • 基于Nginx反向代理对WEB站点层进行水平扩展
  • 通过Nginx集群解决反向代理层高可用问题

Releases

No releases published

Packages

No packages published

Languages

  • Java 98.3%
  • HTML 1.2%
  • Lua 0.5%