Skip to content

分析完需求,这节来设计下技术方案。

技术栈

前端部分 React + Antd Design,脚手架用 create-vite:

后端服务是 Nest + Prisma,会拆分多个微服务,之间用 TCP 通信。

数据库是 mysql + redis,mysql 做持久化存储,redis 做缓存以及临时数据的存储。

用 minio 做 OSS 对象存储服务,存储上传的文件。

用 nacos 来做注册中心、配置中心,统一管理所有的配置、服务的地址注册。

rabbitmq 做消息队列,用于微服务之间的异步通信。

文档用 swagger 生成,部署用 docker compose。

微服务拆分

微服务的特点是可以独立开发、独立部署。

微服务之间通过 TCP 或者 gRPC 来做同步通信,通过消息队列来做异步通信。

我们之前分析出的四个模块,就可以拆分为 4 个微服务。

用户、考试、判卷、分析

每个微服务都暴露 HTTP 接口出去,之间可以通过 TCP 来进行同步调用。

并且也可以通过 RabbitMQ 来做异步通信。

比如判卷完之后需要更新成绩排行榜,这时候就没必要同步生成,用消息队列通知分析微服务做异步生成就行。

数据库设计

然后来设计下数据库表:

需要这三个表。

用户表存储用户信息。

考试表存储考试和试卷信息,关联着创建考试的用户,多对一关系。

答卷表存储用户的答卷,和考试表是多对一关系,和用户表也是多对一关系。

也就是说一个用户可以有多个答卷、一个考试可以有多个答卷,但一个答卷只能属于一个用户、一个考试。

详细设计如下:

用户表 user:

字段名数据类型描述
idINT用户ID
usernameVARCHAR(50)用户名
passwordVARCHAR(50)密码
emailVARCHAR(50)邮箱
create_timeDATETIME创建时间
update_timeDATETIME更新时间

考试表 exam:

字段名数据类型描述
idINT考试ID
createUserIdINT创建者ID
nameVARCHAR(50)考试名
isPublishBOOLEAN是否发布
isDeleteBOOLEAN是否删除
contentTEXT试卷内容 JSON
create_timeDATETIME创建时间
update_timeDATETIME更新时间

答卷表 answer:

字段名数据类型描述
idINT答卷ID
answererIdINT答题人ID
examIdINT答卷ID
contentTEXT答卷JSON
scoreINT分数
create_timeDATETIME创建时间
update_timeDATETIME更新时间

然后划分下模块:

模块划分

首先是用户模块,实现登录、注册、修改密码的功能:

接口路径请求方式描述
/user/loginPOST用户登录
/user/registerPOST用户注册
/user/update_passwordPOST用户修改密码

试卷模块:

接口路径请求方式描述
/exam/addPOST创建考试
/exam/deleteDELETE删除考试
/exam/listGET考试列表
/exam/savePOST保存试卷内容
/exam/publishGET发布考试

答卷模块:

接口路径请求方式描述
/answer/addPOST添加答卷
/answer/listGET答卷列表
/answer/exportGET导出答卷列表为 excel

分析模块:

接口路径请求方式描述
/analyse/rankingGET成绩排行榜

总结

这节我们设计了下技术方案。

技术栈:前端是 antd + react + vite,后端是 nest + prisma,数据库是 mysql + redis,对象存储用 minio,API 文档用 swagger 生成,部署用 docker compose + pm2,网关使用 nginx,注册中心配置中心用 nacos,消息队列用 rabbitmq。

划分了 4 个微服务:用户微服务、考试微服务、答卷微服务、分析微服务

之间通过 TCP 做同步通信,通过 RabbitMQ 做异步通信。

数据库表有 3 个:用户表 user、考试表 exam、答卷表 answer

模块有 4 个:用户模块、考试模块、答卷模块、分析模块

下节正式开始开发。