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, '删除失败, 请检查入参');
  }

测试一下

相关推荐
陈随易2 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
云-缩影3 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
考虑考虑4 小时前
Posrgresql恢复.backup文件
数据库·后端·postgresql
Csvn5 小时前
性能监控
前端
无奈何杨5 小时前
风控决策系统决策流,策略模式,权重、顺序、投票、最坏
后端
Csvn5 小时前
构建工具
前端
FRing035 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Patrick_Wilson6 小时前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言
苏三说技术6 小时前
DeepSeek Harness入驻B站,评论区被干成了大型插件集市!
后端
橙序员小站6 小时前
我一句话让 AI 把公众号工作台搭完了:部署实测记录
后端