面试鸭是一款基于Next.js + Srpingboot + Redis + Mysql + Elasticsearch的面试刷题平台, 运用Druid + Hotkey + Sa-Token + Sentinel提高了系统的性能和安全性
- React框架
- Next.js服务端渲染 ⭐️
- Redux 状态管理 ⭐️
- Ant Design UI组件库
- 前端工程化: ESLint + Prettier + TypeScript ⭐️
- OpenAPI前端代码生成 ⭐️
- Java Spring Boot + Maven多模块构建
- Mysql数据库 + MyBatis-Plus框架 + MyBatis X
- Redis分布式缓存 + Caffeine本地缓存
- Redission分布式锁 + Bitmap + BloomFilter
- Elasticsearch搜索引擎 ⭐️
- Druid数据库连接池 + 并发编程 ⭐
- Sa-Token 权限控制️ ⭐️
- Hotkey 热点探测 ⭐️
- Sentinel 流量控制 ⭐️
- Nacos 配置中心 ⭐️
- 用户模块
-
- 用户注册
-
- 用户登陆
-
- 【管理员】 管理用户-增删改查
- 题库模块
-
- 查看题库列表
-
- 查看题库详情(展示题库下的题目)
-
- [管理员] 管理题库-增删改查
- 题目模块
-
- 题目搜索
-
- 查看题目详情
-
- [管理员] 管理题目 - 增删改查
- 题目批量管理 P1
-
- [管理员] 批量向题库中添加题目
-
- [管理员] 批量从题库中移除题目
-
- [管理员] 批量删除题目
- 分词题目搜索 P1
- 用户刷题记录日历图 P1
- 自动缓存热门题目 P2
- 网站流量控制和熔断 P2
- 动态IP黑白名单过滤 P2
- 同端登陆冲突检测 P2
- 分级题目反爬虫策略 P2
对应需求分析中, 我们有4张核心表。 库名: mianshiya
-- 用户表
create table if not exists user
(
id bigint auto_increment comment 'id' primary key,
userAccount varchar(256) not null comment '账号',
userPassword varchar(512) not null comment '密码',
unionId varchar(256) null comment '微信开放平台id',
mpOpenId varchar(256) null comment '公众号openId',
userName varchar(256) null comment '用户昵称',
userAvatar varchar(1024) null comment '用户头像',
userProfile varchar(512) null comment '用户简介',
userRole varchar(256) default 'user' not null comment '用户角色:user/admin/ban',
editTime datetime default CURRENT_TIMESTAMP not null comment '编辑时间',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_unionId (unionId)
) comment '用户' collate = utf8mb4_unicode_ci;
unionId, mpOpenId是为了实现公众号登陆的(扫码登陆), 每个微信用户在同一家公司(主体)的unionId是唯一的, 在同一个公众号下的mpOpenId是唯一的。
-- 题库表
create table if not exists question_bank
(
id bigint auto_increment comment 'id' primary key,
title varchar(256) null comment '标题',
description text null comment '描述',
picture varchar(2048) null comment '图片url',
userId bigint not null comment '创建用户 id',
editTime datetime default CURRENT_TIMESTAMP not null comment '编辑时间',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_title (title)
) comment '题库' collate = utf8mb4_unicode_ci;
text不是无限长度, 最长长度是65535个字符, 超过这个长度就会报错, 需要手动截断。如果text不够, 可以用
-- 题目表
create table if not exists question
(
id bigint auto_increment comment 'id' primary key,
title varchar(256) null comment '标题',
content text null comment '内容',
tags varchar(1024) null comment '标签列表(json 数组)',
answer text null comment '推荐答案',
userId bigint not null comment '创建用户 id',
editTime datetime default CURRENT_TIMESTAMP not null comment '编辑时间',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_title (title),
index idx_userId (userId)
) comment '题目' collate = utf8mb4_unicode_ci;
由于一个题库可以有多个题目, 一个题目可以属于多个题库, 所以需要一张关系表来存储题库和题目的关系。
-- 题库题目表(硬删除)
create table if not exists question_bank_question
(
id bigint auto_increment comment 'id' primary key,
questionBankId bigint not null comment '题库 id',
questionId bigint not null comment '题目 id',
userId bigint not null comment '创建用户 id',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
UNIQUE (questionBankId, questionId)
) comment '题库题目' collate = utf8mb4_unicode_ci;
由于关联表中的数据记录没有那么重要, 所以直接采用硬删除的方式, 如果题目被移出题库, 直接删掉对应的数据即可。
UNIQUE (questionBankId, questionId)
, 这里创建了唯一索引, 并指定了questionBankId在前, 是因为业务场景中 经常是根据题库查询下面所有的题目, 这样设计更容易满足mysql索引的最左匹配原则
mysql索引:
knife4j接口文档: http://localhost:8101/api/doc.html#/home
回滚修改的文件: git rollback
先完成几张核心数据表的增删改查功能, 先不包含任何复杂的业务逻辑
使用MyBatis X插件, 生成mapper和数据库实体类, 生成后移动到项目对应包下
选中需要生成代码的表, 使用MyBatis X - Generator 生成代码
mybatis plus 的注解官方文档说明: https://baomidou.com/reference/annotation
使用generator下的CodeGenerator类, 通过模版文件生成业务代码 修改根据模版文件生成的代码(请求dto, 响应vo等)
dto接收/传递数据, po和数据库实体对应, vo前端需要什么就返回什么
到此不结合业务流程的增删改查代码开发就完成了
分析核心业务流程需要的接口