SpringCloud微服务项目——在线OJ平台

这是一个在线的OJ答题平台,采用 B/S 架构,在用户层面分为 B端(管理员用户)和 C端(普通用户)。

管理员用户可以管理题目信息(包括对题目的增删改查)和竞赛信息(包括竞赛的增删改查和竞赛题目信息的管理),同时可以对用户进行管理(包括查看用户信息,拉黑非法用户,来限制用户行为等);

普通用户可以在该平台上管理个人信息,在线答题,判题,报名参加竞赛,竞赛结束后会收到排名消息,同时还可以进行竞赛练习,查看排名等操作。

本项目采用前后端分离架构,通过微服务进行模块划分,为用户提供了一个实用的在线OJ答题平台

一、项目技术栈及其环境

编程语言:后端:Java 17,前端 JavaScript

后端框架:SpringBoot,SpringCloud

前端框架:Vue3,Element UI

数据库:MySQL

持久层框架:Mybatis,Mybatis-Plus

缓存:Redis,ElasticSearch

消息队列:RabbitMQ

微服务组件:Nacos,Gateway,OpenFeign,loadbalance

定时任务:XXL-job

安全校验:JWT

测试工具:Apifox,Swagger,Fiddler

其他工具:lombok,阿里云短信服务,oss存储,Docker,Nginx

二、微服务划分

1. 网关服务(oj-gateway)

该服务用于统一的权限控制,以及统一的请求入口,动态路由转发;

在该服务中,通过实现 GlobalFilter 接口,实现自定义全局过滤器,对所有非白名单中的路径请求进行验证,通过 JWT 技术拦截非法请求,通过判断合法请求中的关键路径信息将请求转发至其他对应服务中进行下一步处理;

2. 后台管理端服务(oj-manage)

该服务是提供给管理员用户使用,用于管理OJ系统中各个模块(包括题目模块,竞赛模块和用户模块等)

该服务整体上分为四大功能模块:管理员用户模块,普通用户模块,题目模块和竞赛模块,分别对应四个 Controller,通过许多接口,实现了 OJ 系统的后台管理端的需求

3. 用户端服务(oj-user)

该服务是 OJ 系统中的核心服务,面向使用该 OJ 系统的所有用户

该服务所包括的功能有:用户注册,登录,退出登录,个人中心,我的竞赛,我的消息;题库列表,题目详情,竞赛列表,竞赛报名,竞赛练习,查看竞赛排名,提交代码,题目切换,获取代码执行结果等

4. 定时任务服务(oj-job)

该服务实现了需要定时处理的任务功能(例如,竞赛结果统计,发送消息等),配合其他服务完成OJ 系统的需求

5. 判题服务(oj-judge)

该服务实现了 OJ 系统中最重要的功能——判题功能,通过该服务对用户提交的代码进行执行并判断,并将执行结果返回给用户,完成 OJ 系统的核心需求

6. 公共服务(oj-common)

该服务是将其他服务所可能使用到的公共模块和代码进行封装,该服务下又分为多个子服务,以便其他服务引入所需模块时,降低耦合度,只引入需要的模块对应的子服务,而不是引入整个公共模块服务;

该服务下的子服务有:

1. oj-common-core:

该服务中定义了系统中所需要的常量信息,枚举类,并通过该服务对拦截器,统一异常处理,JWT令牌实现,阿里云短信服务,Mybatis-plus更新插入时自动填充,对Redis数据的处理等功能模块进行了统一的封装,这些功能模块对系统中的其他大部分服务来说都是要使用到的。

2. oj-common-elasticsearch:

该服务中对es进行了封装,用于系统中需要解决模糊搜索,复杂查询和全文检索的场景;

3. oj-common-file

该服务中使用oss存储技术,对文件操作进行了封装,用于系统中需要使用文件的场景,例如头像上传功能;

4. oj-common-swagger

该服务中对swagger接口文档进行了统一配置,系统中需要使用swagger的场景可以引入该服务

5. oj-rabbitmq

该服务中对RabbitMQ进行了统一的封装和配置,系统中需要使用消息队列的服务可以引入该服务

三、数据库设计

数据库使用 MySQL8.0,库名为 rht_oj,库中有 9 张表,其分别为

1. tb_sys_user:该表中的一条记录用于标识管理员用户信息

2. tb_question:该表中的一条记录用于标识OJ系统中一个题目所应包含的信息

3. tb_exam:该表中的一条记录用于标识OJ系统中一个竞赛所应包含的信息

4. tb_exam_question:该表中的一条记录用于标识系统中一个竞赛所对应的一个题目中所应包含的信息

5. tb_user:该表中的一条记录用于标识使用OJ系统中的一个用户

6. tb_user_exam:该表中的一条记录用于标识一个用户所参加的某个竞赛所应包含的信息

7. tb_user_submit:该表中的一条记录用于标识用户对某一个竞赛中的某个题目的提交情况

8. tb_message_text:该表中的一条记录对应系统中要发送给用户的消息内容

9. tb_message:该表中的一条记录对应某个用户所收到的一条消息

sql文件:oj.sql

四、部分功能系统实现

1. 网关服务(oj-gateway)

1)白名单(IgnoreWhiteProperties):从ncaos中读取白名单信息,白名单中的路径不会进行拦截认证

2)过滤器(AuthFilter):实现 GlobalFilter 接口,对所有非白名单中的路径请求进行验证,通过 JWT 令牌验证拦截非法请求,通过判断合法请求中的关键路径信息将请求转发至其他对应服务中进行下一步处理

流程图

2. 公共服务(oj-common)

1. 拦截器

1)TokenInterceptor:实现 HandlerInterceptor 接口,对请求进行拦截处理

2)WebMvcConfig:实现 WebMvcConfigurer 接口,配置可以跳过拦截器的请求

2. 统一异常处理

GlobalExceptionHandler:通过 @RestControllerAdvice 注解和 @ExceptionHandler 注解对全局的异常进行捕获并处理

3. Redis 配置

1)JsonRedisSerializer:用于与 Redis 数据库进行交互时,处理对象的序列化和反序列化

2)RedisConfig:为 Spring 应用中的 Redis 操作提供一个定制化的 RedisTemplate 实例

3)RedisService:用于操作 Redis 数据库,对原生 Redis 操作进行了封装

4. MyBatis-Plus 自动填充字段配置

MyMetaObjectHandler: MyBatis-Plus 提供的自动填充处理器,用于在数据库操作(插入和更新)时,自动填充一些字段

5. JWT令牌

1)JWTUtils:JWT工具类,用于生成和解析 JWT 令牌来进行用户身份验证

2)TokenService:JWT 登录认证服务,用于管理用户的 Token 和用户的 Redis 缓存

6. 阿里云短信服务

1)AliSmsConfig:为 Spring 应用创建阿里云短信服务 (Aliyun SMS) 的 Client 客户端实例

2)AliSmsService:阿里云短信发送服务类,用于通过阿里云 SMS(Short Message Service) 发送短信验证码

7. 线程本地变量管理

ThreadLocalUtils:线程本地变量管理工具类࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rcnhtin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值