可能是我写多了,这玩意太简单了
整题代码
创建实体
没什么说的,注意要有一个主键列即可
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的容器以及新建了数据库哦)