NestJS 搭建博客系统(八)— 项目优化

·  阅读 645
NestJS 搭建博客系统(八)— 项目优化

NestJS 搭建博客系统(八)— 项目优化

前言

! 本章内容并不详细,主要是记录一下前几章至今的可以优化的地方,然而效果并不理想,请酌情观看

前面我们已经做了比较多的基础工作了,而在实际项目中,这样的基础工作将会越来越少,而同时业务需求会越来越多,在这种背景下,项目的及时优化是非常重要的,它将决定我们在未来同一个需求的工作量的多少。

优化点

  • 常量管理
  • entity
  • dto 和 vo

常量管理

这也就是把各处散落的常量,我们统一收集到 config 目录管理,这里不多叙述

Entity 优化

通过已经编写的两个模块,发现其实每个数据模型都会有一些共同的东西,比如id,创建时间,更新时间,次数等等,这些都可以作为一个基类,其他 entity 继承自这里即可不用二次编写

创建通用 entity

// src/common/entity/common.entity.ts

import {
  Column, 
  PrimaryGeneratedColumn, 
  UpdateDateColumn,
  CreateDateColumn,
  VersionColumn,
} from 'typeorm';

export abstract class Common {
  // 主键id
  @PrimaryGeneratedColumn()
  id: number;

  // 创建时间
  @CreateDateColumn()
  createTime: Date

  // 更新时间
  @UpdateDateColumn()
  updateTime: Date

  // 软删除
  @Column({
    default: false,
    select: false,
  })
  isDelete: boolean

  // 更新次数
  @VersionColumn({
    select: false
  })
  version: number
}
复制代码

改写 articleEntity 和 userEntity

// src/modules/article/entity/article.entity.ts

import { Common } from 'src/common/entity/common.entity';
import { 
  Entity, 
  Column, 
} from 'typeorm';

@Entity()
export class Article extends Common{
    // 文章标题
    @Column('text')
    title: string;

    // 文章描述
    @Column('text')
    description: string;

    // 文章内容
    @Column('text')
    content: string;
}
复制代码
// src/modules/user/entity/user.entity.ts

import { Common } from 'src/common/entity/common.entity';
import { 
  Entity, 
  Column,
} from 'typeorm';

@Entity()
export class User extends Common{
  // 昵称
  @Column('text')
  nickname: string;

  // 手机号
  @Column('text')
  mobile: string;

  // 加密后的密码
  @Column('text', { select: false })
  password: string;

  // 加密盐
  @Column('text', { select: false })
  salt: string;
}
复制代码

DTO 和 VO

在typeorm那章我们使用了 DTO 的概念,在 Swagger 那章我们又引入了 VO 的概念。

在 Spring 中,DTO 是 Data Transform Object,即数据传输对象,VO 是 View Object,即视图对象。

目前这里把 DTO 作为入参使用,而 VO 则作为返回值使用,但是经过两个模块发现,同一个模块的 DTO 和 VO 是非常相似的,不同的在于有些 DTO 接收的参数不一样,有些 VO 的返回值不一样,但字段基本和 entity 的一致。

回到 Spring 的概念,DTO 本身并不指定入参出参,所以,我们其实也可以把 VO 归为 DTO,但是如果直接把 VO 放到 DTO,我们就会更加懵逼,这个DTO是这么,那个DTO是什么,所以需要一种方法,使每个 DTO 和 entity 一致,并且每个模块只需要 1 个 DTO

关于 DTO 和 VO 的优化,这里改动有点大,同时发现嵌套数据并不是很好实现,会有一些bug,这里把 DTO 和 VO 改用了 swagger 插件的方式,详细可以看 nest-cli.json 这个文件。其实我本来就是想使用泛型的方式去服用和包装返回值才想做这一次改动,但是泛型并不可行,后来有转用了swagger 插件,依旧是不行,但是使用注释的方式还是比较友好的,相比于到处都是 ApiProperty 这种方式舒服了不少

参考

系列

分类:
前端
标签: