# book-management-system-backend **Repository Path**: xrwork/book-management-system-backend ## Basic Information - **Project Name**: book-management-system-backend - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-24 - **Last Updated**: 2025-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

Nest Logo

[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 [circleci-url]: https://circleci.com/gh/nestjs/nest

A progressive Node.js framework for building efficient and scalable server-side applications.

NPM Version Package License NPM Downloads CircleCI Discord Backers on Open Collective Sponsors on Open Collective Donate us Support us Follow us on Twitter

## Description [Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. ## Project setup ```bash $ pnpm install ``` ## Compile and run the project ```bash # development $ pnpm run start # watch mode $ pnpm run start:dev # production mode $ pnpm run start:prod ``` ## Run tests ```bash # unit tests $ pnpm run test # e2e tests $ pnpm run test:e2e # test coverage $ pnpm run test:cov ``` ## Deployment When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information. If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps: ```bash $ pnpm install -g @nestjs/mau $ mau deploy ``` With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure. ## Resources Check out a few resources that may come in handy when working with NestJS: - Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework. - For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy). - To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/). - Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks. - Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com). - Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com). - To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs). - Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com). ## Support Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). ## Stay in touch - Author - [Kamil Myśliwiec](https://twitter.com/kammysliwiec) - Website - [https://nestjs.com](https://nestjs.com/) - Twitter - [@nestframework](https://twitter.com/nestframework) ## License Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE). ## 优化的点 ### 打包脚本 "build": "nest build", //生产打包 "start": "nest start", // 启动项目 // 开发模式,监听文件变化自动重启 "start:dev": "nest start --watch", // 调试模式,监听文件变化自动重启 "start:debug": "nest start --debug --watch", // 生产模式,启动项目 "start:prod": "node dist/main", //用于生成整个项目的代码结构文档,包括类的继承关系、方法参数、返回值等详细信息 "doc": "compodoc -p tsconfig.json -s -d docs", //Swagger 主要用于生成 swagger api 文档 "doc:api": "npm run build && node dist/swagger" ## pkg 打包 | 方面 | 传统方式 | pkg 打包后 | | ------------ | ------------------------------------ | --------------------- | | 需要文件 | dist/ + node_modules/ + package.json | 单个可执行文件 | | 需要 Node.js | 是 | 否 | | 部署复杂度 | 高 | 低 | | 文件大小 | 较大(依赖多) | 较大(包含运行时) | | 启动命令 | node dist/main.js | ./app-binary | | 运行时依赖 | 需安装 Node.js 环境 | 无需安装 Node.js 环境 | ### pkg命令 "build:win": "npx pkg dist/main.js --target node18-win-x64", // 打包成windows可执行文件 "build:linux": "npx pkg dist/main.js --target node18-linux-x64", // 打包成linux可执行文件 "build:macos": "npx pkg dist/main.js --target node18-macos-x64", // 打包成macos可执行文件 "build:all": "npm run build:win && npm run build:linux && npm run build:macos", // 打包所有平台的可执行文件 ### TypeORM 总结 // TypeORM 里一对一关系的映射通过 @OneToOne 装饰器来声明,维持外键列的 Entity 添加 @JoinColumn 装饰器。 // 如果是非外键列的 Entity,想要关联查询另一个 Entity,则需要通过第二个参数指定外键列是另一个 Entity 的哪个属性。 // 可以通过 @OneToOne 装饰器的 onDelete、onUpdate 参数设置级联删除和更新的方式,比如 CASCADE、SET NULL 等。 // 还可以设置 cascade,也就是 save 的时候会自动级联相关 Entity 的 save。 // 增删改分别通过 save 和 delete 方法,查询可以通过 find 也可以通过 queryBuilder,不过要 find 的时候要指定 relations 才会获取到关联表查询的结果。 ### pipe 总结 Nest.js自带了三个开箱即用的管道:ValidationPipe、ParseIntPipe和ParseUUIDPipe, 其中ValidationPipe 配合class-validator就可以完美的实现我们想要的效果 (对参数类型进行验证,验证失败抛出异常)。 管道验证操作通常用在dto这种传输层的文件中,用作验证操作。首先我们安装两个需要的依赖包:class-transformer和class-validator ### nest 的生命周期 模块初始化:OnModuleInit 应用启动:OnApplicationBootstrap 模块销毁:OnModuleDestroy 应用关闭前:BeforeApplicationShutdown 应用正式关闭:OnApplicationShutdown Nest.js的生命周期是由Nest.js的内置模块实现的,我们可以根据需求实现自己的模块,也可以在这些生命周期钩子函数中做一些我们需要的操作。 在模块中 controller => service => module 文件依次执行 应用初始化时,会执行 OnModuleInit => OnApplicationBootstrap。 应用关闭app.close(),会执行 OnModuleDestroy => BeforeApplicationShutdown => OnApplicationShutdown。 ## 实战项目 ### config 全局配置文件 1、看 src/config module 里的代码,了解如何使用 config 模块来实现全局配置文件。 ### 调用第三方接口获取数据 1、看 src/weather module 里的代码,了解如何调用第三方接口获取天气数据。 ### 爬虫 nestjs 通关秘籍 1、看 src/excel module 里的代码,了解如何解析 excel 模块 然后通过puppeteer 来模拟浏览器操作。 ### SSE 1、看 src/sse module 里的代码,了解如何实现 Server-Sent Events。 ### 文件下载 1、看 src/large-file-download module 里的代码,了解如何实现大文件下载。 ### 大文件上传 1、看 src/large-file-upload module 里的代码,了解如何实现大文件分片上传。 ### 本地文件数据写入、读取,当数据库使用 1、看 src/book module 里的代码。读取、写入文件内容,来模拟图书数据的CRUD操作。 1、看 src/user module 里的代码。读取、写入文件内容,来模拟图书数据的CRUD操作。 ### 真实数据库操作 1、看 src/use-db module 里的代码,了解如何数据库操作。 ### session 实现登录状态保存 1、看 src/session module 里的代码,了解如何实现 session 登录状态保存。 2、浏览器相同地址,session会共享,不同浏览器不同地址,session 不会共享。 3、设置session 配置, 使用的是express-session,可以设置session的过期时间、存储位置、加密等。 ### jwt 实现登录状态保存 1、看 src/jwt module 里的代码,了解如何实现 jwt 登录状态保存。 2、实战 看src/login-register module 里的代码,了解如何实现登录注册功能。 以及如何使用 @Auth() 装饰器decorator 来保护需要登录才能访问的接口。 3、实战 看src/core/auth 里的代码,了解如何自定义 guard 来实现权限控制。以及如何使用 setMetadata 来设置接口的权限。 ### decorator 实现权限控制 1、看 src/core/auth/decorator 里的代码,了解如何自定义 decorator 来实现权限控制。以及如何使用 setMetadata 来设置接口的权限数据。 ### 权限控制 guard 实现 1、看 src/core/auth/guard 里的代码,了解如何自定义 guard 来实现权限控制。以及如何读取 setMetadata的权限数据。 ### 日志 (todo) 1、看 src/common/log module 里的代码,了解如何实现日志记录。 ### 发送邮件 1、看 src/common/mail module 里的代码,了解如何发送邮件。 ### 定时任务 1、看 src/activity module 里的代码,了解如何实现定时任务。 ### user-redis role sys permission 用户、角色、系统权限、接口权限 缓存到 redis 中 (TIDO: 待测试) src/activity module 里的代码,了解如何实现定时任务。 1、看 src/common/redis module 里的代码,了解如何缓存数据到 redis 中。 2、看 src/user-redis module 里的代码,了解如何缓存用户、角色、系统权限、接口权限到 redis 中。 3、看 src/permission 里的代码 了解权限模块。 4、看 src/sys 里的代码 了解系统权限模块。 5、看 src/role 里的代码 了解角色模块。 ### crawler 爬虫 实战 1、看 src/common/crawler module 里的代码,了解如何实现爬虫。 ### puppeteer 实战 爬虫 实战 1、看 src/excel module 里的代码,了解如何解析 excel 模块 然后通过puppeteer 来模拟浏览器操作。 2、js-splider module 里的代码,了解如何使用 js-splider 来实现爬虫。 ### 本项目为自己搭建脚手架,用于快速搭建 nestjs 项目。 1、参考 \nestjs\图书后台-实战项目\store-web-backend-master https://gitee.com/xrwork/store-web-backend-master.git 项目。 2、参考 \nestjs\项目源码\nest-study https://gitee.com/xrwork/nest-study.git 项目。 3、参考 \nestjs\项目源码\typeorm-mysql https://gitee.com/xrwork/typeorm-mysql.git 项目。 ## cheduler定时器 ### cron 表达式 '* * * * *' 的含义 这个表达式由五个星号组成,按顺序分别代表: - 分钟 (0-59): * 表示每分钟 - 小时 (0-23): * 表示每小时 - 日期 (1-31): * 表示每一天 - 月份 (1-12): * 表示每个月 - 星期几 (0-7,0 和 7 都表示星期日): * 表示每星期的每一天 所以 '* * * * *' 组合起来就表示 每分钟执行一次 。 '*/5 * * * * *' 是一个扩展版的 cron 表达式,用于定义定时任务的执行频率。下面是详细解释: ### 扩展版 cron 表达式的结构 这个表达式由六个字段组成,比标准 cron 表达式多了一个秒字段: 1. 秒 (0-59): */5 表示每隔5秒执行一次 2. 分钟 (0-59): * 表示每一分钟 3. 小时 (0-23): * 表示每一小时 4. 日期 (1-31): * 表示每一天 5. 月份 (1-12): * 表示每个月 6. 星期几 (0-7,0 和 7 都表示星期日): * 表示每星期的每一天 ### */5 * * * * * 含义解析 - */5 中的 / 是步长操作符,表示「每隔指定时间」 - 所以 */5 在秒字段中表示「从第0秒开始,每隔5秒执行一次」 - 组合起来,整个表达式 */5 * * * * * 就是「每5秒执行一次」 ### websocket 实战 1、看 src/socket module 里的代码,了解如何实现 socket.io 后端服务 2、看 socket-client 项目,了解如何实现 socket.io-client 前端客户端 ### 服务端获取第三方大文件,保存到本地demo 1、看 src/weather module 里的downloadFile代码,了解如何实现服务端获取第三方大文件,保存到本地。 ### emitter 事件发射器 实战 1、看 src/order-emitter module 里的代码,了解如何实现事件发射器。 ### 通过队列 实现生产 队列数据消费 1、看 src/queue module 里的代码,了解如何实现队列。以及如果实现队列中的数据消费功能 ### new Function 动态创建函数、 动态创建module,导入动态module 1、看 src/using-esm-packages/import-esm-package.ts 里的代码,了解如何使用 new Function 动态创建函数。 code 示例: ``` javascript // new Function([arg1, arg2, ...argN], functionBody) new Function('module', 'exports', 'require', 'return require(module)') new Function('module,require', 'return require(module)') const x = 5; const y = 10; // 如果需要在函数体内使用外部变量,需要作为参数传递 fn = new Function("a", "b", "return a + b + " + (x + y) + ";"); // fn = new Function("a", "b", "return a + b + " + 15 + ";"); console.log(fn(1, 2)); // 输出: 18 (1+2+15) fn = new Function("a", "b", "return a + b;"); console.log(fn(1, 2)); // 输出: 3 // 多个参数可以用逗号分隔的字符串 fn = new Function("a, b", "return a + b;"); console.log(fn(1, 2)); // 输出: 3 ``` ### child_process(exec 、spawn、fork、execFile) 4 种方法的区别 1、看 src/child-process module 里的代码,了解如何使用 child_process 模块。 2、(exec 、spawn、fork、execFile) 4 种方法的区别 1、exec 方法:用于执行 shell 命令,返回命令的输出结果。返回一个完整的bufer,bufer的大小是200k,如果超出会报错 2、spawn 方法:用于创建新的进程,返回子进程的句柄。用于执行一些实时获取的信息。因为spawn返回的是流边执行边返回 3、fork 方法:用于创建新的 Node.js 进程,返回子进程的句柄。 适合大量的计算,或者容易阻塞主进程操作的一些代码 4、execFile 方法:用于执行可执行文件,返回命令的输出结果。 ### nestjs 中只会处理TS 文件,不会处理JS 文件。 1、如果js需要在build的时候打包到dist,需要在nest-cli.json中 assets中进行配置 ### 微服务 microservice 1、微服务 是指将一个应用程序分解为多个小的、独立的服务,每个服务都运行在自己的进程中运行,并且通过网络通信TCP进行交互。 2、微服务和微服务之间一般不是用 http 来通信的。因为 http 的请求响应会携带大量的 header 3、微服务和微服务之间一般用 tcp 来通信的。。 4、如果微服务中的方法是 @MessagePattern 声明的方法,主应用需要用 send 方法调用。 如果并不需要返回消息的话,可以用 @EventPattern 声明。而 @EventPattern 声明的方法,这边要用 emit 方法调用。 从抓包我们可以得出结论: 微服务之间的 tcp 通信的消息格式是 json 如果是 message 的方式,需要两边各发送一个 tcp 包,也就是一问一答的方式 如果是 event 的方式,只需要客户端发送一个 tcp 的包 ## todo 工作流 bpmn.js + Node.js_构建高效的后端工作流处理系统 rabbitMq kafka 秒杀功能