Nest全栈到失业(四):半小时图书管理系统-Book

可能是我写多了,这玩意太简单了

整题代码

创建实体

没什么说的,注意要有一个主键列即可

TypeScript 复制代码
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity('book')
export class Book {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  bookName: string;

  @Column()
  author: string;

  @Column()
  description: string;

  @Column()
  cover: string;

}

注入实体

我们需要在typeorm的配置哪里注入我们的实体

其实就是这里多一个book即可

entities: [User, Book], //注入那些实体

TypeScript 复制代码
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
import { User } from './user/entities/user.entity';
import { BookModule } from './book/book.module';
import { Book } from './book/entities/book.entity';

@Module({
  imports: [
    UserModule,
    TypeOrmModule.forRoot({
      type: 'mysql', //什么类型的数据库
      host: 'localhost', //端口ip
      port: 3306, //端口
      username: 'root', //用户名
      password: 'root', //密码
      database: 'book-end', //操作的数据库
      entities: [User, Book], //注入那些实体
      synchronize: true, //同步构建数据库,真实开发千万别开
      logging: true, //日志打印等级
    } as TypeOrmModuleOptions),
    BookModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {
}

注册实体

你在哪个模块里操作实体,你就需要在此模块注册一下实体

TypeScript 复制代码
import { Module } from '@nestjs/common';
import { BookService } from './book.service';
import { BookController } from './book.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Book } from './entities/book.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Book])],
  controllers: [BookController],
  providers: [BookService],
})
export class BookModule {
}

分发路由

下一步就是写一下我们需要那些接口了

TypeScript 复制代码
import { Controller, Get, Post, Body, Param, Delete, Put } from '@nestjs/common';
import { BookService } from './book.service';
import { CreateBookDto } from './dto/create-book.dto';
import { UpdateBookDto } from './dto/update-book.dto';

@Controller('book')
export class BookController {
  constructor(private readonly bookService: BookService) {
  }


  // 查询list
  @Get('list')
  findAll() {
    return this.bookService.findAll();
  }

  // 查id
  @Get(':id')
  findOne(@Param('id') id: string) {
    // return this.bookService.findOne(+id);
  }

  // 新增书记
  @Post('create')
  create(@Body() createBookDto: CreateBookDto) {
    return this.bookService.create(createBookDto);
  }

  // 更新书记
  @Put('update')
  update(@Body() updateBookDto: UpdateBookDto) {
    return this.bookService.update(updateBookDto);
  }

  @Delete('delete/:id')
  remove(@Param('id') id: string) {
    return this.bookService.remove(+id);
  }
}

预写dto

我们后续的创建什么的参数传递,需要使用到dto,所以先一下

友情提示,update的dto一定要重写,不然你使用查询的时候,他会说你的查询结果可能为空,然后你就无法更新数据了

TypeScript 复制代码
import { IsNotEmpty } from 'class-validator';


export class CreateBookDto {

  @IsNotEmpty({ message: '书名不能为空' })
  bookName: string;

  @IsNotEmpty({ message: '作者不能为空' })
  author: string;

  @IsNotEmpty({ message: '描述不能为空' })
  description: string;

  @IsNotEmpty({ message: '封面不能为空' })
  cover: string;

}
TypeScript 复制代码
import { IsNotEmpty } from "class-validator";

export class UpdateBookDto {
  @IsNotEmpty({ message: 'id 不能为空' })
  id: number;

  @IsNotEmpty({ message: '书名不能为空' })
  bookName: string;

  @IsNotEmpty({ message: '作者不能为空' })
  author: string;

  @IsNotEmpty({ message: '描述不能为空' })
  description: string;

  @IsNotEmpty({ message: '封面不能为空' })
  cover: string;
}

编写服务

实现对于书籍的CRUD

新增:新增之前,看看数据库里有没有,然后创建新的对象,然后写入数据库

删除:我们使用的是按照名字删除的,也是需要先查看数据库数据,再删除的

查询:我写了两个公共的查询,一个是查询书籍名字的,一个是查询书籍id的,用来在添加,删除,更新前进行是否存在的验证

更新:查询数据库中是否存在;,否则无法修改

TypeScript 复制代码
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { CreateBookDto } from './dto/create-book.dto';
import { UpdateBookDto } from './dto/update-book.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Book } from './entities/book.entity';
import { Repository } from 'typeorm';

@Injectable()
export class BookService {

  constructor(
    @InjectRepository(Book)
    private bookRepository: Repository<Book>,
  ) {
  }


  // 使用书名查看数据库
  async findBookByName(bookName: string) {

    const findBook = await this.bookRepository.findOne({
      where: {
        bookName: bookName,
      },
    });

    if (findBook) {
      throw new HttpException(`书籍已存在`, HttpStatus.CONFLICT);
    }

    return findBook;
  }


  // 使用id查询数据库
  async findById(id: number) {
    const findBook = await this.bookRepository.findOne({
      where: {
        id: id,
      },
    });

    if (!findBook) {
      throw new HttpException(`图书不存在`, HttpStatus.NOT_FOUND);
    }

    return findBook;
  }


  // 新增书籍
  async create(createBookDto: CreateBookDto) {

    await this.findBookByName(createBookDto.bookName);

    const book = new Book();
    book.bookName = createBookDto.bookName;
    book.author = createBookDto.author;
    book.description = createBookDto.description;
    book.cover = createBookDto.cover;

    await this.bookRepository.save(book);

    return {
      status: HttpStatus.CREATED,
      message: '创建成功',
      book,
    };
  }

  // 查询所有
  async findAll() {
    return this.bookRepository.find();
  }


  // 更新书记
  async update(updateBookDto: UpdateBookDto) {

    const findBook = await this.bookRepository.findOne({
        where: {
          bookName: updateBookDto.bookName,
        },
      },
    );

    if (findBook) {
      findBook.author = updateBookDto.author;
      findBook.description = updateBookDto.description;
      findBook.cover = updateBookDto.cover;
      return this.bookRepository.save(findBook);
    }
    throw new HttpException(`你要修改的书籍不存在`, HttpStatus.NOT_FOUND);

  }

  // 删除书记
  async remove(id: number) {
    const findBook = await this.findById(id);

    await this.bookRepository.remove(findBook);

    return {
      status: HttpStatus.OK,
      message: '删除成功',
    };


  }
}

文件上传

这里我们需要实现对于图书的图片文件的上传,明天更新一下,就可以写前端了

你看我们的项目很简单是嘛?

但是其实,我们的真实的后台管理的系统的话是很简单的,我们的增删查改基本都完成了,简单是因为你看到的数据量小,可能你学会了这个,后续我写完,你估计不到半小时一个了都,直接CV大师

给一个github的地址

GitHub - zhaoxinkun/nest-react-BookAdmin: 一个nest练手项目,down下来,直接npm i,然后npm run start:dev即可(前提是你安装了docker,创建了mysql的容器以及新建了数据库哦)

相关推荐
真实的菜4 分钟前
(22)大文件流式处理
java·开发语言
烛阴7 分钟前
为什么选择Day.js?比Moment.js更轻更快的日期处理神器
前端·javascript
XiaoLeisj13 分钟前
【JUC】深入解析 JUC 并发编程:单例模式、懒汉模式、饿汉模式、及懒汉模式线程安全问题解析和使用 volatile 解决内存可见性问题与指令重排序问题
javascript·安全·单例模式
moyu8421 分钟前
从 XMLHttpRequest 到 Fetch:AJAX 请求的演进与最佳实践
前端·javascript
fpcc32 分钟前
跟我学c++中级篇——动态库的资源处理
开发语言·c++
夜晚回家34 分钟前
「Java教案」Java程序的构成
java·开发语言
泽020235 分钟前
C++之string的模拟实现
开发语言·数据结构·c++·算法
划水小将军39 分钟前
睡眠分期 html
前端·javascript·html
门前云梦1 小时前
《java创世手记》---java基础篇(下)
开发语言·java学习
工业聚1 小时前
AI 时代的前端成长之路(2025版)
前端·人工智能