分析完需求,这节来设计下技术方案。
# 技术栈
前端部分 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 个:用户模块、考试模块、答卷模块、分析模块
下节正式开始开发。