NestJS-公共模块优化

举报
林太白 发表于 2025/07/28 13:20:30 2025/07/28
【摘要】 NestJS-公共模块优化

NestJS-公共模块优化

👉优化接口前缀

之前我们采用的这种写法,但是每次更改的时候需要将全部的都进行更改,我们调整一下。调整以后修改也更方便

//调整之前
@Controller()
@Post('/system/dicttype')
@Get('/system/dicttype')


//调整以后
@Controller('/system/dicttype')
@Post()
@Get()

搜索优化

👉user.controller.ts添加传递参数name

async getAll(
    @Query('pageNum') pageNum = 1,  // 默认第1页
    @Query('pageSize') pageSize= 10, // 默认每页10条
    @Query('name') name?: string,  // 查询参数
  ) {
    return this.userService.getAll(pageNum, pageSize,name);
 }

👉单查询参数添加

user.service.ts之中添加条件
// 查询所有用户-User Service
  async getAll(pageNum: number = 1, pageSize: number = 10, search: string = ''): Promise<ResponseDto<User[]>> {
    // 设置分页的偏移量和限制
    // const skip = (pageNum - 1) * pageSize // 偏移量 (页码从 1 开始)

    // 构造查询条件
    const where: any = {};

    if (search) {
      where.name = Like(`%${search}%`);  // 根据名称模糊查询
    }
    // 使用 find 方法查询分页数据,skip 和 take 分别控制数据的偏移和返回数量
    const [users, total] = await this.userRepository.findAndCount({
      where, // 查询条件
      skip: (pageNum - 1) * pageSize, // 偏移量
      take: pageSize, // 每页返回的数据数量
    });

    const totalPages = Math.ceil(total / pageSize);
    // 调用userRepository的find方法,返回一个User数组
    const user = await this.userRepository.find();
    return {
      message: '查询成功!',
      code: 200,
      data: users, // 返回查询到的用户数据
      total: total,
    };
  }

👉多参数模式

多参数的时候我们可以使用剩余参数的写法把所有参数都传递过来进行查询

utils=>apimethods.ts 用来存放我们的接口封装的相关方法

import {Like} from 'typeorm';
// 动态添加查询条件
export const buildQueryParams=(queryParams: { [key: string]: any }) =>{
  const where: any = {};
  // 遍历查询条件,动态生成查询对象
  for (const [key, value] of Object.entries(queryParams)) {
    if (value !== undefined && value !== null && value != '') {
      // 如果值不为空,则根据字段生成查询条件
        console.log(key, value,'key-value');
        if (key === 'name') {
          where.name = Like(`%${value}%`);  // 根据名称模糊查询
        } else {
          where[key] = value;  // 对于其他字段,进行精确匹配
        }
    }
  }
  console.log(where,'where');
  return where;
}

👉在相关的方法之中使用

//查询方法
const where=await buildQueryParams(queryParams);

//查询添加
const [users, total] = await this.userRepository.findAndCount(
  {
    where,
    skip: (pageNum - 1) * pageSize, // 分页偏移量
    take: pageSize, // 每页返回的数据数量
  }
);

添加优化

接下来我们将添加的方法给拿出来,抽离成一个公共的方法提供给查询的时候通用使用

👉apimethods.ts

export const addApi = async (Repository, addParams: any) => {
  const data = await Repository.create({ ...addParams }); // 创建一个新用户
  const savedData = await Repository.save(data);
  // console.log(savedUser,'savedUser');
  if (savedData) {
    return {
      message: '添加成功!',
      code: 200,
    };
  } else {
    return {
      message: '添加失败!',
      code: 500,
    };
  }
}

👉chat.service.ts

在独立的模块之中进行使用

// 通用接口CRUD方法
import {addApi } from '@/utils/apimethods';

// 创建消息 : Promise<SysChat> 
async create(createChatDto: ChatDto){
  // 通用添加
  const resdata = await addApi(this.chatRepository, createChatDto);
  return resdata;
}

测试一下,拆分成功!

删除优化

之前我们的删除都写在了方法之中,接下来我们将删除改为真删和假删两种并且封装起来

方法还是抽离到我们utils=> apimethods.ts中

👉假删除

我们只需要更改一下isDeleted这个参数为true,并做一些数据库是否存在数据的校验即可

// 通用删除
// 删除消息(软删除)
export const deleteOneApi = async (Repository,queryParams: any) => {
  // console.log(queryParams, '软删除参数------------------------------');
  const findData = await Repository.findOneBy(queryParams);
  // console.log(findData, '软删除findData------------------------------');
  if (findData) {
    const delUpdateData = {...findData,isDeleted: true};
    const delData = await Repository.save(delUpdateData);
    if( delData) {
      return {
        code: 200,
        message: '删除成功',
      };
    }else {
      return {
        code: 200,
        message: '删除失败',
      };
    }
  } else {
    return {
      code: 401,
      message: '请检查数据状态!',
    };
  }
}

👉真删除

// 通用删除
// 真删除
export const delOneApiPermanent = async (Repository,queryParams: any) => {
  const findData = await Repository.findOneBy(queryParams);
  if (findData) {
    const delUpdateData = {...findData,isDeleted: true};
    const delData = await Repository.remove(delUpdateData);
    if( delData) {
      return {
        code: 200,
        message: '删除成功',
      };
    }else {
      return {
        code: 200,
        message: '删除失败',
      };
    }
  } else {
    return {
      code: 401,
      message: '请检查数据状态!',
    };
  }
}

👉使用

import {deleteOneApi,delOneApiPermanent} from '@/utils/apimethods';

//真删除
  async deleteOne(id) {
    const resdata = await delOneApiPermanent(this.menuRepository,{menuId:id});
    return resdata;
  }
//假删
 async deleteOne(id) {
    const resdata = await deleteOneApi(this.menuRepository,{menuId:id});
    return resdata;
  }

测试一下,接口ok

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。