系统设计


# 系统设计

# 一、技术选型

本系统的项目后端基于 Spring Boot、Spring Cloud Alibaba 框架,数据库使用 MySQL,缓存中间件使用 Redis,数据操作框架使用 Mybatis-Plus,前端基于 Vue2 进行开发,使用 Ajax 与后端进行交互,做到真正的前后端分离开发,程序评测运行使用开源的Go-Judge 安全沙盒保证程序的高性能判题和系统的 安全防护。使用Docker 和 Docker-Compose 进行服务编排与部署,做到真正的一键化极易部署。

前端技术:

Tips

  • 技术以Vue2为主,element-ui为主要的UI框架
  • 支持手机端,响应式布局
  • 以CodeMirror作为在线代码编辑器
  • 以Mavon-Editor作为富文本编辑器
  • 以Vxe-Table作为表格组件

后端技术:

Tips

hoj-backend(数据服务)

  • 主体Web框架技术以SpringBoot为主
  • 以Nacos为分布式注册中心及分布式配置中心,支持配置文件动态刷新。
  • 以Mybatis-Plus为数据库中间件,负责数据实体类与数据库数据的转化与获取。
  • 以Shiro为安全框架,支持用户角色权限管理,支持token刷新
  • 以Redis作为数据缓存和使用list作为等待评测队列

评测端技术:

Tips

hoj-judgeserver(评测服务)

  • 主体Web框架技术以SpringBoot为主

  • 以Mybatis-Plus为数据库中间件,负责数据实体类与数据库数据的转化与获取。

  • 将服务注册到Nacos,以供hoj-backend进行调度,同时获取到Nacos上的配置

  • 本地评测:

    • 主流程:调用SandBox(Go-Judge)进行评测,将对应结果写回数据库
    • 功能:支持普通评测、特殊评测、交互评测、在线调试
  • 远程评测:

    • 提交流程:通过爬虫技术将代码提交到HDU、Codeforces、POJ等平台,获取提交id
    • 获取结果:根据提交id多次轮询获取最终的评测结果,将对应结果写回数据库

# 二、整体架构

Info

本系统是基于前后端分离、分布式架构搭建的,用户通过浏览器进行访问,请求发送到Nginx被代理转发到Vue项目生成的静态文件,Vue项目的后端数据请求则再次通过Nginx进行转发到后端业务服务,由后端业务服务查询MySQL数据、Redis缓存进行业务处理生成所需JSON数据返回给前端,由Vue进行渲染展示给用户。

此外,如果用户提交了评测请求,则业务服务将通过Nacos查询健康可用的评测服务实例,将请求发送给指定的评测服务,评测服务则将进行评测操作,调用安全沙盒,编译运行用户代码,跑各个评测点数据得出最终结果,写回数据库。整个系统各个服务都是在Ubuntu系统下基于Docker来搭建的,保证各个服务之间互不干扰。

系统架构图

# 三、功能介绍

模块 功能介绍
首页 展示网站轮播图、公告栏、近期比赛栏、最近7天做题排名栏
题目 提供展示题目列表页,可以根据题库、难度、标签等进行筛选查询,同时展示各个题目的做题情况;提供展示题目详情页,可以看到题目内容,在线编写代码,查看当前用户对于该题的历史提交记录
训练 提供展示训练列表页,可以根据权限、分类进行筛选查询,进入指定训练页,可以查看到训练的介绍、训练的题目单以及训练记录单
比赛 提供展示类型为ACM和OI的比赛列表页,可以根据类型与比赛状态进行筛选查询,同时展示比赛的标题、时间、时长、类型、参赛人数等信息;进入指定比赛,可以看到比赛题目、比赛提交列表、排行榜、比赛公告、评论,以及比赛管理员可以选择重新评测某个比赛题目、提供现场打印代码的功能
评测 用户可以看到所有的提交记录列表,可以通过状态、题目ID、提交者进行筛选过滤
排名 分为ACM排行榜和OI排行榜,分别根据对应ACM题目和OI题目提交情况对用户进行排名展示
讨论 提供讨论列表页,可以看到各个分类的讨论帖子,同时也可以发布用户自己的讨论;点击指定的讨论帖子,即可看到帖子详情,在下方可以对讨论进行评论以及回复他人的评论
团队 团队可以看做是一个独立的小HOJ,里面包含了现有HOJ的题目、训练、比赛、评测、讨论、公告、排名等功能,其中各个团队的数据与HOJ主站的数据已做了完全隔离,各个团队可以自定义属于自己的题目、比赛、训练等,其中目前支持团队中的题目申请公开到主题库
关于 介绍本网站的开发者和各个编程语言的编译介绍
个人信息与设置 用户拥有自己的个人主页,可以展示用户的学校、名称、个人简介、做题数和得分等信息;同时登陆状态可以在右上角进入个人设置,可以修改密码和邮箱,以及各种个人信息
登录与注册 用户可以通过点击导航栏右上角选择登录、注册、重置密码,即可完成对用户的鉴权
站内消息 提供消息自动查询,每两分钟更新最新消息来提示用户,进入消息中心,可以看到评论我的、回复我的、收到的赞、系统通知、我的消息等模块的消息
Last update: July 9, 2022 16:24
Contributors: Himit_ZH