NodeJS基础知识

文章目录

      • **1. Node.js平台与架构**
        • **1.1 Node.js简介**
        • **1.2 事件循环(Event Loop)**
      • **2. JavaScript基础知识**
        • **2.1 ECMAScript版本**
        • **2.2 变量、数据类型、运算符**
        • **2.3 函数**
        • **2.4 类与面向对象编程**
      • **3. Node.js核心API**
        • **3.1 全局对象与内置模块**
        • **3.2 文件系统(fs)**
        • **3.3 网络编程**
        • **3.4 子进程管理**
        • **3.5 定时任务**
        • **3.6 加密与安全**
        • **3.7 路径处理**
      • **4. Node.js开发工具与实践**
        • **4.1 npm与包管理**
        • **4.2 开发流程与工具**
        • **4.3 调试与性能分析**
      • **5. Web框架与中间件**
        • **5.1 Express**
        • **5.2 Koa**
        • **5.3 Fastify**
        • **5.4 GraphQL**
      • **6. 数据存储与数据库**
        • **6.1 基础数据库概念**
        • **6.2 SQL数据库(如MySQL、PostgreSQL)**
        • **6.3 NoSQL数据库(如MongoDB、Redis)**
      • **7. 微服务与云原生技术**
        • **7.1 微服务架构**
        • **7.2 Docker容器化**
        • **7.3 云服务**
      • **8. 安全性与最佳实践**
        • **8.1 安全性**
        • **8.2 性能优化**
        • **8.3 日志与监控**
      • **9. 高级主题(根据学员兴趣与需求选择)**
        • **9.1 TypeScript**
        • **9.2 Serverless架构**
        • **9.3 GraphQL实战**
        • **9.4 实时应用开发**
      • 案例展示

以下是对Node.js基础知识体系的阐述,涵盖各主题的具体内容、示例和关联知识点。

1. Node.js平台与架构

1.1 Node.js简介
  • 起源与发展:了解Node.js的历史背景、由Ryan Dahl创造、基于V8 JavaScript引擎、由Node.js基金会(现OpenJS Foundation)管理。
  • 设计哲学:理解Node.js的设计目标,如单线程、非阻塞I/O、事件驱动、轻量级、高性能。
  • 应用场景:服务器端开发(如Web服务器、API服务)、命令行工具(如脚本、构建工具)、桌面应用(借助Electron等框架)、实时应用(如聊天室、游戏服务器)等。
1.2 事件循环(Event Loop)
  • 单线程模型:理解Node.js的单线程执行环境与JavaScript的单线程特性。
  • 异步I/O:理解Node.js如何通过libuv库实现异步非阻塞I/O操作,避免阻塞主线程。
  • 事件队列与回调队列:理解事件循环如何处理不同的任务类型(宏任务、微任务),以及任务进入和退出事件循环的过程。
  • 定时器与process.nextTick():理解定时器在事件循环中的位置,以及process.nextTick()与定时器的区别。

2. JavaScript基础知识

2.1 ECMAScript版本
  • ES6(ES2015):let/const、模板字符串、箭头函数、解构赋值、默认参数、剩余参数、展开运算符、类与模块、Map/Set/WeakMap/WeakSet、Promise、for…of、迭代器与生成器等。
  • 后续版本:ES7(ES2016)的async/await、ES8(ES2017)的Object.values/Object.entries、ES9(ES2018)的异步迭代器与异步生成器、ES10(ES2019)的Array.flat()等新特性。
2.2 变量、数据类型、运算符
  • 变量声明:var、let、const的区别,块级作用域与函数作用域。
  • 基本数据类型:Number、String、Boolean、Null、Undefined、Symbol、BigInt,以及它们的特性和方法。
  • 复杂数据类型:Object、Array、Function、Date、RegExp等,以及它们的创建、属性访问、方法调用。
  • 运算符:算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、解构赋值、扩展运算符等。
2.3 函数
  • 定义与调用:普通函数、匿名函数、具名函数、箭头函数的定义与调用。
  • 参数:默认参数、剩余参数、解构参数。
  • 作用域:全局作用域、局部作用域、块级作用域、闭包。
  • 返回值:显式返回、隐式返回、void返回。
  • 高级特性:递归、高阶函数、柯里化、函数组合、函数记忆化。
2.4 类与面向对象编程
  • 类与实例:类的定义、构造函数、实例化过程、this关键字。
  • 成员:属性、方法、访问修饰符(ES6)。
  • 继承:extends关键字、super关键字、原型链、Mixin模式。
  • 封装:私有字段(ES12)、私有方法(ES12)、getter/setter。
  • 多态:接口、抽象类(TypeScript)、鸭子类型。

3. Node.js核心API

3.1 全局对象与内置模块
  • 全局对象globalprocessBufferconsole__dirname__filename等。
  • 内置模块
    • util:提供实用工具函数,如util.inspect()util.promisify()
    • events:事件发射器,用于实现事件驱动编程。
    • stream:流处理,如Readable、Writable、Duplex、Transform等流类型。
    • assert:断言模块,用于测试代码假设。
3.2 文件系统(fs)
  • 文件操作fs.readFile(), fs.writeFile(), fs.appendFile()等。
  • 目录操作fs.mkdir(), fs.readdir(), fs.rmdir()等。
  • 同步与异步:理解同步与异步API的区别,何时使用哪种方式。
  • 文件监视fs.watch(),监测文件或目录变化。
3.3 网络编程
  • HTTP/HTTPS服务器:使用http.createServer()创建服务器,处理请求与响应。
  • HTTP/HTTPS客户端:使用http.request()发起请求,处理响应数据。
  • TCP/UDP套接字:使用net.createServer()创建TCP服务器,dgram.createSocket()创建UDP套接字。
  • HTTPS证书与安全:配置SSL/TLS证书,理解HTTPS工作原理。
3.4 子进程管理
  • spawn()、exec()与fork():理解三种创建子进程的方式及适用场景。
  • 进程间通信:使用child_process模块提供的管道、IPC通道、事件监听等方式实现进程间通信。
  • 进程信号:理解Unix信号,使用process.on('SIGINT', ...)处理中断等信号。
3.5 定时任务
  • setTimeout()、setInterval():设置一次性或周期性定时任务。
  • setImmediate()与process.nextTick():理解两者在事件循环中的执行时机,何时使用。
3.6 加密与安全
  • 哈希:使用crypto.createHash()计算哈希值。
  • 加密与解密:对称加密(如AES)、非对称加密(如RSA),使用crypto.createCipher()crypto.createCipheriv()crypto.createDecipher()等。
  • 签名与验证:使用crypto.createSign()crypto.createVerify()进行数字签名与验证。
3.7 路径处理
  • 路径解析path.parse(),解析路径为对象。
  • 路径拼接path.join(), path.resolve(),构建或解析绝对路径。
  • 路径规范化path.normalize(),规范化不规则路径。
  • 路径匹配path.extname(), path.basename(), path.dirname()等辅助方法。

4. Node.js开发工具与实践

4.1 npm与包管理
  • 初始化项目:使用npm init创建package.json
  • 安装与管理依赖npm installnpm uninstallnpm updatenpm ci等命令。
  • 版本控制:理解语义化版本(SemVer),使用^~等符号管理依赖版本。
  • npm scripts:定义与执行自定义脚本,如"start": "node app.js"
  • npx:临时执行npm包中的命令,如npx create-react-app my-app
4.2 开发流程与工具
  • nodemon:自动重启Node.js应用,监控文件变化。
  • ts-node:无需编译直接运行TypeScript文件。
  • eslint:配置与执行代码风格检查,遵循编码规范。
  • jest/mocha/chai:编写单元测试、集成测试,使用断言库验证预期行为。
4.3 调试与性能分析
  • node inspect:启动Node.js应用进行调试,使用Chrome DevTools或ndb
  • Visual Studio Code调试:配置VSCode调试Node.js应用,设置断点、查看变量、步进等。
  • 性能分析:使用performance.now()process.hrtime()测量时间,使用perf_hooks模块进行CPU分析,使用--inspect-brk配合Chrome DevTools进行CPU和内存分析。

5. Web框架与中间件

5.1 Express
  • 基础使用:创建Express应用,定义路由,处理请求与响应。
  • 中间件:理解中间件概念,编写自定义中间件,使用顺序与错误处理中间件。
  • 路由参数:使用:paramreq.paramsreq.queryreq.body处理路由参数。
  • 模板引擎:集成EJS、Pug等模板引擎,渲染视图。
  • 静态文件服务:使用express.static()托管静态资源。
  • 错误处理:全局与路由级别的错误处理中间件。
5.2 Koa
  • 核心理念:理解Koa的极简设计理念,基于中间件的洋葱模型。
  • Context:使用ctx对象代替reqres,处理请求与响应。
  • 中间件:编写Koa中间件,利用async/await实现更简洁的异步控制流。
  • 错误处理:使用try/catch结合中间件捕获并处理错误。
  • Koa生态系统:了解Koa配套的中间件库,如koa-routerkoa-bodyparser等。
5.3 Fastify
  • 性能优化:理解Fastify对性能的关注,如使用原生Promises、严格的类型检查、预编译路由等。
  • 路由注册:使用.route()方法注册路由,支持多种HTTP方法。
  • 插件系统:理解插件机制,编写与使用自定义插件。
  • 错误处理:使用.catch()方法注册全局错误处理器。
  • Schema验证:利用fastify-schema或其他JSON Schema库进行请求与响应数据验证。
5.4 GraphQL
  • 基本概念:理解GraphQL查询语言、类型系统、resolver函数、schema定义。
  • Apollo Server:使用Apollo Server创建GraphQL服务器,配置schema与resolver。
  • 查询与mutation:编写查询与mutation操作,处理查询结果。
  • 订阅(可选):理解实时数据更新的需求,介绍GraphQL subscriptions的基本概念和实现方式。
  • Apollo Client(可选):在客户端使用Apollo Client进行GraphQL查询,缓存管理与优化。

6. 数据存储与数据库

6.1 基础数据库概念
  • 关系型数据库:理解表结构、SQL查询、ACID特性。
  • NoSQL数据库:理解文档型、键值型、列族型、图形数据库的特点与适用场景。
  • 数据库连接池:理解连接池的作用,配置与使用Node.js中的数据库连接池模块。
6.2 SQL数据库(如MySQL、PostgreSQL)
  • 驱动程序:使用mysql2pg等库连接数据库。
  • CRUD操作:编写SQL查询语句或使用ORM(如Sequelize、TypeORM)进行增删改查。
  • 事务:使用事务保证数据一致性,处理回滚与提交。
  • 预编译语句与参数化查询:防止SQL注入,提高查询性能。
6.3 NoSQL数据库(如MongoDB、Redis)
  • 驱动程序:使用mongodbredis等库连接数据库。
  • 数据模型与查询:理解文档模型,编写CRUD操作,使用聚合框架(如MongoDB的Aggregation Pipeline)进行复杂查询。
  • Redis数据结构:使用字符串、哈希、列表、集合、有序集合进行数据存储与检索。
  • 发布/订阅(Redis):使用Redis实现消息发布与订阅功能。

7. 微服务与云原生技术

7.1 微服务架构
  • 微服务定义:理解微服务的核心特征,如业务边界清晰、独立部署、轻量级通信等。
  • 服务发现:使用Consul、Etcd、Zookeeper等服务发现工具。
  • API网关:使用Kong、Traefik、Ambassador等API网关实现统一入口、认证授权、限流熔断等功能。
  • 服务间通信:RESTful API、gRPC、Message Queues(如RabbitMQ、Kafka)的选择与使用。
7.2 Docker容器化
  • Docker基础:理解镜像、容器、Dockerfile的概念,编写Dockerfile构建应用镜像。
  • Docker Compose:使用Compose编排多容器应用,管理依赖与网络。
  • Docker Swarm/Kubernetes:理解容器编排平台,部署与管理微服务集群。
7.3 云服务
  • 基础设施即服务(IaaS):使用AWS EC2、Google Compute Engine、Azure Virtual Machines等创建与管理虚拟机。
  • 平台即服务(PaaS):理解Heroku、Google App Engine、Azure App Service等服务,简化应用部署与运维。
  • 函数即服务(FaaS):使用AWS Lambda、Google Cloud Functions、Azure Functions实现无服务器架构。

8. 安全性与最佳实践

8.1 安全性
  • 认证与授权:实现用户认证(如JWT、OAuth)、角色权限管理。
  • 密码学:正确使用哈希、盐值、加密技术保护敏感数据。
  • 跨站脚本攻击(XSS)与跨站请求伪造(CSRF)防护:理解攻击原理,使用 helmet、CSP 等工具防御。
  • 安全配置:配置HTTPS、严格传输安全(HSTS)、Content Security Policy等。
8.2 性能优化
  • 服务器性能:使用PM2进行进程管理,负载均衡,优化CPU、内存使用。
  • 网络性能:压缩、缓存、CDN、HTTP/2、QUIC等技术提升网络传输效率。
  • 数据库性能:索引优化、查询优化、分页策略、读写分离、缓存(如Redis)。
8.3 日志与监控
  • 日志记录:使用winston、pino等库记录日志,结构化日志与日志级别。
  • 错误追踪:使用Sentry、Rollbar等服务收集、分析、报警异常信息。
  • 性能监控:使用New Relic、Datadog、Prometheus等监控系统资源、应用性能、数据库性能等指标。

9. 高级主题(根据学员兴趣与需求选择)

9.1 TypeScript
  • 类型系统:理解类型声明、接口、泛型、枚举、类型推断等。
  • Node.js与TypeScript:配置tsconfig.json,使用tsc编译,使用ESM或CommonJS模块。
  • 类型兼容性与高级类型:了解类型兼容性规则,使用条件类型、映射类型、类型别名等高级特性。
9.2 Serverless架构
  • 无服务器概念:理解Serverless架构的优势与挑战,使用场景。
  • AWS Lambda:创建、配置、部署Lambda函数,使用API Gateway、S3、DynamoDB等服务。
  • Google Cloud Functions / Azure Functions:对比不同云服务商的Serverless平台。
9.3 GraphQL实战
  • Schema设计:根据业务需求设计合理的GraphQL schema。
  • ** DataLoader**:使用DataLoader解决N+1查询问题。
  • Apollo Federation:构建分布式GraphQL架构,实现服务间联合查询。
9.4 实时应用开发
  • WebSocket:使用ws、socket.io库实现WebSocket服务器与客户端,处理连接、消息收发、心跳检测。
  • Server-Sent Events (SSE):理解SSE原理,实现简单的服务器推送。

以上是一个深入学习Node.js的详细知识体系,涵盖了从基础到进阶的多个层面,并包括了与Node.js开发密切相关的周边技术与最佳实践。这样的课程设计旨在帮助学员系统地掌握Node.js技术栈,并具备实际开发复杂应用程序的能力。

案例展示

以下是一个使用Node.js、Express框架和MongoDB数据库创建简单待办事项(Todo List)应用程序的例子。这个例子展示了Node.js基础知识体系中的一些关键点,包括Express路由、中间件、数据库操作等。

首先,确保已安装Node.js、npm以及MongoDB。然后创建一个新的项目目录,初始化项目并安装所需依赖:

mkdir todo-app
cd todo-app
npm init -y
npm install express mongoose body-parser

创建以下文件结构:

todo-app/
│   index.js
│   package.json
│
└───models/
│   │   todo.js
│
└───routes/
│   │   todos.js

index.js(主入口文件):

const express = require('express');
const bodyParser = require('body-parser');
const routes = require('./routes/todos');

const app = express();
app.use(bodyParser.json());

// 使用定义的路由
app.use('/todos', routes);

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

models/todo.js(定义Todo模型):

const mongoose = require('mongoose');

const TodoSchema = new mongoose.Schema({
  title: { type: String, required: true },
  completed: { type: Boolean, default: false },
});

module.exports = mongoose.model('Todo', TodoSchema);

routes/todos.js(定义路由和处理函数):

const express = require('express');
const router = express.Router();
const Todo = require('../models/todo');

// 获取所有待办事项
router.get('/', async (req, res) => {
  try {
    const todos = await Todo.find();
    res.json(todos);
  } catch (err) {
    res.status(500).json({ error: 'Failed to fetch todos' });
  }
});

// 创建新的待办事项
router.post('/', async (req, res) => {
  const newTodo = new Todo(req.body);
  try {
    await newTodo.save();
    res.status(201).json(newTodo);
  } catch (err) {
    res.status(400).json({ error: 'Failed to create todo' });
  }
});

// 更新待办事项状态
router.patch('/:id', async (req, res) => {
  const { id } = req.params;
  const updates = Object.keys(req.body);
  const allowedUpdates = ['title', 'completed'];
  const isValidOperation = updates.every((update) => allowedUpdates.includes(update));

  if (!isValidOperation) {
    return res.status(400).json({ error: 'Invalid update operation' });
  }

  try {
    const todo = await Todo.findByIdAndUpdate(id, req.body, { new: true, runValidators: true });
    if (!todo) {
      return res.status(404).json({ error: 'Todo not found' });
    }
    res.json(todo);
  } catch (err) {
    res.status(400).json({ error: 'Failed to update todo' });
  }
});

// 删除待办事项
router.delete('/:id', async (req, res) => {
  const { id } = req.params;

  try {
    const deletedTodo = await Todo.findByIdAndDelete(id);
    if (!deletedTodo) {
      return res.status(404).json({ error: 'Todo not found' });
    }
    res.json(deletedTodo);
  } catch (err) {
    res.status(500).json({ error: 'Failed to delete todo' });
  }
});

module.exports = router;

最后,确保MongoDB服务正在运行,并在index.js文件中添加MongoDB连接代码(替换为实际的MongoDB连接字符串):

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/todo-app', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true,
});

const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
  console.log('Connected to MongoDB');
});

现在,启动应用:

node index.js

应用将在本地运行于http://localhost:3000。你可以使用Postman或其他HTTP客户端测试以下API端点:

  • GET /todos:获取所有待办事项
  • POST /todos(Body: { "title": "Example Todo" }):创建新的待办事项
  • PATCH /todos/:id(Body: { "completed": true }):更新待办事项状态
  • DELETE /todos/:id:删除待办事项

这个例子展示了如何使用Node.js、Express和MongoDB构建一个简单的待办事项应用程序,涉及到了路由定义、中间件使用、数据库操作(CRUD)等基础知识。通过实践此类项目,可以更好地理解和掌握Node.js基础知识体系中的相关概念。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下载及安装OpenSSL

文章目录 前言一、OpenSSL下载二、OpenSSL安装1.上传下载好的安装包到服务器2.解压3.切换目录4.配置config5.编译6.安装7.备份旧版本OpenSSL7.创建软链接8.添加OpenSSL动态链接库9.更新库缓存10.查看OpenSSL版本验证安装是否成功 前言 一般系统会自带有OpenSSL,我们…

OpenHarmony实战开发-媒体查询 (@ohos.mediaquery)

概述 媒体查询作为响应式设计的核心,在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景: 针对设备和应用的属性信息(比如显示区域、深浅色、分辨率)&#xff0…

大数据第五天(操作hive的方式)

文章目录 操作hive的方式hive 存储位置hive 操作语法创建数据表的方式 操作hive的方式 hive 存储位置 hive 操作语法 创建数据表的方式 – 创建数据库 create database if not exists test我们创建数据库表的时候,hive是将我们的数据自动添加到数据表中&#xf…

Matlab|交直流系统潮流计算(含5种控制模式)

目录 1 主要内容 程序参考流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《交直流系统潮流计算及相互关联特性分析》,采用5种交直流潮流控制方式:1.定电流定电压 2.定电流定熄弧角 3.定功率定电压 4.定功率定熄弧角 5.定触发角…

C++进阶:多态

目录 一、多态的概念 二、多态的实现 1.多态的实现条件 2.虚函数 3.虚函数的重写(覆盖) 三、概念比较 四、抽象类 1.概念 2.接口继承与实现继承 一、多态的概念 在生活中我们通常会遇到以下的一个场景:领支付宝的红包。 明明都是同一个红包,不同…

Qt配置CMake出错

一个项目需要在mingw环境下编译Opencv源码,当我用Qt配置opencv的CMakeLists.txt时,出现了以下配置错误: 首先我根据下述博文介绍,手动配置了CMake,但仍不能解决问题。 Qt(MinGW版本)安装 - 夕西行 - 博客园 (cnblogs.…

鸿蒙(HarmonyOS)性能优化实战-Trace使用教程

概述 OpenHarmony的DFX子系统提供了为应用框架以及系统底座核心模块的性能打点能力,每一处打点即是一个Trace,其上附带了记录执行时间、运行时格式化数据、进程或线程信息等。开发者可以使用SmartPerf-Host调试工具对Trace进行解析,在其绘制…

人工智能如何提高公司效率的 5 种方法

人工智能是当今最热门的话题之一,但并不是每个人都了解其对商业的价值规模。由此可见,现有的AI技术可以将企业的生产力提升40%。 在机器学习的帮助下,Netflix 利用自动化个性化推荐每年赚取 10 亿美元。当公司使用人工智能时,34%…

线性代数:抽象向量空间

一、说明 有些函数系列极具线性代数的向量特征。这里谈及多项式构成函数的线性代数意义。问题是这个主题能展开多少内涵?请看本文的论述。 二、线性空间和向量 让我先问你一个简单的问题。什么是向量?为了方便起见,二维箭头从根本上说是平…

Web前端一套全部清晰 ③ day2 HTML 标签综合案例

别让平淡生活&#xff0c;耗尽所有向往 —— 24.4.26 综合案例 —— 一切都会好的 网页制作思路&#xff1a;从上到下&#xff0c;先整体到局部&#xff0c;逐步分析制作 分析内容 ——> 写代码 ——>保存——>刷新浏览器&#xff0c;看效果 <!DOCTYPE html> &l…

IDEA生成测试类

方法一 具体流程: 选中要生成的测试类------------>选择code选项------------>选择Generate选项---------->选择test选项---------->选择要生成的方法 第一步: 光标选中需要生成测试类的类 找到code选项 选中Generate选项 选中test选项 选中你要生成的测试…

【智能算法】囊状虫群算法(TSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;S Kaur等人受到囊状虫群自然行为启发&#xff0c;提出了囊状虫群算法&#xff08;Tunicate Swarm Algorithm, TSA&#xff09;。 2.算法原理 2.1算法思想 TSA模拟了囊状虫群在导…

Scala的函数至简原则

对于scala语言来说&#xff0c;函数的至简原则是它的一大特色。下面让我们一起来看看分别有什么吧&#xff01; 函数至简原则&#xff1a;能省则省&#xff01; 初始函数 def test(name:String):String{return name }1、return可以省略&#xff0c;Scala会使用函数体的最后一…

什么是用户体验(UX)文案,为什么它很重要?

网上购物如今比以往任何时候都更加相关。所以我们将以此为例说明什么是用户体验&#xff08;UX&#xff09;文案&#xff0c;以及为什么它很重要。 假设你去了一个在线商店。你需要执行一系列操作&#xff1a; 找到合适的部分选择你感兴趣的产品弄清楚它们是什么&#xff0c;…

Access2019直接将数据导入SQL Server数据库中,再直接链接回来

Access2019 的数据表等&#xff0c;除了通过 SSMA 导入数据库外&#xff0c;还可以利用access2019 自身的外部数据导出功能来达到目的。本文将详细介绍这一操作过程。 一、命令行操作阶段 1.以SA这一超级用户登录SQL Server&#xff0c;创建一个数据库&#xff0c;例如“个人…

PyQt5中QTablewidget生成右键菜单

QTablewidget生成右键菜单&#xff0c;需要自定义一个QTablewidget类 import sys from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QMenu, QAction, QDialog from PyQt5.QtCore import Qt from PyQt5 import QtCoreclass CustomTableWidget(QTabl…

数据结构-二叉树-堆(二)

一、建堆的时间复杂度问题 1、除了向上调整建堆&#xff0c;我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走&#xff0c;可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数…

架构师的六大生存法则与价值创造

目录 什么影响架构的成败 架构师的六大生存法则 一、所有的架构规划必须有且只有一个正确的目标 二、架构活动需要尊重和顺应人性 三、架构活动在有限的资源下最大化商业价值 四、架构师要考虑依赖的商业模块和技术生命周期 五、架构师为什么要关注技术体系的外部适应性…

【InternLM】大模型的评测——OpenCompass

1. OpenCompass简介 1.1 基本介绍 大模型开源开放评测体系 “司南” (OpenCompass2.0)由上海人工智能实验室科学家团队发布&#xff0c;用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下&#xff1a; 开源可复现&#xff1a;提供公平、公开、可复现的大模型…

最详细步骤解决:Apps targeting Android12 and higher are required to specify...

问题原因&#xff1a; 当targetSdkVersion>31时&#xff0c;需要在AndroidManifest.xml中配置android:exported的值&#xff0c;该值为boolean类型。 android:exported解释&#xff1a; activity 是否可由其他应用的组件启动&#xff1a; 如果设为 "true"&#…