目录

一、简介
这个项目就是仿照leetcode做的一个阉割版项目,普通用户端提供参加竞赛(类似leetcode周赛),刷题,个人信息展示的功能,管理员端,提供用户管理,题库管理,竞赛管理三大功能。
码云链接:https://gitee.com/yj20040627/oj
使用到的技术主要有:
| 前端技术 | vue3, html, JavaScript , css , element plus |
| 服务架构 | Spring Cloud微服务架构 |
| 代理服务器 | Nginx |
| 分布式任务调度中心 | Xxl-Job |
| 注册与发现中心/配置中心 | Nacos |
| 服务间调用 | OpenFeign |
| 网关 | Spring Cloud Gateway |
| 数据存储 | MySQL |
| 数据库持久层 | MyBatis/MyBatis-Plus |
| 缓存 | Redis |
| 消息队列 | rabbitMQ |
| 搜索引擎 | ElasticSearch |
| 加密算法 | Bcrypt |
| 身份认证 | JWT |
| 代码沙箱 | Docker |
| 对象存储 | oss |
二、开发环境
idea2023专业版,JDK17,Spring Boot3+,SpringCloud,Node.js 18.3以上
三、需求分析
需求分类
- 业务需求:指反映企业或组织对系统的⽬标要求,通常来⾃与企业内部。
- ⽤⼾需求:描述软件系统的⽤⼾期望和需求,如⽤⼾界⾯、操作⽅式、数据展⽰等
- 系统需求:从系统⻆度来说明软件的需求,包括功能需求(系统必须实现的功能)、⾮功能需求(⽐如软件的质量,可维护性,效率等等)和设计约束(交付时的⼀些限制条件,⽐如必须采⽤国有⾃主知识产权的数据库,必须运⾏在某个操作系统下)等等。
| 需求种类 | 需求内容 |
|---|---|
| 业务需求 | 题⽬列表,刷题,竞赛的列表,竞赛⽤⼾排名,⽐赛,⾃动判题,题⽬管理,竞赛管理 |
| ⽤⼾需求 | 我的竞赛,我的消息,获取⽐赛结果,查看历史竞赛排名 |
| 系统需求 | ⽤⼾登录、注册,⽤⼾管理,安全防护(⾝份认证、防sql注⼊、防xss攻击),SEO优化 |

四、架构选型
我们使用 B/S 架构和微服务架构

五、微服务划分
按照业务划分:
| 服务名称 | 具体功能 |
|---|---|
| 后台数据管理 | 题库管理、竞赛管理、C端⽤⼾管理、定时任务管理 |
| ⽤⼾服务 | 登录、注册、退出登录、个⼈中⼼、我的竞赛、我的消息 |
| 题库竞赛服务 | 题库列表、竞赛列表、竞赛报名、查看排名、竞赛或者刷题时题⽬切换、提交代码、运⾏代码、获取代码执⾏结果 |
按照技术划分:
| 服务名称 | 具体功能 | 拆分原因(不包含原有服务) |
|---|---|---|
| ⽹关服务 | 统⼀的权限控制,统⼀的请求⼊⼝动态路由转发等 | 功能即原因 |
| 后台数据管理服务 | 题库管理、竞赛管理、C端⽤⼾管理 | |
| 定时任务服务 | 定时任务增删改查、定时任务功能实现 | 从技术的⻆度分析定时任务的执⾏可能需要和多个服务配合完成。并且定时任务的执⾏可能会周期性或⻓时间占⽤资源。那么我们可以将定时任务管理拆分出来。 |
| 登录注册服务 | 登录、注册 | 可能需要与第三⽅的认证服务进⾏交互,存在性能瓶颈 |
| ⽤⼾服务 | 退出登录、个⼈中⼼、我的竞赛、我的消息 | |
| 消息服务 | 发送消息,接收消息 | 消息种类较多,短信、站内信、邮件等等。和多个第三⽅组件交互 |
| 题库竞赛服务 | 题库列表、竞赛列表、竞赛报名、查看排名 | |
| 答题服务 | 竞赛或者刷题时题⽬切换、提交代码、获取代码执⾏结果 | 竞赛、刷题时⾼频使⽤功能。 |
| 判题服务 | 判题 | 判题逻辑可能⽐较复杂,不同类型的题⽬判题逻辑不⼀致,存在⼤量复杂计算。 |
| 代码沙箱服务 | 运⾏代码 | 与第三⽅组件进⾏交互,可能是性能瓶颈 |
按照实际情况划分:
按照技术划分:
| 服务名称 | 具体功能 | 合并原因 |
|---|---|---|
| ⽹关服务 | 统⼀的权限控制,统⼀的请求⼊⼝动态路由转发等 | |
| 后台数据管理服务 | 题库管理、竞赛管理、C端⽤⼾管理 | |
| 定时任务服务 | 定时任务增删改查、定时任务功能实现(竞赛结果统计、发送消息) | 消息发送仅实现系统消息,暂不是先实时通讯。掌握消息系统表结构设计、缓存设计等。 |
| ⽤⼾端服务 | 登录、注册、退出登录、个⼈中⼼、我的竞赛、我的消息,题库列表、竞赛列表、竞赛报名、查看排名、竞赛或者刷题时题⽬切换、提交代码、获取代码执⾏结果 | 登录注册不需要与第三⽅的认证服务进⾏交互。⾝份认证通过token性能可以保障。 |
| 判题+代码沙箱服务 | 判题、运⾏代码 | 题⽬只有编程题,并且仅⽀持Java编码。判题逻辑并不繁琐。性能瓶颈只是代码沙箱服务,我们需要借助docker |
最终服务架构:

六、技术选型
后端技术选型:项⽬选择springcloudAlibaba作为后端核⼼框架
前端技术选型:选择易于上⼿的Vue作为前端框架。编程语⾔采⽤JavaScript、Html。⻚⾯样式使⽤语法⽐css更简洁的scss