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

测试一下

相关推荐
m0_738120722 小时前
CTFshow系列——命令执行web38-40
前端·windows·安全·web安全
是小狐狸呀4 小时前
elementUI-表单-下拉框数据选中后,视图不更新
前端·javascript·elementui
四岁半儿6 小时前
常用css
前端·css
你的人类朋友7 小时前
说说git的变基
前端·git·后端
姑苏洛言7 小时前
网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
前端
阿杆7 小时前
玩转 Amazon ElastiCache 免费套餐:小白也能上手
后端
字节逆旅7 小时前
nvm 安装pnpm的异常解决
前端·npm
Jerry7 小时前
Compose 从 View 系统迁移
前端
阿杆7 小时前
无服务器每日自动推送 B 站热门视频
后端
GIS之路8 小时前
2025年 两院院士 增选有效候选人名单公布
前端