个人全栈项目

135 阅读2分钟

01. 创建nest项目

npm i -g @nestjs/cli
nest new nest-admin
cd new nest-admin
npm run start

如下图所示,成功:
image.png

02. 创建vue项目(vue-element-plus-admin)

环境准备:nodejs>18.0.0、pnpm、git

# 全局安装 pnpm
npm i -g pnpm

# 验证
pnpm -v

# clone 代码
git clone https://gitee.com/kailong110120130/vue-element-plus-admin.git

# 安装依赖
pnpm i

pnpm run dev

运行成功,如下图:

image.png

03.创建并关联git

  1. 删除nestjsvue-element-plus-admin项目自带的git
  2. 创建码云gitee
  3. 本地git初始化:git init
git init
git remote add origin https://gitee.com/xxxxxxx.git
git status
git add .
git commit -m 'first'
git push -u origin "master"

相关git命令可以参考:git经验合集

04. nest连接mysql

mysql安装可以参考:Mysql安装参考链接: https://blog.csdn.net/rbx508780/article/details - 掘金

nest连接mysql可以参考nest官方文档:nest.nodejs.cn/techniques/…

npm install --save @nestjs/typeorm typeorm mysql2
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

05.nest g resource users 生成资源

很香,很方便,controller、service、entities等都自动生成好了
参考链接:增删改查生成器 | NestJS 中文网

06.nest中创建数据库实体entity

改写users.entity.ts

// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn, Unique } from 'typeorm';

@Entity('users')
export class User {
  @PrimaryGeneratedColumn()
  id: number;//主键,自增

  @Column()
  // @Unique(['username'])
  username: string;

  @Column()
  password: string;

  @Column()
  role: string;

  @Column()
  nickname: string;

  @Column()
  active: number;//是否启用

  @Column()
  avatar: string;//头像
}

在dbeaver中创建对应的数据库表及字段

image.png

07.改写service和controller

// users.service.ts
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './entities/user.entity'

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly usersRepository: Repository<User>
  ) { }

  create(createUserDto: CreateUserDto) {
    return 'This action adds a new user';
  }

  findAll() {
    return `This action returns all users`;
  }

  findOne(id: number) {
    return this.usersRepository.findOneBy({ id });
  }

  update(id: number, updateUserDto: UpdateUserDto) {
    return `This action updates a #${id} user`;
  }

  remove(id: number) {
    return `This action removes a #${id} user`;
  }
}
// users.contriller.ts
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }

  @Get()
  findAll() {
    return this.usersService.findAll();
  }

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

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
    return this.usersService.update(+id, updateUserDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.usersService.remove(+id);
  }
}
// app.modules.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersModule } from './users/users.module';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'vue-nest-admin',
      autoLoadEntities: true,// 自动加载实体
      synchronize: true,//不能用于生产环境
    }),
    UsersModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }

通过apifox或者postman测试,成功效果如下图:

image.png

08.完整的增、删、查

import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, DeleteResult } from 'typeorm';
import { User } from './entities/user.entity'

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly usersRepository: Repository<User>
  ) { }

  create(createUserDto: CreateUserDto): Promise<User> {
    const user = new User();
    user.username = createUserDto.username;
    user.password = createUserDto.password;
    user.role = createUserDto.role;
    user.nickname = createUserDto.nickname;
    user.avatar = createUserDto.avatar;
    user.active = 1;
    return this.usersRepository.save(user);;
  }

  findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }

  findOne(id: number): Promise<User> {
    return this.usersRepository.findOneBy({ id });
  }

  update(id: number, updateUserDto: UpdateUserDto) {
    return `This action updates a #${id} user`;
  }

  remove(id: number): Promise<DeleteResult> {
    return this.usersRepository.delete(id);
  }
}