NestJS实战-产品需求规划

694 阅读7分钟

NestJS实战-产品需求规划

本文介绍 NestJS 实战的产品需求规划,介绍前后端技术栈、对业务需求模块进行功能规划、系统环境详细搭建和数据库表结构简单设计。

供自己以后查漏补缺,也欢迎同道朋友交流学习。

引言

之前写了有关 NodeNestJS 相关知识点的文章,但有些模块介绍的比较空洞,想着再写一篇 Nest 实战,搭建下最最基础的 CMS 内容后台管理系统。一方面自己在写的过程中也能再复习一遍,另一方面也能分享给大家做简单的参考。

另外也给大家推荐一个企业级 Node 若依全栈管理系统nest-admin, 也推荐徐小夕大佬的博客基于nestjs实现的若依全栈管理系统

Node基础和NestJS基础

对于不太了解 NodeJSNestJS 的同学,请自行去官网看看;也可以看看我之前写的 NodeJS-基础学习NodeJS-NestJS基础

技术栈介绍

前端这边打算用我最了解的 react + antd design pro 一套,后端就是要介绍的 NestJs,数据库就最常用的 MySQL + TypeORM

  • 前端React@18 + TypeScript + ant design pro@6 + antd@5.13 + UMI@4
  • 后端NestJS + TypeScript + MySQL + TypeORM
  • 身份验证JWT

产品模块功能规划

产品规划这块儿,我之前是想用 墨刀figma 画个简单的原型 UI 图,发现用起来挺复杂的,后来我就直接撸了一个简单的前端页面(反正要写的)。具体模块功能分为:登录模块账号管理权限管理文章管理专栏管理

登录模块

登录我们做的简单点,只支持用户名和密码登录,做一些简单的校验,登录后获取用户信息和 token 存储。

登录成功后,跳转到欢迎页面,一般来说是工作台,但我们示例里没啥数据就算了。

UI图

login

welcome

账号管理

账号这块主要是增删改查导出这些功能(页面和接口层都做权限校验,账号页面仅管理员以上权限可见)。具体的有:

  • 列表查询:返回 list 数据
  • 查询导出/批量导出:以数据流形式下载 excel
  • 添加账号:添加账号、用户名、权限、密码
  • 修改账号:修改账号、用户名、权限
  • 重置密码:重置密码(仅限管理员可以重置,管理员的账号仅限系统管理员可以重置)
  • 修改密码:修改自己的登录密码(访客也可以进行修改)
  • 删除/批量删除:删除账号(仅限管理员可以删除,管理员的账号仅限系统管理员可以删除)

UI图

account-list

account-add

account-update

account-rest-password

account-update-password

权限管理

有账号自然就要做点权限控制,我们的设计如下:

  • 系统管理员systemAdmin 控制系统的一切
  • 管理员:除了不能删除修改 systemAdmin,目前其他操作都可以
  • 用户user 不能查看账号管理页面和操作,其他页面可以操作
  • 访客viewer 不能访问账号管理页面,其他页面也仅可以查看,不能增删改

文章管理

文章模块是我们的核心模块。具体的有:

  • 列表查询:查询文章列表,展示文章ID、名称、描述、创建时间、创建人、更新时间
  • 新建文章:新建文章
  • 编辑文章:编辑文章详情
  • 删除文章:删除某个 id 的文章
  • 发布文章:设置标题名、收录至专栏、编辑摘要

UI图

article-list

article-detail

article-list

专栏管理

专栏管理模块负责管理文章移到不同的专栏里:

  • 专栏列表查询:专栏列表查询,展示专栏的标题、收录文章数量、专栏描述、创建时间
  • 新建专栏:新建专栏,添加名称、简介
  • 修改专栏:修改专栏,修改名称、简介
  • 删除专栏:根据id删除专栏
  • 专栏详情:跳转到专栏详情,去管理某个专栏
  • 专栏详情-文章列表查询:某个专栏所有的文章列表,展示标题、更新时间、文章描述
  • 专栏详情-取消收录/批量取消收录:取消收录某个文章至该专栏
  • 收录至专栏-非该专栏文章列表查询:查询非某个专栏的文章
  • 收录至专栏-提交:收录至某个专栏。

UI图

column-list

column-add

column-update

column-function

column-detail

column-detail-add

column-detail-remove

系统环境搭建

请求响应加密封装

后端 NestJS 使用 crypto 来实现数据加解密,使用 RSA 非对称加密算法和 AES 的对称加密算法进行混合加密,RSA 公钥对 AES 密钥进行加密,AES 对数据进行加密。

同时前端对接口的请求方法进行封装,提供 urlparamsconfig 参数给到调用方。

身份验证

使用 @nestjs/jwtpassport-jwt@nestjs/passport创建 JWT 的身份验证服务,使用 AuthGuard 创建一个守卫保护路由。

异常处理

使用 @ControllerExceptionFilter() 装饰器创建一个全局异常过滤器,来捕获控制器中抛出的所有异常。

安全性

前后端都要做一些基础的安全性校验和拦截:

  • 数据验证:对输入的数据进行必要的格式、类型和长度校验,避免 SQL 注入、XSS 等攻击。
  • 防范跨站脚本攻击 (XSS):确保用户生成的内容在输出前进行转义处理,NestJS 内置的管道可以帮助自动转义输出。
  • 防止跨站请求伪造 (CSRF):使用 CSRF 保护模块,为每个请求生成唯一的令牌,并将其与用户会话关联。

API 文档

NestJS 中集成 Swagger 生成 API 文档,再使用 Apifox 导入 Swagger 文档,进行接口测试和文档管理。

单元测试

使用 Jest 作为测试框架,针对服务、控制器等组件进行单元测试,在 Apifox 中,创建测试用例来对接口进行测试,包括设置请求参数、预期结果和断言。也可以将多个接口请求组合成一个测试流程,模拟真实的业务逻辑。

服务监控

使用 nestjs-prometheus 来集成 Prometheus 监控系统,监控应用的各种指标,如 HTTP 请求时间、错误率、内存使用等。还可以使用 Grafana 来可视化 Prometheus 收集的指标数据,构建监控大盘,实现实时性能监控和报警机制。

日志记录

使用 nest-winston 集成 winston 来进行日志记录,并配置 winston 的传输方式,如控制台、文件、每日轮换文件等。

创建中间件来记录每个请求的信息,如请求方法、URL、IP 地址、状态码和响应时间。可以在请求结束时记录日志,并且可以根据响应状态码来决定日志级别。

数据库表结构设计

用户表 user

  • id (主键)
  • account (账号)
  • username (用户名)
  • passwordHash (密码哈希)
  • roleId (权限id 外键 关联role表)
  • roleType (权限类型 外键 关联role表)
  • roleWeight (权限重量 外键 关联role表)
  • roleName (权限名称 外键 关联role表)
  • createdBy (创建人id)
  • createdByAccount (创建人账号)
  • createdTime (创建时间)
  • updatedBy (更新人Id)
  • updatedByAccount (更新人账号)
  • updatedTime (更新时间)
  • isDeleted (是否删除 0未删除 1已删除)

角色权限表 role

  • id (主键)
  • type (类型)
  • name (名称)
  • weight (权重)

文章表 article

  • id (主键)
  • title (文章名称)
  • description (文章描述)
  • content (文章内容)
  • createdBy (创建人id 外键 关联user表)
  • createdByAccount (创建人id 外键 关联user表)
  • createdTime (创建时间)
  • updatedBy (更新人Id 关联user表)
  • updatedByAccount (更新人账号 关联user表)
  • updatedTime (更新时间)
  • isDeleted (是否删除 0未删除 1已删除)

专栏文章关联表 article-column-related

多对多,一篇文章可以收录至多个专栏,一个专栏也可以收录多个文章

  • id (主键)
  • articleId (文章id 外键 关联article表)
  • columnId (专栏id 外键 关联column表)
  • isDeleted (是否删除 0未删除 1已删除)

专栏表 special-column

  • id (主键)
  • title (专栏标题)
  • description (专栏描述)
  • createdBy (创建人id 外键 关联user表)
  • createdByAccount (创建人id 外键 关联user表)
  • createdTime (创建时间)
  • updatedBy (更新人Id 关联user表)
  • updatedByAccount (更新人账号 关联user表)
  • updatedTime (更新时间)
  • isDeleted (是否删除 0未删除 1已删除)

实战合集地址

仓库地址

参考文档