分析完需求,这节来设计下技术方案。
技术栈
前端部分 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:
字段名 | 数据类型 | 描述 |
---|---|---|
id | INT | 用户ID |
username | VARCHAR(50) | 用户名 |
password | VARCHAR(50) | 密码 |
VARCHAR(50) | 邮箱 | |
create_time | DATETIME | 创建时间 |
update_time | DATETIME | 更新时间 |
考试表 exam:
字段名 | 数据类型 | 描述 |
---|---|---|
id | INT | 考试ID |
createUserId | INT | 创建者ID |
name | VARCHAR(50) | 考试名 |
isPublish | BOOLEAN | 是否发布 |
isDelete | BOOLEAN | 是否删除 |
content | TEXT | 试卷内容 JSON |
create_time | DATETIME | 创建时间 |
update_time | DATETIME | 更新时间 |
答卷表 answer:
字段名 | 数据类型 | 描述 |
---|---|---|
id | INT | 答卷ID |
answererId | INT | 答题人ID |
examId | INT | 答卷ID |
content | TEXT | 答卷JSON |
score | INT | 分数 |
create_time | DATETIME | 创建时间 |
update_time | DATETIME | 更新时间 |
然后划分下模块:
模块划分
首先是用户模块,实现登录、注册、修改密码的功能:
接口路径 | 请求方式 | 描述 |
---|---|---|
/user/login | POST | 用户登录 |
/user/register | POST | 用户注册 |
/user/update_password | POST | 用户修改密码 |
试卷模块:
接口路径 | 请求方式 | 描述 |
---|---|---|
/exam/add | POST | 创建考试 |
/exam/delete | DELETE | 删除考试 |
/exam/list | GET | 考试列表 |
/exam/save | POST | 保存试卷内容 |
/exam/publish | GET | 发布考试 |
答卷模块:
接口路径 | 请求方式 | 描述 |
---|---|---|
/answer/add | POST | 添加答卷 |
/answer/list | GET | 答卷列表 |
/answer/export | GET | 导出答卷列表为 excel |
分析模块:
接口路径 | 请求方式 | 描述 |
---|---|---|
/analyse/ranking | GET | 成绩排行榜 |
总结
这节我们设计了下技术方案。
技术栈:前端是 antd + react + vite,后端是 nest + prisma,数据库是 mysql + redis,对象存储用 minio,API 文档用 swagger 生成,部署用 docker compose + pm2,网关使用 nginx,注册中心配置中心用 nacos,消息队列用 rabbitmq。
划分了 4 个微服务:用户微服务、考试微服务、答卷微服务、分析微服务
之间通过 TCP 做同步通信,通过 RabbitMQ 做异步通信。
数据库表有 3 个:用户表 user、考试表 exam、答卷表 answer
模块有 4 个:用户模块、考试模块、答卷模块、分析模块
下节正式开始开发。