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

测试一下

相关推荐
石金龙18 小时前
[译] Composition in CSS
前端·css
白水清风18 小时前
微前端学习记录(qiankun、wujie、micro-app)
前端·javascript·前端工程化
Ticnix18 小时前
函数封装实现Echarts多表渲染/叠加渲染
前端·echarts
用户221520442780018 小时前
new、原型和原型链浅析
前端·javascript
阿星做前端18 小时前
coze源码解读: space develop 页面
前端·javascript
叫我小窝吧18 小时前
Promise 的使用
前端·javascript
NBtab19 小时前
Vite + Vue3项目版本更新检查与页面自动刷新方案
前端
bobz96519 小时前
virtio vs vfio
后端
天天扭码19 小时前
来全面地review一下Flex布局(面试可用)
前端·css·面试
Rexi19 小时前
“Controller→Service→DAO”三层架构
后端