网站首页 > 技术文章 正文
获课:bcwit.top/212
获取ZY↑↑方打开链接↑↑
前端全栈转型必修课:NestJS 从 TypeScript 基础到模块化服务端架构实战
在前端技术迭代加速的当下,“全栈能力” 已从 “加分项” 变为企业招聘的 “刚需项”—— 单一的前端开发能力,难以满足 “前后端协同优化、业务逻辑深度落地、小型项目独立开发” 的需求。而前端开发者转型全栈,最大的痛点在于 “服务端架构思维缺失” 与 “技术栈衔接不畅”:熟悉 TypeScript 却不知如何在服务端应用,懂前端组件化却不懂服务端模块化,会调用 API 却不懂 API 设计原理。
NestJS 作为基于 Node.js 的企业级服务端框架,恰好解决了前端转型的核心痛点:它以 TypeScript 为母语,完美衔接前端开发者的 TS 知识体系;其模块化、分层化的架构设计,可类比前端组件化思维(如 Vue/React 的组件拆分);同时内置依赖注入、中间件、异常处理等服务端核心能力,无需开发者从零搭建架构。本文将从 “TypeScript 服务端适配” 到 “NestJS 模块化实战”,为前端开发者提供一套可落地的全栈转型学习路径。
一、转型基础:TypeScript 在服务端的核心应用(前端到服务端的思维衔接)
前端开发者虽熟悉 TypeScript(如 Vue3/React+TS 项目),但服务端 TS 的应用场景(如类型安全的 API 设计、数据库模型定义、业务逻辑类型约束)与前端存在显著差异。这一部分将聚焦 “前端 TS 知识如何迁移到服务端”,夯实 NestJS 学习的基础。
(一)服务端 TS 与前端 TS 的核心差异:从 “界面交互” 到 “业务逻辑”
前端 TS 的核心目标是 “保障界面交互的类型安全”(如组件 Props 类型、状态管理类型),而服务端 TS 则聚焦 “业务逻辑与数据流转的类型安全”,关键差异体现在三个维度:
对比维度 | 前端 TS 应用场景 | 服务端 TS 应用场景 | 核心价值 |
类型定义目标 | 组件 Props、状态(State)、事件回调参数 | API 请求参数(Query/Body)、数据库模型、返回值 | 避免 “参数类型错误”“数据格式不匹配” 导致的服务异常 |
泛型应用 | 通用组件(如List<T>)、工具函数 | 数据库 CRUD 通用方法(如findOne<T>(id: number))、中间件 | 减少重复代码,提升业务逻辑复用性 |
装饰器用途 | 组件生命周期(如 Vue 的@Component)、属性装饰 | 路由定义(如@Get)、依赖注入(如@Injectable)、数据验证(如@IsString) | 简化服务端架构配置,降低代码耦合 |
例如:前端用 TS 定义组件 Props(interface ButtonProps { type: 'primary' | 'default' }),聚焦界面交互;服务端则用 TS 定义 API 请求体(interface CreateUserDto { username: string; password: string; age?: number }),确保客户端传入的用户数据符合业务规则,避免 “密码传数字”“用户名缺失” 等错误。
- 泛型(Generic)在服务端工具函数与数据库操作中的应用
- 前端泛型多用于 “通用组件”,服务端则用于 “通用业务逻辑”,如数据库 CRUD 工具(适配不同表的查询):
- 定义通用查询方法:function findAll<T>(tableName: string): Promise<T[]>,可复用为 “查询用户表”(findAll<User>('users'))、“查询订单表”(findAll<Order>('orders'));
- 核心价值:避免为每个数据库表重复编写 “查询所有数据” 的逻辑,这是 NestJS 中 “Repository 模式” 的基础。
- 装饰器(Decorator):服务端架构的 “语法糖”
- 前端装饰器多为框架封装(如 React 的@decorator、Vue 的@Prop),服务端则需理解装饰器的 “元编程” 逻辑 —— 通过装饰器为类、方法、属性注入额外逻辑(如路由映射、权限校验);
- NestJS 的核心能力(如路由定义@Get('/users')、服务注入@Injectable())均基于装饰器实现,前端开发者需掌握 “装饰器如何关联业务逻辑”(如@Get装饰器如何将方法映射为 HTTP GET 接口)。
(三)TS 服务端开发环境配置:从前端工程化到服务端工程化
前端开发者熟悉webpack/vite配置,服务端 TS 环境配置需关注 “编译输出”“热重载”“调试” 三大核心需求,这也是 NestJS 项目的基础配置:
- 编译配置(tsconfig.json)
- 服务端需将 TS 编译为 Node.js 可执行的 JS,关键配置与前端差异:
- target: "ES2020":适配 Node.js 14 + 版本,避免语法兼容性问题;
- module: "CommonJS":Node.js 默认模块规范(前端多为ESNext);
- outDir: "./dist":指定编译后的 JS 文件输出目录(前端多为dist但用途不同);
- rootDir: "./src":指定 TS 源码目录,与前端工程化目录结构一致,降低适应成本。
- 热重载与调试
- 前端用vite/webpack-dev-server实现热重载,服务端 NestJS 推荐用nest-cli自带的--watch模式(nest start --watch),修改代码后自动重启服务;
- 调试配置:VS Code 中配置launch.json,通过 “附加到进程” 或 “直接启动” 调试服务端代码,断点逻辑与前端调试一致(如查看变量、单步执行),前端开发者可快速上手。
二、NestJS 核心认知:从前端组件化到服务端模块化
NestJS 的架构设计理念与前端 “组件化” 高度契合 —— 前端通过 “组件拆分” 实现界面复用与维护,NestJS 通过 “模块化拆分” 实现服务端业务逻辑的解耦。这一部分将拆解 NestJS 的核心概念,用前端思维类比讲解,降低服务端架构的理解门槛。
(一)NestJS 架构核心:分层设计与前端 MVC 的对应关系
前端开发者熟悉 “MVVM”(Model-View-ViewModel)或 “组件化分层”,NestJS 采用 “模块化 + 分层架构”,其核心分层可与前端思维对应,快速建立认知:
NestJS 服务端分层 | 核心职责 | 前端类比 | 示例场景 |
控制器(Controller) | 接收 HTTP 请求,返回响应,不处理业务逻辑 | 前端组件的 “事件处理函数” | 定义/users接口,接收客户端的用户查询请求 |
服务(Service) | 处理核心业务逻辑,被控制器调用 | 前端的 “工具函数 / Store” | 实现 “创建用户” 的业务逻辑(密码加密、数据库插入) |
模块(Module) | 封装控制器、服务、依赖,实现业务边界隔离 | 前端的 “组件库 / 业务组件” | 定义UserModule,包含用户相关的控制器与服务 |
管道(Pipe) | 数据验证与转换,确保请求数据符合业务规则 | 前端的 “表单验证逻辑” | 验证 “创建用户” 请求中的username是否为字符串且长度≥3 |
中间件(Middleware) | 拦截请求 / 响应,处理通用逻辑(如日志、权限) | 前端的 “请求拦截器 / 响应拦截器”(如 Axios 拦截器) | 所有接口请求前打印日志,或验证 Token |
异常过滤器(Filter) | 统一捕获与处理服务端异常,返回标准化响应 | 前端的 “错误处理函数”(如 try/catch) | 捕获数据库错误,返回500状态码与错误信息 |
例如:前端 “用户登录组件” 的逻辑是 “点击登录按钮→调用登录接口→处理响应 / 错误”,NestJS 中 “用户登录” 的逻辑是 “Controller 接收登录请求→调用 Service 处理登录业务→Pipe 验证账号密码格式→Filter 处理登录失败异常”,分层职责清晰,与前端逻辑链路高度相似。
(二)NestJS 核心概念拆解:用前端思维理解
- 模块(Module):服务端的 “业务组件”
- 前端 “组件” 包含模板、样式、逻辑,NestJS “模块” 包含 “控制器、服务、依赖”,通过@Module()装饰器定义,核心属性:
- controllers: [UserController]:该模块包含的控制器,类比前端组件中的 “子组件”;
- providers: [UserService]:该模块包含的服务,类比前端组件中的 “内部工具函数”;
- imports: [DatabaseModule]:该模块依赖的其他模块,类比前端组件中 “引入的其他组件库”(如引入Element Plus);
- exports: [UserService]:对外暴露的服务,类比前端组件中 “对外暴露的方法”(如defineExpose),供其他模块调用。
- 实战价值:通过模块拆分,实现 “业务边界隔离”—— 如UserModule(用户业务)、ProductModule(商品业务)、OrderModule(订单业务)互不依赖,修改用户业务不会影响商品业务,与前端 “组件解耦” 逻辑一致。
- 依赖注入(Dependency Injection):服务端的 “依赖管理”
- 前端通过import引入组件 / 工具(如import { Button } from 'element-plus'),NestJS 通过 “依赖注入” 实现服务的复用与解耦,核心逻辑:
- 服务通过@Injectable()装饰器标记为 “可注入”,类比前端工具函数导出;
- 控制器中通过 “构造函数参数” 自动获取服务实例,无需手动import和创建:
// 非代码,仅作逻辑演示:控制器注入服务
@Controller('users')
export class UserController {
// 构造函数参数中声明UserService,NestJS自动注入实例
constructor(private readonly userService: UserService) {}
@Get()
findAll() {
// 直接调用服务的方法,无需手动new UserService()
return this.userService.findAll();
}
}
- 前端类比:类似 Vue 的 “依赖注入”(provide/inject),父组件提供依赖,子组件直接使用,无需逐层传递,减少代码耦合。
- 控制器(Controller)与路由:服务端的 “接口定义”
- 前端通过 “Axios 调用 API” 与服务端交互,NestJS 控制器通过 “装饰器 + 方法” 定义 API 路由,核心逻辑:
- 路由装饰器:@Get()/@Post()/@Put()/@Delete()对应 HTTP 方法,类比前端 Axios 的get()/post();
- 路由路径:@Get('/users')定义接口路径,支持动态参数(如@Get('/users/:id'),:id为动态参数,类比前端路由的/user/:id);
- 请求参数获取:通过@Query()(获取 URL 查询参数,如?name=张三)、@Body()(获取 POST 请求体)、@Param()(获取动态路由参数),类比前端this.$route.query/this.$route.params。
- 优势:路由与业务逻辑分离(控制器只接发请求,服务处理逻辑),避免 “接口定义与业务代码混杂”,与前端 “事件处理与业务逻辑分离”(如点击事件调用工具函数)的最佳实践一致。
- 管道(Pipe):服务端的 “表单验证”
- 前端通过 “表单验证库”(如VeeValidate/Formik)确保用户输入合法,NestJS 通过 “管道” 实现 API 请求数据的验证与转换,核心场景:
- 数据验证:用class-validator库(NestJS 默认支持)定义 “数据传输对象(DTO)”,通过装饰器指定验证规则(如@IsString()/@MinLength(3)),管道自动校验请求体,不合法则抛出异常;
- 数据转换:将请求参数转换为目标类型(如将string类型的id转换为number),避免业务逻辑中频繁处理类型转换。
- 前端类比:类似前端表单提交前的 “验证钩子”,不通过则阻止提交,确保进入业务逻辑的数据是合法的,减少错误处理代码。
三、模块化服务端架构实战:从 0 到 1 搭建全栈项目
实战是前端转型全栈的关键 —— 本节以 “小型电商后台” 为案例,拆解 NestJS 模块化架构的落地步骤,涵盖 “模块拆分、分层实现、数据库交互、API 设计”,全程结合前端思维,让开发者理解 “服务端架构如何支撑前端业务需求”。
(一)项目初始化与整体架构设计:前端工程化思维复用
- 项目初始化
- 用 NestJS 官方脚手架nest-cli创建项目(nest new nest-ecommerce),目录结构与前端 Vue/React 项目高度相似:
nest-ecommerce/
├── src/ # 源码目录(类比前端src)
│ ├── main.ts # 入口文件(类比前端main.ts)
│ ├── app.module.ts # 根模块(类比前端App.vue)
│ ├── user/ # 用户模块(业务模块)
│ ├── product/ # 商品模块(业务模块)
│ └── order/ # 订单模块(业务模块)
├── tsconfig.json # TS配置(类比前端)
└── package.json # 依赖配置(类比前端)
- 核心差异:前端src下是 “组件 / 页面”,服务端src下是 “模块 / 控制器 / 服务”,但目录组织逻辑(按业务拆分)一致,前端开发者可快速适应。
- 整体架构设计:业务模块拆分
- 参考前端 “业务组件拆分” 逻辑,按电商业务域拆分 NestJS 模块,确保 “高内聚低耦合”:
- UserModule:用户相关(注册、登录、查询用户信息);
- ProductModule:商品相关(创建商品、查询商品列表、更新商品库存);
- OrderModule:订单相关(创建订单、查询订单、更新支付状态);
- DatabaseModule:数据库配置模块(封装数据库连接,供其他模块导入,类比前端 “全局状态管理模块”);
- AuthModule:权限认证模块(处理 JWT 生成与验证,类比前端 “登录状态管理模块”)。
- 模块依赖关系:OrderModule依赖UserModule(创建订单需验证用户存在)和ProductModule(创建订单需扣减商品库存),UserModule依赖AuthModule(登录生成 JWT),依赖逻辑清晰,避免循环依赖。
(二)核心模块实战:以 UserModule 为例拆解分层实现
以 “用户模块(UserModule)” 为例,完整演示 NestJS 的 “控制器 - 服务 - 管道 - 数据库交互” 分层实现,每一步均对应前端开发者熟悉的逻辑。
- 步骤 1:定义数据传输对象(DTO)—— 服务端的 “表单验证模型”
- 类比前端 “表单验证规则”,用class-validator定义CreateUserDto(创建用户的请求体模型),指定验证规则:
- username:字符串,最小长度 3,必填;
- password:字符串,最小长度 6,必填;
- age:数字,可选,范围 18-120。
- 作用:管道(Pipe)将基于此 DTO 自动校验客户端传入的请求体,不合法则返回400错误,避免业务逻辑中重复写验证代码,与前端 “表单验证模型” 逻辑一致。
- 步骤 2:实现 UserService—— 业务逻辑核心(类比前端工具函数)
- 服务的核心职责:处理 “创建用户” 的业务逻辑,包含 “密码加密”“数据库插入”,不直接接触 HTTP 请求:
- 密码加密:用bcrypt库将明文密码加密(避免数据库存储明文,安全规范);
- 数据库交互:通过 “Repository 模式”(NestJS 与 TypeORM 集成的核心)将用户数据插入数据库;
- 逻辑复用:服务中的方法(如create()/findOne())可被本模块控制器调用,也可通过exports暴露给其他模块(如OrderModule查询用户信息)。
- 前端类比:类似前端的 “用户相关工具函数”(如encryptPassword()/saveUserToLocalStorage()),但服务端服务更聚焦 “业务逻辑” 而非 “客户端操作”。
- 步骤 3:实现 UserController—— 接口定义(类比前端 API 调用逻辑)
- 控制器通过 “装饰器 + 方法” 定义用户相关 API,调用UserService处理业务逻辑,不包含复杂逻辑:
- 注册接口:@Post('/register'),接收@Body()(客户端传入的用户数据),调用userService.create(),返回创建的用户信息(隐藏密码);
- 登录接口:@Post('/login'),接收@Body()(账号密码),调用userService.verifyPassword()验证,通过则调用AuthService生成 JWT 返回;
- 查询用户接口:@Get('/:id'),接收@Param('id')(用户 ID),调用userService.findOne(),返回用户信息。
- 关键:控制器仅负责 “请求接收与响应返回”,业务逻辑全部委托给服务,符合 “单一职责原则”,与前端 “事件处理函数仅调用工具函数” 的最佳实践一致。
- 步骤 4:配置 UserModule—— 模块封装(类比前端业务组件封装)
- 将UserController、UserService、DTO、数据库 Repository 封装到UserModule,定义模块属性:
- controllers: [UserController]:包含用户控制器;
- providers: [UserService]:包含用户服务;
- imports: [DatabaseModule, AuthModule]:导入数据库模块(获取数据库连接)和权限模块(生成 JWT);
- exports: [UserService]:暴露用户服务,供OrderModule等其他模块调用。
- 作用:模块封装后,用户业务的所有代码集中在src/user目录下,修改时不影响其他模块,与前端 “业务组件封装在单独目录” 的维护逻辑一致。
(三)数据库交互:NestJS+TypeORM 与前端数据存储的类比
前端开发者熟悉 “localStorage”“IndexedDB” 或 “后端 API 请求”,服务端数据库交互是新知识点。NestJS 推荐用 TypeORM(ORM 工具),可类比前端 “数据存储工具”,降低数据库操作的理解门槛。
- TypeORM 核心认知:ORM = 服务端的 “数据存储封装”
- ORM(Object-Relational Mapping)将 “数据库表” 映射为 “TS 类”,“表字段” 映射为 “类属性”,类比前端 “将 API 返回数据映射为 TS 接口”:
- 数据库表users → TS 类User(用@Entity()装饰器标记);
- 表字段username(varchar) → 类属性username: string(用@Column()装饰器标记);
- 优势:无需编写 SQL 语句,通过 “类方法” 操作数据库(如userRepository.save(user)插入数据),前端开发者无需学习 SQL 即可实现数据库交互。
- 实战配置:NestJS 集成 TypeORM
- 步骤 1:安装依赖(@nestjs/typeorm typeorm mysql2,以 MySQL 为例);
- 步骤 2:创建DatabaseModule,配置数据库连接(主机、端口、数据库名、用户名、密码),通过TypeOrmModule.forRoot()初始化;
- 步骤 3:在业务模块(如UserModule)中,通过TypeOrmModule.forFeature([User])引入User实体,注入Repository(数据库操作对象)到UserService;
- 步骤 4:UserService中通过Repository操作数据库,如:
- 插入数据:this.userRepository.save(newUser);
- 查询数据:this.userRepository.findOne({ where: { id } });
- 更新数据:this.userRepository.update(id, { username: newName })。
- 前端类比:类似前端用 “封装的 localStorage 工具”(如localStorage.set('user', user))操作数据,TypeORM 是服务端的 “数据库操作工具”,封装了复杂的 SQL 逻辑。
四、前端全栈协同:NestJS 服务端与前端框架的对接实战
前端转型全栈的最终目标是 “前后端协同开发”,需掌握 “API 设计规范”“权限控制”“联调技巧” 三大核心能力。本节从前端视角出发,讲解 NestJS 服务端如何与 Vue/React 等前端框架对接,实现全栈业务闭环。
(一)API 设计规范:RESTful 风格与前端请求逻辑的匹配
前端开发者频繁调用 API,服务端 API 设计直接影响前端开发效率。NestJS 推荐 RESTful 风格,可与前端 “API 请求封装” 完美匹配,核心规范:
- HTTP 方法与业务语义的对应
- GET:查询数据(如/users查询用户列表,/users/:id查询单个用户)→ 前端用axios.get();
- POST:创建数据(如/users/register创建用户,/orders创建订单)→ 前端用axios.post();
- PUT:全量更新数据(如/users/:id更新用户所有信息)→ 前端用axios.put();
- PATCH:部分更新数据(如/users/:id/age仅更新用户年龄)→ 前端用axios.patch();
- DELETE:删除数据(如/users/:id删除用户)→ 前端用axios.delete()。
- 优势:前端可按 “业务语义” 选择 HTTP 方法,无需记忆复杂的接口路径(如避免/createUser//deleteUser等冗余路径),请求逻辑更清晰。
(二)权限控制:JWT 在 NestJS 与前端的协同实现
前端 “登录状态管理”(如 Vuex/Pinia 存储 Token)与服务端 “权限校验” 需协同,NestJS 通过 JWT 实现权限控制,全栈协同步骤:
- 服务端 JWT 实现(AuthModule)
- 步骤 1:安装@nestjs/jwt依赖,配置 JWT 密钥(secret)和过期时间(如expiresIn: '24h');
- 步骤 2:AuthService实现generateToken()方法,接收用户 ID 生成 JWT(this.jwtService.sign({ sub: userId }));
- 步骤 3:创建 “JWT 守卫(Guard)”,通过@UseGuards(JwtAuthGuard)装饰器为需要权限的接口(如/orders)添加校验,守卫自动解析前端传入的 Token,验证通过则允许访问,失败返回401。
- 前端 JWT 适配
- 步骤 1:登录成功后,将服务端返回的 Token 存储到localStorage或Pinia(如localStorage.setItem('token', res.data.token));
- 步骤 2:封装 Axios 请求拦截器,为所有 API 请求的Headers添加Authorization: Bearer ${token}(Token 格式);
- 步骤 3:前端路由守卫(如 Vue 的router.beforeEach)判断localStorage中是否有 Token,无则跳转登录页,与服务端 JWT 守卫形成 “前后端双重校验”。
(三)前后端联调:效率提升技巧(前端开发者必备)
前端开发者转型全栈后,需掌握 “自我联调” 能力(无需依赖后端),核心技巧:
- 接口文档自动生成:Swagger 集成
- NestJS 集成@nestjs/swagger,通过装饰器(如@ApiOperation()/@ApiParam())自动生成 Swagger 接口文档(访问/swagger查看),包含 “接口路径、参数、响应格式”;
- 前端价值:无需后端编写接口文档,直接在 Swagger 中 “在线调试接口”(填写参数、发送请求、查看响应),联调效率提升 50%。
- Mock 数据与真实接口的平滑切换
- 开发初期服务端未完成时,前端用Mock.js模拟接口数据;
- 服务端接口完成后,仅需修改 Axios 的baseURL(从/mock切换到/api),无需修改业务代码,实现 “Mock→真实接口” 的平滑过渡。
- 调试工具:Chrome DevTools 的全栈应用
- 前端用 DevTools 的 “Network” 查看 API 请求(参数、响应、状态码),定位 “请求格式错误”;
- 服务端用 DevTools 的 “Sources” 调试 Node.js 代码(需配置 Node.js 调试),断点查看业务逻辑,前后端调试工具统一,降低切换成本。
五、前端全栈转型避坑与进阶方向
前端开发者转型全栈,除了技术学习,还需规避 “思维固化”“过度关注细节” 等坑,同时明确进阶路径,实现持续成长。
(一)转型常见坑点与规避策略
- 坑点 1:用前端思维写服务端代码(如 “全局变量存储状态”)
- 问题:前端习惯用 “全局变量” 或 “单例 Store” 存储状态,服务端若用全局变量存储用户信息,会导致 “多用户并发时数据混乱”(Node.js 是单线程,全局变量共享);
- 规避:服务端状态需存储在 “数据库” 或 “分布式缓存(如 Redis)”,避免使用全局变量,NestJS 的依赖注入确保服务实例是 “请求级” 或 “单例级”,按需选择。
- 坑点 2:忽视服务端性能与安全(如 “明文存储密码”)
- 问题:前端不关注 “数据安全”,服务端若明文存储密码、不验证请求参数,会导致 “数据泄露”“SQL 注入” 等风险;
- 规避:密码必须加密(如bcrypt),用 ORM 避免 SQL 注入,所有 API 请求通过 Pipe 验证参数,敏感接口添加权限校验(JWT 守卫)。
- 坑点 3:过度追求 “技术全面”,忽视业务落地
- 问题:前端转型时易陷入 “学习 NestJS 所有特性” 的误区,导致 “会用框架但不会落地业务”;
- 规避:从 “小项目” 入手(如个人博客后台、小型电商),优先掌握 “模块拆分、控制器 / 服务实现、数据库交互” 核心能力,再逐步学习微服务、GraphQL 等进阶特性。
(二)NestJS 进阶方向:从 “会用” 到 “精通”
- 微服务架构:应对高并发场景
- 当项目规模扩大(如日活 10 万 +),单体 NestJS 服务难以支撑,需拆分为 “微服务”(如UserService微服务、OrderService微服务);
- NestJS 支持多种微服务通信方式(如 TCP、Redis、MQ),前端无需感知服务端拆分,仅需调用统一的 API 网关,适合全栈开发者进一步提升架构能力。
- GraphQL 集成:解决前端 “过度请求” 问题
- 传统 RESTful API 需前端发送多个请求获取关联数据(如 “查询订单 + 查询订单所属用户 + 查询订单商品” 需 3 个请求),GraphQL 允许前端 “一次请求获取所有需要的数据”;
- NestJS 集成@nestjs/graphql,前端用 GraphQL 查询语言(如query { order(id: 1) { id user { username } items { productName } } })获取数据,减少请求次数,提升前端体验。
- 测试策略:保障服务端代码质量
- 前端熟悉 “组件测试(如 Vue Test Utils)”,服务端需掌握 “单元测试”“集成测试”;
- NestJS 支持Jest测试框架,对 “服务方法” 写单元测试(验证业务逻辑正确性),对 “API 接口” 写集成测试(验证请求响应是否符合预期),确保代码修改不引入 Bug。
猜你喜欢
- 2025-10-02 加拿大留学毕业了学习许可将到期工作许可还没发,算合法居住吗?
- 2025-10-02 CTO:通电全司,前端入关!_cto干嘛的
- 2025-10-02 Spring Boot 3.x 中的 Token 续期方案实现
- 2025-10-02 Int'l community hopes US, Russia to fulfill nuclear disarmament responsibility: Chinese foreign ministry
- 2024-08-08 SSM框架警校在线考试系统的设计与开发
- 2024-08-08 持续集成CICD实战5—提交测试成功镜像到harbor镜像仓库
- 2024-08-08 如何在分布式环境中搭建单点登录系统|第二篇:SSO核心代码
- 2024-08-08 一文带你了解 OAuth2 协议与 Spring Security OAuth2 集成
- 2024-08-08 使用Oauth2实现微服务的安全保护(微服务 接口安全)
- 2024-08-08 OAuth 系列(四)密码模式 Resource Owner Password Credentials
- 10-02基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- 10-02Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- 10-02AWD-LSTM语言模型是如何实现的_lstm语言模型
- 10-02NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 10-02使用ONNX和Torchscript加快推理速度的测试
- 10-02tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- 10-02Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- 10-02Gateway_gateways
- 最近发表
-
- 基于深度学习的铸件缺陷检测_如何控制和检测铸件缺陷?有缺陷铸件如何处置?
- Linux Mint 22.1 Cinnamon Edition 搭建深度学习环境
- AWD-LSTM语言模型是如何实现的_lstm语言模型
- NVIDIA Jetson Nano 2GB 系列文章(53):TAO模型训练工具简介
- 使用ONNX和Torchscript加快推理速度的测试
- tensorflow GPU环境安装踩坑日记_tensorflow配置gpu环境
- Keye-VL-1.5-8B 快手 Keye-VL— 腾讯云两卡 32GB GPU保姆级部署指南
- Gateway_gateways
- Coze开源本地部署教程_开源canopen
- 扣子开源本地部署教程 丨Coze智能体小白喂饭级指南
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)