Vue+NestJS项目实操(图书管理后台)

一、项目搭建

前端基于vben进行二次开发

在Github下载vben框架,搜索vben即可

下载地址:https://github.com/vbenjs/vue-vben-admin

下载完成后,进行安装依赖,使用命令:

// 下载依赖
pnpm install// 运行项目
pnpm run dev

前端框架分析:

1、es module特性支持

2、

        

后端框架使用NestJS

 使用NestJS搭建后端框架

// 安装脚手架
npm i -g @nestjs/cli// 新建项目
nest new 项目名

 选择npm工具,搭建完成后可以直接运行,执行命令

npm run start:dev// 在源码的文件夹【src】->【main.ts】中可以看到监听3000端口。

 NestJS后端知识回顾:

// 控制器(XXX.controller.ts)
/*控制器负责处理传入的请求和向客户端返回响应控制器的目的是接收应用的特定请求,路由机制控制那个控制器接收那些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。为了创建一个基本的控制器,我们使用类和装饰器。装饰器将类和所需的元数据相关联,并使Nest能够创建路由映射(将请求绑定到相应的控制器)
*/// Providers
/*Providers是Nest的一个基本概念,许多基本的Nest类可能被视为provider-service,repository,factory,helper等等。他们可以通过constructor注入依赖关系,这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给Nest运行时系统。Providers只是一个用@Injectable()装饰器修饰的类。注入的对象,作为一个服务注入到controller使用@Injectable()修饰,表示可以被注入到controller之中
*///异常过滤器
/*内置的异常过滤器负责处理整个应用程序中所有抛出的异常。当捕获到未处理的异常时,最终用户将收到友好的响应。 
*/// Restful API规则
/*Get:获取数据Post:插入数据Put:更新数据Delete:删除数据常用Get、PostParam:restful API参数Query:url 参数(Get 参数)Body:Post 参数*/

二、业务分析

后端业务模块设计与拆分

// 使用脚手架创建模块
nest g module user
nest g controller user// 具体使用的模块主要有user、book、auth三个模块

新建数据库,两种使用数据库的方法:

1、使用小皮面板进行开发,可以参考另一篇文章:

PhpStudy下载安装使用学习_php小皮下载-CSDN博客

2、下载MySQL数据库,MySQL官网:

MySQL :: MySQL Downloads

数据库连接

使用MySQL数据库,连接使用TypeORM工具

// 安装TypeORM
npm install --save @nestjs/typeorm typeorm mysql2// 在全局的module中引入 TypeOrmModule ,即在【app.module.ts】中引入

具体代码如下:

// app.module.tsimport { Module } from '@nestjs/common';
// 引入TypeORM模块
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './module/user/user.module';
import { AuthModule } from './module/auth/auth.module';
import { BookModule } from './module/book/book.module';@Module({imports: [TypeOrmModule.forRoot({type: 'mysql',host: '127.0.0.1',port: 3306,username: 'root',password: '123456',database: 'book_nest',}),UserModule,AuthModule,BookModule,],controllers: [AppController],providers: [AppService],
})
export class AppModule {}

运行项目,不报错,说明项目已经运行成功,连接数据库成功

数据库实体创建(entity)

在module/user文件夹创建【user.entity.ts】,数据库与表要一一对应

// user.entity.ts// 进行数据库定义import { Entity, Column, Unique, PrimaryGeneratedColumn } from 'typeorm';// 数据映射关系绑定
@Entity('admin_user')
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;
}

在【user.module.ts】中引入TypeORM,进行实体关联

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
// 引入User实体
import { User } from './user.entity';
// 引入UserService
import { UserService } from './user.service';@Module({// 要引用的实体imports: [TypeOrmModule.forFeature([User])],controllers: [UserController],// 服务提供者providers: [UserService],
})
export class UserModule {}

新建module/user/user.service.ts,写服务代码

// 引入注入器
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user.entity';
import { Repository } from 'typeorm';@Injectable()
export class UserService {constructor(@InjectRepository(User)private readonly userRepository: Repository<User>,) {}// 查找findOne(id: number): Promise<User> {// 可以执行sql语句// return this.userRepository.query(`SELECT * FROM user WHERE id = ${id}`);return this.userRepository.findOneBy({ id });}// 新增// 删除// 更新
}

以user功能为例,写查找、新增、删除功能逻辑

// user.service.ts// 引入注入器
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user.entity';
import { DeleteResult, Repository } from 'typeorm';
import { CreateUserDto } from './create-user.dto';@Injectable()
export class UserService {constructor(@InjectRepository(User)private readonly userRepository: Repository<User>,) {}// 查找findOne(id: number): Promise<User> {// 可以执行sql语句// return this.userRepository.query(`SELECT * FROM user WHERE id = ${id}`);return this.userRepository.findOneBy({ id });}// 查询所有findAll(): Promise<User[]> {return this.userRepository.find();}// 新增create(createUserDto: CreateUserDto): Promise<User> {const user = new User();user.username = createUserDto.username;user.password = createUserDto.password;user.role = createUserDto.role;user.avatar = createUserDto.avatar;user.active = 1;return this.userRepository.save(user);}// 删除remove(id: number): Promise<DeleteResult> {return this.userRepository['delete'](id);}
}
// user.controller.tsimport {Body,Controller,Get,Param,ParseIntPipe,Post,Delete,
} from '@nestjs/common';
import { UserService } from './user.service';@Controller('user')
export class UserController {constructor(private readonly userService: UserService) {}@Get('id')getUser(@Param('id', ParseIntPipe) id: number) {return this.userService.findOne(id);}@Get()getAllUser() {return this.userService.findAll();}// 新增@Post()createUser(@Body() body) {return this.userService.create(body);}// 删除@Delete('id')remove(@Param('id', ParseIntPipe) id: number) {return this.userService.remove(id);}
}
// user.entity.ts// 进行数据库定义import { Entity, Column, Unique, PrimaryGeneratedColumn } from 'typeorm';// 数据映射关系绑定
@Entity('admin_user')
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;
}

写新增业务逻辑时,新建create-user.dto.ts,新建类模型 

// create-user.dto.tsexport class CreateUserDto {username: string;password: string;role: string;nickname: string;avatar: string;
}
// user.module.tsimport { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
// 引入User实体
import { User } from './user.entity';
// 引入UserService
import { UserService } from './user.service';@Module({// 要引用的实体imports: [TypeOrmModule.forFeature([User])],controllers: [UserController],// 服务提供者providers: [UserService],
})
export class UserModule {}

6-1

 

开发时的一些配置问题

解决代码报错

每次执行 git commit 时,lint-staged 会自动运行 ESLint 的 --fix 操作来修复暂存区中的文件

// 安装 husky 和 lint-staged
npm install husky lint-staged --save-dev// 在 package.json 文件中添加 lint-staged 配置
{"lint-staged": {"*.js": "eslint --fix","*.ts": "eslint --fix"}
}// 设置 husky 钩子
{"husky": {"pre-commit": "lint-staged"}
}

在 VS Code 中设置 ESLint 以在保存文件时自动修复代码的步骤

// 安装ESLint
npm install eslint --save-dev// 配置 package.json 
{"scripts": {"lint": "eslint . --fix","prettier": "prettier --write ."}
}// 在 VS Code 的 settings.json 文件中添加以下配置,以启用保存时的自动格式化
{"editor.codeActionsOnSave": {"source.fixAll.eslint": true},"eslint.autoFixOnSave": true,"eslint.alwaysShowStatus": true,"eslint.options": {"cache": false}
}//如果安装了 Prettier 或其他格式化工具,你可以在 settings.json 中配置 VS Code,使其在保存时运行
{"editor.defaultFormatter": "esbenp.prettier-vscode","editor.formatOnSave": true
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439090.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一练:地下城游戏

174. 地下城游戏 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔…

基于facefusion的换脸

FaceFusion是一个引人注目的开源项目&#xff0c;它专注于利用深度学习技术实现视频或图片中的面部替换。作为下一代换脸器和增强器&#xff0c;FaceFusion在人脸识别和合成技术方面取得了革命性的突破&#xff0c;为用户提供了前所未有的视觉体验。 安装 安装基础软件 安装…

数据链路层(以太网简介)

一.以太网数据帧结构&#xff1a; 目的地址&#xff0c;源地址&#xff0c;类型这三个被称为帧头&#xff0c;数据则被称为载荷&#xff0c;CRC则被称为帧尾&#xff08;校验和&#xff09; 二.数据帧结构分析 1.目的地址和源地址 i.地址解释 这两个地址指的是mac地址&#x…

国庆游玩计划安排

地点&#xff1a;上海前滩四方城 地点&#xff1a;船长酒吧 地点&#xff1a;上海&#x1f3db;️外滩华尔道夫

httpsok-v1.17.0-SSL通配符证书自动续签

&#x1f525;httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻…

HTML基础用法介绍一

VS code 如何快速生成HTML骨架注释是什么&#xff1f;为什么要写注释&#xff1f;注释的标签是什么&#xff1f;标题标签段落标签换行标签与水平线标签 (都是单标签&#xff09;文本格式化标签图片标签超链接标签音频标签视频标签 &#x1f698;正片开始 VS code 如何快速生成…

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

STM32+PWM+DMA驱动WS2812 —— 2024年9月24日

一、项目简介 采用STM32f103C8t6单片机&#xff0c;使用HAL库编写。项目中针对初学者驱动WS2812时会遇到的一些问题&#xff0c;给出了解决方案。 二、ws2812驱动原理 WS2812采用单线归零码的通讯方式&#xff0c;即利用高低电平的持续时间来确定0和1。这种通信方式优点是只需…

Vue 学习

vue 核心语法 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue 核心语法测试</title> </head><body&…

外包功能测试干了4年,技术退步太明显了。。。。。​

先说一下自己的情况&#xff0c;本科生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

信号用wire类型还是reg类型定义

wire类型就是一根线&#xff0c;线有两端&#xff0c;一端发生改变&#xff0c;经过线传递的信号当然也会发生改变&#xff0c;reg类型则不同&#xff0c;可以把reg类型理解为存储数据的寄存器&#xff0c;当满足一定条件时&#xff0c;数值才被激活发生改变。 那么&#xff0…

【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构&#xff08;用一个例子来阐明&#xff09;场景例子&#xff1a;核心点&#xff1a; 五、方法 &#xff08;架构各部分详解&#xff09;5.1 模型1. RAG-Sequence Model2. RAG-Toke…

【Conda】修复 Anaconda 安装并保留虚拟环境的详细指南

目录 流程图示1. 下载 Anaconda 安装程序2. 重命名现有的 Anaconda 安装目录Windows 操作系统Linux 操作系统 3. 运行新的 Anaconda 安装程序Windows 操作系统Linux 操作系统 4. 同步原环境使用 robocopy 命令&#xff08;Windows&#xff09;使用 rsync 命令&#xff08;Linux…

C++11新特性(基础)【2】

目录 1.范围for循环 2.智能指针 3.STL中一些变化 4.右值引用和移动语义 4.1 左值引用和右值引用 4.2 左值引用与右值引用比较 4.3 右值引用使用场景和意义 4.4 右值引用引用左值及其一些更深入的使用场景分析 4.5 完美转发 1.范围for循环 int main() {int array[10] { 1,2,3,4…

超声波清洗机哪个品牌的最好?爆款超声波清洗机测评大揭秘

面对超声波清洗机的选购疑虑&#xff0c;许多朋友或是担心其效用不实&#xff0c;落入消费陷阱&#xff0c;或是已经遭遇了不尽如人意的产品体验。对此&#xff0c;我分享的经验或许能为你指点迷津&#xff01;基于亲测超过二十几款市面上热门的超声波眼镜清洗机&#xff0c;我…

Rust 做桌面应用这么轻松?Pake 彻底改变你的开发方式

Rust 做桌面应用这么轻松&#xff1f;Pake 彻底改变你的开发方式 网页应用装不下了&#xff1f;别担心&#xff0c;Pake 用 Rust 帮你打包网页&#xff0c;快速搞定桌面应用。比起动不动就 100M 的 Electron 应用&#xff0c;它轻如鸿毛&#xff0c;功能却一点都不少&#xff0…

JavaScript 数组方法

数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始)&#xff0c;整个数组用方括号表示。两端的方括号是数组的标志。 var a["a","b","c"]; 除了在定义时赋值&#xff0c;数组也可以先定义后赋值。 var arr[];arr[1]"a"…

数据流和数据流处理技术

一数据流 首先明确数据流概念&#xff1a;数据流是连续不断生成的、快速变化的无界数据序列 数据流类型&#xff1a; 数据流大致可以分为四种类型 1.连续型数据流&#xff1a;不断地产生数据&#xff0c;数据稳定速度输入系统。 2.突发型数据流&#xff1a;在某特定时间或…

【通配符】粗浅学习

1 背景说明 首先要注意&#xff0c;通配符中的符号和正则表达式中的特殊符号具备不同的匹配意义&#xff0c;例如&#xff1a;*在正则表达式中表示里面是指匹配前面的子表达式0次或者多次&#xff0c;而在通配符领域则是表示代表0个到无穷个任意字符。 此外&#xff0c;要注意…

IDEA 配置 Git 详解

本文将介绍在IntelliJ IDEA 中如何配置Git 没有安装配置 Git 的可以参考我的这篇文章&#xff1a;安装配置 Git 一、操作环境及准备 1.win 10 2.已安装且配置了Git 3.有Gitee账户 4.安装了IntelliJ IDEA 2023.2.1 5.全程联网 二、配置步骤 2.1 配置git 1.采用全局设置&…