Vue3 + Nest 实现博客管理系统 后端篇(五):标签页面接口增删改查

"本章节主要编写博客标签接口的增删改查,也为接下来编写博客的添加做铺垫,标签分为父标签和子标签"

创建标签模块

bash 复制代码
nest g res tag

同样我们选择REST API以及生成crud

添加标签实体

ts 复制代码
import { Base } from 'libs/Entities/base.entity';
import { Column, Entity, ManyToMany, ManyToOne } from 'typeorm';

@Entity('tag')
export class Tag extends Base {
  @Column({
    type: 'varchar',
    comment: '标签名称',
  })
  name: string;

  @ManyToOne((type) => Tag, (tag) => tag.superiors)
  superiorsid: Tag;

  @ManyToMany((type) => Tag, (tag) => tag.superiorsid)
  superiors: Tag[];

  @Column()
  grade: string;
}

重启之后可以看到数据库已经生成了tsg表

添加创建接口

ts 复制代码
  constructor(@InjectRepository(Tag) private tagRepository: Repository<Tag>) {}

  async create(createTagDto: CreateTagDto) {
    return await this.tagRepository.save(createTagDto);
  }

然后打开apifox进行接口测试。

OK,没有问题

标签查询接口

首先修改tag.controller.ts,添加入参

修改tag.service.ts,设置入参,以及分页

ts 复制代码
interface SearchType {
  // 搜索条件
  search: any;
  pageNo: number;
  pageSize: number;
}




Apiresult = new ApiresultService();
async findAll(body: SearchType) {
  const { pageNo, pageSize, search } = body;

  const condition: Record<string, any> = {}; // 用于设置模糊查询

  const skipCount = (pageNo - 1) * pageSize; // 分页查询,计算要跳过的条数

   if (search && search.name) {
     const { name } = search;
     condition.name = Like(`%${name}%`); // 模糊查询
   }
  condition.grade = 1; // 因为我们是只有二级,所以要过滤一下

  const [list, total] = await this.tagRepository
    .createQueryBuilder('entity') // 设置表别名
    .leftJoinAndSelect('entity.superiors', 'children')
    .where(condition) // 设置查询条件
    .skip(skipCount)
    .take(pageSize)
    .getManyAndCount();

  return {
    ...this.Apiresult.MESSAGE(200, '查询成功', list),
    total,
  };
}

我这里已经添加了几条数据,接下来使用apifox进行查询测试

分页查询没有问题,然后测试name条件查询

条件模糊查询没问题

标签修改和删除

ts 复制代码
  async update(body) {
    if (!body.id) return this.Apiresult.MESSAGE(500, '缺少id');
    const data = await this.tagRepository.update(body.id, body);
    console.log(data);
    if (data.affected > 0) {
      return this.Apiresult.MESSAGE(200, '修改成功');
    }
    return this.Apiresult.MESSAGE(500, '修改失败, 请检查入参');
  }

同理添加删除

ts 复制代码
  async remove(body) {
    if (!body.id) return this.Apiresult.MESSAGE(500, '缺少id');
    const data = await this.tagRepository.delete(body.id);

    if (data.affected > 0) {
      return this.Apiresult.MESSAGE(200, '删除成功');
    }
    return this.Apiresult.MESSAGE(500, '删除失败, 请检查入参');
  }

测试一下

相关推荐
GIS之路40 分钟前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide1 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程1 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
ssshooter1 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸2 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
蝎子莱莱爱打怪3 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
Live000003 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉3 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化