nest.js关键笔记

  • Nest.js 介绍
    • 核心功能
    • 设计模式:IOC 控制反转 DI 依赖注入
    • 前置知识:装饰器
    • 前置知识装饰器-实现一个GET请求
  • Nestjs脚手架
    • Nestjs cli 常用命令
  • RESTful 风格设计
  • Nestjs 控制器
    • 控制器中常见的参数装饰器
  • Session 实例
  • Nestjs 提供者
    • **工厂模式**
    • 异步模式
  • Nestjs 模块
    • 共享模块
    • 全局模块
    • 动态模块

Nest.js 介绍

  • Nestjs 是一个用于构建高效可扩展的一个基于 Nodejs 服务端应用程序开发框架。完全支持 ts ,结合了 AOP 面向切面的编程方式
  • 官方文档1. 英文文档 Nestjs中文文档简介2.中文文档
  • 内置框架 Express(默认),nestjs维二内置框架 Fastify
    1️⃣ 能够快速构建服务端应用程序,且学习成本非常低,容易上手
    express 文档
    2️⃣ Fastify,快速并且低开销的 web 框架,专为 Node.js 平台量身打造
    高效的服务器意味着更低的基础设施成本、更好的负载响应能力和用户满意度。 在不牺牲安全验证和便捷开发的前提下,如何知道服务器正在处理尽可能多的请求,又如何有效地处理服务器资源?

Fastify 是一个 web 开发框架,其设计灵感来自 Hapi 和 Express,致力于以最少的开销和强大的插件结构提供最佳的开发体验。据我们所知,它是这个领域里速度最快的 web 框架之一。
在这里插入图片描述

核心功能

以下列出的是 Fastify 已经实现的主要功能及原理:

  • 高性能: 据我们所知,Fastify 是这一领域中最快的 web 框架之一,另外,取决于代码的复杂性,Fastify 最多可以处理每秒 3 万次的请求。
  • 可扩展: Fastify 通过其提供的钩子(hook)、插件和装饰器(decorator)提供完整的可扩展性。
  • 基于 Schema: 即使这不是强制性的,我们仍建议使用 JSON Schema 来做路由(route)验证及输出内容的序列化,Fastify 在内部将 schema 编译为高效的函数并执行。
  • 日志: 日志是非常重要且代价高昂的。我们选择了最好的日志记录程序来尽量消除这一成本,这就是 Pino!
  • 对开发人员友好: 框架的使用很友好,帮助开发人员处理日常工作,并且不牺牲性能和安全性。
  • 支持 TypeScript: 我们努力维护一个 TypeScript 类型声明文件,以便支持不断成长的 TypeScript 社区。

设计模式:IOC 控制反转 DI 依赖注入

⭐️控制反转(IOC)
控制反转是一种设计原则,目的是将对象的创建和依赖关系的管理从代码中分离出来,传统的编码方式是对象主动去获取它所需要的依赖,而控制反转则是由外部容器来管理对象的创建和依赖的注入
⭐️依赖注入(DI)
实现控制反转的一种具体方式,通过依赖注入,组件所需的依赖对象由外部提供,而不是组件自己创建。依赖注入可以通过构造函数注入,属性注入或者方法注入实现。

// 未使用控制反转和依赖注入的代码
class A {name: stringconstructor(name: string) {this.name = name}
}
class B {age:numberentity:Aconstructor (age:number) {this.age = age;this.entity = new A('小满')}
}const c = new B(18)
c.entity.name 

使用了 IOC 容器

class A {name: stringconstructor(name: string) {this.name = name}
}class C {name: stringconstructor(name: string) {this.name = name}
} 
//中间件用来收集依赖,用于解耦
class Container{modeuls:anyconstructor(){this.modeuls = {}}provide(key:string,modeuls:any){this.modeuls[key] = modeuls}get(key){return this.modeuls[key]}
}const modelus = new Container()
modelus.provide('a',new A('koillin'))
class B{a:anyc:anyconstructor(container:Container){this.a = container.get('a');this.b = container.get('b')}
}
new B(modelus)

前置知识:装饰器

装饰器是一种特殊的类型声明(一个函数),他可以附加在类,方法,属性,参数上面

  • 类装饰器:把构造函数传入到装饰器的第一个参数 target
function decotators(target:any){target.prototype.name = 'koillin'
}
@decotators
class Koillin{contructor(){}
}
const koi:any = new Koillin()
console.log(Koillin.name)//koillin
  • 属性装饰器:返回两个参数: 原型对象、属性的名称
const currency:PropertyDecorator = (target:any,key:string|symbol)=>{console.log(target,key)//{} name
}
class Koillin{@currencypublic name:stringconstructor(){this.name = ''}getName(){return this.name}
}
  • 参数装饰器:返回三个参数:原型对象、方法的名称、参数的位置(从0开始)
const currency = (target: any, key: string | symbol,index:number) => {console.log(target, key,index) // {} getName 1
}class Koillin{public name: stringconstructor() {this.name = ''}getName(name:string, @currency age:number) {return this.name}
}
  • 方法装饰器:返回三个参数:原型对象、方法的名称、属性描述符(可写对应writable,可枚举对应enumerable,可配置对应configurable)
const currency: MethodDecorator = (target: any, key: string | symbol, descriptor:any) => {// {} getName {//   value: [Function: getName],  value 即是对应的方法 getName//   writable: true,//可写对应//   enumerable: false,//可枚举//   configurable: true//可配置// }console.log(target, key, descriptor)
}class Koillin{public name: stringconstructor() {this.name = ''}@currencygetName(name:string,age:number) {return this.name}
}

前置知识装饰器-实现一个GET请求

安装依赖

npm install axios -S

定义控制器

class Controller {constructor() { }getList () { } 
}

定义装饰器
使用装饰器工厂,应为装饰器默认会塞入一些参数,定义descriptor的类型通过descriptor描述符里面的value,把axios的结果返回给当前使用装饰器的函数

const Get = (url:string):MethodDecorator =>{return (target,key,descriptor:PropertyDescriptor)=>{const fnc = descriptor.value;axios.get(url).then(res=>{fnc(res,{status:200})}).catch(e=>{fnc(e,{status:500})})}
}

完整代码

 import axios from 'axios'const Get = (url: string): MethodDecorator => {return (target, key, descriptor: PropertyDescriptor) => {const fnc = descriptor.value;axios.get(url).then(res => {fnc(res, {status: 200,})}).catch(e => {fnc(e, {status: 500,})})}
}//定义控制器
class Controller {constructor() {}@Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')getList (res: any, status: any) {console.log(res.data.result.list, status)}}

在这里插入图片描述

Nestjs脚手架

1️⃣ 通过 cli 创建 Nestjs 项目

npm i -g @nestjs/cli
nest new [项目名称]

2️⃣ 使用npm run start:dev启动,具备热更新,简单访问地址http://localhost:3000/

在这里插入图片描述

  1. dist文件夹是运行时就会打包生成的
  2. .spec.ts是测试用文件
  3. .controller.ts 是控制器,类似vue的 路由
    ⭐️ private readonly appService: AppService 这一行代码就是依赖注入不需要实例化,appService 内部会自己实例化
  4. .module.ts是模块文件,Nestjs使用模块打包特定功能,每个模块是高度封装的,只暴露必要的接口,它可以包含一些组件,如控制器、服务等
  5. .service.ts是现实业务逻辑文件,当然也可以放在控制器文件里面实现,但是拿出来是为了复用
  6. main.ts 入口文件主文件 类似于vue 的main.ts
    通过 NestFactory.create(AppModule) 创建一个app 就是类似于绑定一个根组件App.vue
    app.listen(3000); 监听一个端口
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';async function bootstrap() {const app = await NestFactory.create(AppModule);await app.listen(3000);
}
bootstrap();

Nestjs cli 常用命令

nest --help 查看Nestjs所以命令
在这里插入图片描述

// 生成 controller.ts
nest g co user 
// 生成 module.ts
nest g mo user 
// 生成 service.ts
nest g s user 
// 直接生成一个 CURD
nest g res user 

生成的文件结构如下

  • dto 文件是用来定义数据传输对象的,用于验证请求体中的数据或者控制返回的数据格式,例如:
export class CreateUserDto {name: string;desc: string;
}
  • entities 文件是后续连接数据库后用来表示数据库中的表的结构,例如:
import { Entity, Column,PrimaryGeneratedColumn, CreateDateColumn, Generated, ManyToOne } from 'typeorm';
import { User } from './user.entity';
@Entity()
export class Tags {@PrimaryGeneratedColumn()id: number;@Column()tags:string;@ManyToOne(()=>User,(user)=>user.tags)user:User;
}

在这里插入图片描述

RESTful 风格设计

RESTful 是一种软件架构风格、设计风格,也是一种开发规范,其核心是面向资源(Resource)进行设计

HTTP 方法(GET、POST、PUT、DELETE)作为通用接口方法,被用来对资源进行操作,可以表示对资源的增删改查。

例如一个用户资源的 CRUD 操作的 RESTful 设计可能是:

  1. 创建用户:POST /users
  2. 获取用户:GET /users/{id}
  3. 更新用户:PUT /users/{id}
  4. 删除用户:DELETE /users/{id}
    可以用一个接口完成对资源的crud,只是通过不同的请求方式来区分,生成user.controller.ts文件就是这样实现的。

传统接口
http://localhost:8080/api/get_list?id=1
http://localhost:8080/api/delete_list?id=1
http://localhost:8080/api/update_list?id=1
RESTful接口
http://localhost:8080/api/get_list/1 查询 删除 更新
通过不同请求方式来区分
查询GET
提交POST
更新PUT、PATCH
删除 DELETE

import { Controller, Get, Post, Body, Patch, Param, Delete, Query } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto'; 
@Controller('user')
export class UserController {constructor(private readonly userService: UserService) {}@Post('/add/tags')addTags (@Body() params:{tags:string[],userId:number}) {return this.userService.addTags(params)} @Post()create(@Body() createUserDto: CreateUserDto) {return this.userService.create(createUserDto);} @Get()findAll(@Query() query:{keyWord:string,page:number,pageSize:number}) {return this.userService.findAll(query);}  @Patch(':id')update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {return this.userService.update(+id, updateUserDto);} @Delete(':id')remove(@Param('id') id: string) {return this.userService.remove(+id);}
}

main.ts

 // 跨域app.use(cors());// 全局拦截器app.useGlobalInterceptors(new Response())// 全局异常处理app.useGlobalFilters(new HttpFilter())// 路由前缀app.setGlobalPrefix('api')// 验证数据app.useGlobalPipes(new ValidationPipe())// 路由守卫app.useGlobalGuards(new RoleGuard())// 版本
app.enableVersioning({type:VersioningType.URI})// 中间件app.use(MiddleWareAll)// session
app.use(session({secret:"koillin",rolling:true,name:"koillin.sid",cookie:{maxAge:null}}))// 静态资源app.useStaticAssets(join(__dirname, 'image'))

然后在user.controller 配置版本
Controller 变成一个对象 通过version 配置版本

import { Controller, Get, Post, Body, Patch, Param, Delete, Version } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';@Controller({path:"user",version:'1'
})
export class UserController {constructor(private readonly userService: UserService) {}@Post()create(@Body() createUserDto: CreateUserDto) {return this.userService.create(createUserDto);}@Get()// @Version('1')findAll() {return this.userService.findAll();}@Get(':id')findOne(@Param('id') id: string) {return this.userService.findOne(+id);}@Patch(':id')update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {return this.userService.update(+id, updateUserDto);}

在这里插入图片描述

Nestjs 控制器

在编程中,控制器是一种设计模式,通常在实现模型-视图-控制器(MVC)架构时使用

在Nestjs框架中,控制器只要负责接受特定路由的请求。根据请求就行处理,然后返回响应,主要表现时@Controller修饰的类
在这里插入图片描述

控制器中常见的参数装饰器

装饰器能力
@Request()req
@Response()res
@Nextnext
@Sessionreq.session
@Param(key?:string)req.params/req.params[key]
@Body(key?:string)req.body / req.body[key]
@Query(key?:string)req.query / req,query[key]
@Headers(name?:string)req.headers / req.headers[name]
HttpCode控制接口返回的状态码
import { Controller, Get, Post, Body, Patch, Param, Delete, Query } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';@Controller('user')
export class UserController {constructor(private readonly userService: UserService) {} @Post('/add/tags')addTags (@Body() params:{tags:string[],userId:number}) {return this.userService.addTags(params)} @Post()create(@Body() createUserDto: CreateUserDto) {return this.userService.create(createUserDto);} @Get()findAll(@Query() query:{keyWord:string,page:number,pageSize:number}) {return this.userService.findAll(query);} @Patch(':id')update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {return this.userService.update(+id, updateUserDto);} @Delete(':id')remove(@Param('id') id: string) {return this.userService.remove(+id);}
}

Session 实例

session 是服务器 为每个用户的浏览器创建的一个会话对象 这个session 会记录到 浏览器的 cookie 用来区分用户,使用的是nestjs 默认框架express 他也支持express 的插件所以我们就可以安装express的session

npm i express-session --save

需要智能提示可以装一个声明依赖

npm i @types/express-session -D

然后在main.ts 引入 通过app.use 注册session

import * as session from 'express-session'
app.use(session())

参数配置详解

secret生成服务端session签名 可以理解为加密
name生成客户端cookie的名字 默认connect.sld
cookie设置返回到前端key的属性,默认值为{path:“/”,httpOnly:true,secure:false.maxAge:null}
rolling在每次请求时强行设置cookie,这将重置cookie过期时间
import { NestFactory } from '@nestjs/core';
import { VersioningType } from '@nestjs/common';
import { AppModule } from './app.module';
import * as session from 'express-session'
async function bootstrap() {const app = await NestFactory.create(AppModule);app.enableVersioning({type: VersioningType.URI})app.use(session({ secret: "koillin", name: "xm.session", rolling: true, cookie: { maxAge: null } }))await app.listen(3000);
}
bootstrap();

Nestjs 提供者

Provider 只是一个用 @Injectable() 装饰器注释的类

service.ts
在这里插入图片描述
⭐️基本用法:在模块 .module.ts 文件中引入 service,在 providers 注入
在这里插入图片描述
⭐️在 .controller.ts 文件就可以使用注入好的 service
在这里插入图片描述
第二种写法
⭐️ 在.modules.ts写法

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';@Module({controllers: [UserController],providers: [{provide: "Koillin", // 自定义名称useClass: UserService}]
})
export class UserModule { }

⭐️ 在 .controller.ts 文件就可以使用注入 自定义名称后,需要用对应的 Inject 取用,不然找不到

import { Controller, Inject } from '@nestjs/common';
import { UserService } from './user.service';@Controller('user')
export class UserController {constructor(@Inject('Koillin') private readonly userService: UserService) {}
}

自定义注入值
⭐️ 在.modules.ts写法

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';@Module({controllers: [UserController],providers: [{provide: "Xiaoman",useClass: UserService}, {provide: "JD",useValue: ['TB', 'PDD', 'JD']}]
})
export class UserModule { }

⭐️ 在 .controller.ts 文件就可以使用注入 自定义值

import { Controller, Inject } from '@nestjs/common';
import { UserService } from './user.service';@Controller('user')
export class UserController {constructor(@Inject('Xiaoman') private readonly userService: UserService,@Inject('JD') private shopList: string[]) {}
}

工厂模式

如果服务之间有相互的依赖或者逻辑处理,可以使用 useFactory
⭐️ 在.modules.ts

 import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserService2 } from './user.service2';
import { UserService3 } from './user.service3';
import { UserController } from './user.controller';@Module({constrollers:[UserController],providers:[{provide:"Koillin",useClass:UserService},{provide:"JD",useValue: ['TB', 'PDD', 'JD']}, UserService2,{provide:"Test",inject:[UserService2],useFactory(UserService2:UserService2) {return new UserService3(UserService2)}}]
})

⭐️ 在 .controller.ts 文件

import { Controller, Inject } from '@nestjs/common';
import { UserService } from './user.service';@Controller('user')
export class UserController {constructor(@Inject('Xiaoman') private readonly userService: UserService,@Inject('JD') private shopList: string[],@Inject('Test') private readonly Test: any,) {}
}

异步模式

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserService2 } from './user.service2';
import { UserService3 } from './user.service3';
import { UserController } from './user.controller';@Module({controllers: [UserController],providers: [{provide: "Xiaoman",useClass: UserService}, {provide: "JD",useValue: ['TB', 'PDD', 'JD']},UserService2,{provide: "Test",inject: [UserService2],useFactory(UserService2: UserService2) {return new UserService3(UserService2)}},{provide: "sync",async useFactory() {return await  new Promise((r) => {setTimeout(() => {r('sync')}, 3000)})}}]
})
export class UserModule { }

Nestjs 模块

当使用 nest g res user创建一个新的CURD模块时,nestjs 会自动帮我们引入.module.ts模块

在这里插入图片描述

共享模块

例如 user 的 Service 想暴露给其他模块使用就可以使用 exports 导出该服务

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';@Module({controllers: [UserController],providers: [UserService],exports: [UserService],
})
export class UserModule {}

由于其他.moudles.ts 已经引入过该模块,就可以直接使用了

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import { UserService } from './user/user.service';@Controller()
export class AppController {constructor(private readonly appService: AppService,private readonly userService: UserService,) {}@Get()getHello(): string {return this.userService.findAll(); // 自动生成的模块里有这个方法}
}

全局模块

给 user 模块添加 @Global() 他便注册为全局模块

import { Global, Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';@Global()
@Module({controllers: [UserController],providers: [UserService],
})
export class UserModule {}

动态模块

为了给模块传递参数 可以给该模块添加一个静态方法用来接受参数

创建一个 config.module.ts

import { Module, DynamicModule, Global } from '@nestjs/common'interface Options {path: string
}@Global()
@Module({
})
export class ConfigModule {static forRoot(options: Options): DynamicModule {return {module: ConfigModule,providers: [{provide: "Config",useValue: { baseApi: "/api" + options.path }}],exports: [{provide: "Config",useValue: { baseApi: "/api" + options.path }}]}}
}  

在 app.module.ts 文件引入

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { ListModule } from './list/list.module';
import { ConfigModule } from './config/config.module';@Module({imports: [UserModule, ListModule, ConfigModule.forRoot({path: '/koillin'})],controllers: [AppController],providers: [AppService],
})
export class AppModule {}

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

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

相关文章

【Unity服务器01】之【AssetBundle上传加载u3d模型】

首先打开一个项目导入一个简单的场景 导入怪物资源, AssetBundle知识点: 1.指定资源的AssetBundle属性标签 (1)找到AssetBundle属性标签 (2)A标签 代表:资源目录(决定打包之后在哪…

如何给文档设置密码?电脑文件安全加密的详细操作步骤(10种方法)

在数字化时代,电脑文件的安全和隐私至关重要。通过给电脑的文件或者文件夹设置密码和加密,可以有效保护你的重要文件不被未经授权的人员访问,特别是公司的重要岗位,一些特殊的机密文件,投标文件,资金文件等…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-10权重衰减

10权重衰减 """ 正则化是处理过拟合的常用方法:在训练集的损失函数中加入惩罚项,以降低学习到的模型的复杂度。 保持模型简单的一个特别的选择是使用L2惩罚的权重衰减。这会导致学习算法更新步骤中的权重衰减。 """impor…

html--好看的手机充值单页

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>线上充值-首页</title><meta content"widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalable0" name"viewport&…

maya模型仓鼠制作

小仓鼠建模&#xff08;6&#xff09;_哔哩哔哩_bilibili 20240623作品---个人评价&#xff1a;第一次做的&#xff0c;虽然有点丑&#xff0c;但是还能看&#xff01;希望后面有些进步

论文阅读--Efficient Hybrid Zoom using Camera Fusion on Mobile Phones

这是谷歌影像团队 2023 年发表在 Siggraph Asia 上的一篇文章&#xff0c;主要介绍的是利用多摄融合的思路进行变焦。 单反相机因为卓越的硬件性能&#xff0c;可以非常方便的实现光学变焦。不过目前的智能手机&#xff0c;受制于物理空间的限制&#xff0c;还不能做到像单反一…

线程封装,互斥

文章目录 线程封装线程互斥加锁、解锁认识接口解决问题理解锁 线程封装 C/C代码混编引起的问题 此处pthread_create函数要求传入参数为void * func(void * )类型,按理来说ThreadRoutine满足,但是 这是在内类完成封装,所以ThreadRoutine函数实际是两个参数,第一个参数Thread* …

【建设方案】大数据湖一体化建设方案(ppt原件)

1、背景&#xff1a;大数据湖的发展背景与建设理念 2、体系&#xff1a;大数据湖体系规划与建设思路 3、生态圈&#xff1a;探索新兴业务入湖建设模式 4、共享&#xff1a;大数据湖统一访问共享规划 5、运营&#xff1a;大数据湖一体化运营管理建设 &#xff08;本方案及更多方…

Kafka~基础原理与架构了解

Kafka是什么 Kafka我们了解一直认为是一个消息队列&#xff0c;但是其设计初&#xff0c;是一个&#xff1a;分布式流式处理平台。流平台具有三个关键功能&#xff1a; 消息队列&#xff1a;发布和订阅消息流&#xff0c;这个功能类似于消息队列&#xff0c;这也是 Kafka 也被…

Comfyui-ChatTTS-OpenVoice 为ComfyUI添加语音合成、语音克隆功能

‍‍ 生成多人播客&#xff1a; Comfyui-ChatTTS是一个开源的GitHub项目&#xff0c;致力于为ComfyUI添加语音合成功能。该项目提供了一系列功能强大的节点和模型&#xff0c;支持用户创建和复用音色&#xff0c;支持多人对话模式的生成&#xff0c;并提供了导出音频字幕文件的…

“Jedis与Redis整合指南:实现高效的Java应用与Redis交互“

目录 #. 概念 1. 导入jedis依赖 2. 写一个类&#xff08;ping通redis&#xff09; 3. String字符串使用 3.1 set&#xff0c;get方法使用&#xff08;设值&#xff0c;取值&#xff09; 3.2 mset&#xff0c;mget方法使用&#xff08;设置多个值&#xff0c;取多个值&…

怎么在vscode里运行一个cpp文件

文章目录 1.需要下载g编译器&#xff0c;或clang&#xff08;快&#xff0c;但是优化效果没有g好&#xff09;2.新建文件夹和cpp文件&#xff08;tasks.json&#xff09;3.怎么在vscode里调试(launch.json)4.怎么设置让中断输出的字符是中文&#xff01;5.飞机大战 1.需要下载g…

iis下asp.netcore后台定时任务会取消

问题 使用BackgroundService或者IHostedService做后台定时任务的时候部署到iis会出现不定时定时任务取消的问题&#xff0c;原因是iis会定时的关闭网站 解决 应用程序池修改为AlwaysRunning 修改web.config <?xml version"1.0" encoding"utf-8"?…

Android studio登录Google账号超时的解决方法

确保自己已经打开了代理&#xff08;科学上网&#xff09;在设置-外观与行为-系统设置-HTTP代理 中打开“自动检测代理设置”&#xff1a; 再次重新尝试登录Google账号&#xff0c;登陆成功&#xff01; 学术会议征稿 想要了解国内主办的覆盖学科最全最广的学术会议&#xff0c…

代码-功能-python-爬取博客网标题作者发布时间

环境&#xff1a; python 3.8 代码&#xff1a; # 爬取博客园内容 # https://www.cnblogs.com/import re from lxml import etree import requests import json import threading from queue import Queue import pymysql import timeclass HeiMa:def __init__(self):# 请…

k8s 部署 ruoyi 前后端分离项目

本文视频版 https://www.bilibili.com/video/BV17ugkePEeN 参考 https://blog.csdn.net/qq_50247813/article/details/136934090 https://gitee.com/nasaa/RuoYi-Vue-cloud https://www.itsgeekhead.com/tuts/kubernetes-129-ubuntu-22-04-3/ https://kubernetes.io/docs/se…

【漏洞复现】畅捷通T+ keyEdit.aspx SQL漏洞

0x01 产品简介 畅捷通 T 是一款灵动&#xff0c;智慧&#xff0c;时尚的基于互联网时代开发的管理软件&#xff0c;主要针对中小型工贸与商贸企业&#xff0c;尤其适合有异地多组织机构(多工厂&#xff0c;多仓库&#xff0c;多办事处&#xff0c;多经销商)的企业&#xff0c;…

用户态协议栈06-TCP三次握手

最近由于准备软件工程师职称考试&#xff0c;然后考完之后不小心生病了&#xff0c;都没写过DPDK的博客了。今天开始在上次架构优化的基础上增加TCP的协议栈流程。 什么是TCP 百度百科&#xff1a;TCP即传输控制协议&#xff08;Transmission Control Protocol&#xff09;是…

LabVIEW程序退出后线程仍在运行问题

LabVIEW程序退出后&#xff0c;线程仍在运行的问题可能源于资源管理不当、未正确终止循环、事件结构未处理、并发编程错误以及外部库调用未结束等方面。本文将从这些角度详细分析&#xff0c;探讨可能的原因和解决方案&#xff0c;并提供预防措施&#xff0c;帮助开发者避免类似…

将知乎专栏文章转换为 Markdown 文件保存到本地

一、参考内容 参考知乎文章代码 | 将知乎专栏文章转换为 Markdown 文件保存到本地&#xff0c;利用代码为GitHub&#xff1a;https://github.com/chenluda/zhihu-download。 二、步骤 1.首先安装包flask、flask-cors、markdownify 2. 运行app.py 3.在浏览器中打开链接&…