Node.js学习
概述
Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,允许在服务器端运行 JavaScript 代码。它采用事件驱动和非阻塞 I/O 模型,适合构建高性能、可扩展的网络应用,尤其擅长处理实时应用和大规模数据密集型场景
背景
-
JavaScript 的普及
JavaScript 最初是浏览器端的脚本语言,但随着 Web 2.0 和 AJAX 技术的兴起,JavaScript 在前端开发中变得至关重要。开发者希望能在服务器端也使用 JavaScript,以实现前后端语言统一,简化开发流程。 -
高性能服务器需求
传统服务器(如 Apache)采用多线程模型处理请求,每个请求占用一个线程,资源消耗大且难以应对高并发。Node.js 通过事件驱动和非阻塞 I/O模型,解决了这一问题,能够高效处理大量并发请求。 -
Chrome V8 引擎的出现
2008 年,Google 发布了 Chrome 浏览器,其 JavaScript 引擎 V8 性能卓越,能够快速编译和执行 JavaScript 代码。Node.js 的创始人 Ryan Dahl 受到启发,利用 V8 引擎构建了一个服务器端运行时环境,使 JavaScript 能够脱离浏览器运行。JavaScript 代码直接编译为机器码,而不是解释执行,从而大幅提升执行速度。 -
事件驱动编程的兴起
事件驱动编程模型在 GUI 和网络编程中广泛应用,Ryan Dahl 认为这种模型非常适合处理高并发的网络请求。Node.js 采用事件循环机制,能够高效处理 I/O 操作,避免线程阻塞。 -
Ryan Dahl 的初衷
Ryan Dahl 在开发 Node.js 时,目标是创建一个轻量级、高效的平台,专注于实时应用和高并发场景。他希望通过非阻塞 I/O 和事件驱动模型,解决传统服务器的性能瓶颈。 -
开源社区的推动
Node.js 于 2009 年开源后,迅速吸引了大量开发者。其轻量级、高性能的特点,加上 JavaScript 的广泛使用,使其在短时间内获得了广泛关注和支持
安装
node.js官网
无BOM和DOM
node,js中顶级对象是globle对象
fs(file system)模块
与硬盘交互
导入fs模块
let fs=require("fs")
写入|追加|文件流式
writeFile|appendFile|createWriteStream
打开文件是需要消耗资源的,文件流式可以减少打开关闭文件的次数,适用于大文件高频次的写入
异步
let fs=require("fs")
fs.writeFile("./testFile.txt","测试file",err=>{if(err){console.log("写入失败")}else{console.log("写入成功")}
})fs.appendFile("./writeFile.txt","asdasd",err=>{if(err){}else{console.log("追加成功")}
})let ws=fs.createWriteStream("./writeFile.txt")
ws.write("阿萨德哈手机侃大山客户卡几哈")
ws.close()
同步
同步无callback函数
writeFileSync|appendFileSync
读取
readFile|readFileSync|createReadStream
let rf=fs.readFile("./writeFile.txt",(err,data)=>{if(err){}else{console.log(data.toString())}
})
// chunk 循环去读,一次只能读一块:65536字节=64KB
rs=fs.createReadStream("writeFile.txt")
rs.on('data',chunk=>{console.log(chunk.toString())
})
// 读取结束
rs.on("end",()=>{console.log("读取完成")
})
读取-写入
let data=fs.readFileSync("./writeFile.txt")
fs.writeFileSync("./writeFileCopy.txt",data)let rs=fs.createReadStream("./writeFile.txt")
let ws=fs.createWriteStream("./writeFileCopyStream.txt")rs.on("data",chunk=>{ws.write(chunk)})rs.on("end",()=>{console.log("读取完成")})
重命名==移动
rename|renameSync
fs.rename("./writeFileCopyStream.txt","./1.txt",rr=>{
})fs.rename("1.txt","./a/11.txt",err=>{console.log(err)
})
删除
unlink|unlinkSync
fs.unlink("./a/11.txt",err=>{if(err){}else{console.log("删除成功")}
})
node.js 14 新增
rm|rmSync
fs.rm("./writeFileCopy.txt",err=>{if(err){}else{console.log("删除成功")}
})
文件夹
创建文件夹
fs.mkdir("a"err=>{
console.log(err)
})
递归创建
fs.mkdir("a/b/c",{recursive:true},err=>{console.log(err)
})
删除文件夹
fs.rmdir("aa",err=>{})
读取文件夹
fs.readdir("img",(err,data)=>{if(!err){console.log(data)}
})
补充: data.isDirectory() :是否文件夹 data.isFile():是否文件
路径问题
fs.writeFile("./aa.txt","adasdsad",err=>{console.log(err)
})
其创建文件以命令行为维度而不是当前文件所在位置为维度
绝对路径
__dirname:获取项目的绝对路径
path 模块
require(“path”)
resolve 路径拼接
console.log(path.resolve(__dirname,"test.html"))
sep 当前操作系统分隔符
console.log(path.sep)
路径解析
console.log(path.parse("C:\\Users\\xsx\\Desktop\\test\\hello.js")){root: 'C:\\',dir: 'C:\\Users\\xsx\\Desktop\\test',base: 'hello.js',ext: '.js',name: 'hello'
}
获取文件名|文件目录 扩展名
let str="C:\\Users\\xsx\\Desktop\\test\\hello.js"
console.log(path.basename(str))
console.log(path.dirname(str))
console.log(path.extname(str))//
hello.js
C:\Users\xsx\Desktop\test
.js
http 模块
http资料
let http=require("http")let server=http.createServer((request,response)=>{response.end("hellt http server")
})
// 设置端口--回调
server.listen(9000,()=>{console.log("server start")
})
request
- request.url
- request.method
- request.headers:返回对象
获取参数-post
// 声明一个变量let body=""// 绑定data 事件request.on("data",chunk=>{body+=chunk})// 绑定 end 事件request.on("end",()=>{console.log(body)console.log("request end")})
url 模块
let url=require("url")
获取参数
get
let url=require("url")let server=http.createServer((request,response)=>{console.log(request.method)let urlParse=url.parse(request.url)console.log(urlParse)
//
Url {protocol: null,slashes: null,auth: null,host: null,port: null,hostname: null,hash: null,search: '?name=sux&age=11',query: 'name=sux&age=11',pathname: '/search',path: '/search?name=sux&age=11',href: '/search?name=sux&age=11'
}})
// 设置端口--回调
server.listen(9000,()=>{console.log("server start")
})
response
- 设置状态码:response.statusCode
- 设置响应头: response.setHeader(key,value)
response.setHeader("content-type","application/json")`在这里插入代码片`
- 设置响应体: response.write(),response.end()
write可以有多个,但最后以唯一一个end()结束,或者直接end(value)
资源类型(MIME)
媒体类型(mime类型)是一种标准,用来表示文档、文件或字节流的性质和格式
HTTP服务可以设置响应头Content-Type来表面响应体的MIME类型,浏览器会根据类型去如何处理资源
- html :text/html
- css: text/css
- js:text/javascript
- png:image/png
- jpg:image/jpeg
- gif:image/gif
- mp4:video/mp4
- mp3:audio/mpeg
- json:application/json
对于未知资源类型:applicaton/octet-stream类型,浏览器遇到该类型时会对响应体内容进行独立存储,也就是我们常见的下载
模块(CommonJS)
导出:exports
核心:exports=module.exports={} 是一个对象
exports.name=value
module.exports 是 CommonJS 模块系统的默认导出对象。
module.exports="asdasdasdasd"module.exports={testModule,testModule2}
导入:require
const module1=require("./module1.js")
- 导入时的路径写相对路径,且不能省略 ./或…/
- 导入可以省略js或json后缀名
- 如果导入的是文件夹,则首先会检测文件夹下package.json的main属性对应的文件。如果存在,则导入。如果不存在package或者main则或导入其文件夹下index.js或index.json。否则报错。
注:js或json同时存在同名,则只会导入js - 导入node.js内置模块是,可直接require模块名字
包管理工具
- npm
- yarn
- cnpm
npm (node package manager)
npm 是node.js官方内置的包管理工具,在node.js会默认安装npm
查看版本
初始化包
注: npm init -y 或 npm init --yes 会默认快速创建
搜索包
- 命令行
npm s/search 关键字
- 去网站搜索 https:// www.npmjs.com
安装
npm i/install :根据package.json和package-locjk.json的依赖声明安装整个项目依赖
npm i/install <报名>// npm install uniq
npm 安装指定版本的包
npm i <包名@版本号>
npm 删除包
npm r/remove <包名>
// 全局删除
nppm r/remove -g <包名>
运行之后文件夹下会产生两个资源
- node_modules 用来存放下载的包
- package-lock 包的锁定文件,用来锁定包版本
引入
const uniq=require("uniq")const arrp=[1,2,3,4,5,5,5,5]
uniq(arrp)
require导入npm包的基本流程
在当前文件下node_modules下去寻找,未找到会到上级目录的node_modules去寻找,直至到磁盘根目录。
生成、开发、全局版本
- npm i -S 默认
- npm i -D
- npm i -g
nodemon: 自动重启node程序
npm root -g: 全局包的安装位置
配置命令别名
通过配置命令别名可以更简单的执行命令
配置package.json的script属性
"scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev":"node test.js"},
npm run dev
npm 配置淘宝镜像
npm config set registry https://registry npmmirror.com/
cnpm(了解)
cnpm是淘宝构建构建的npmjs,con的完整镜像,也称淘宝镜像,网址https://npmmirror.com/
cnpm服务部署在国内阿里云服务器上,可以调高包的下载速度。
淘宝镜像为只读与官方同步频率为10分钟一次
安装
通过npm命令去安装cnpm
npm install -g cnpm --register=https://npmmirror.com/
cnpm与npm使用命令相同
NVM (node version manager)
解决:多个node.js版本的下载、切换
- nvm list available 显示所有可以下载的node.js版本
- nvm list 显示已安装的node.js版本
- nvm install <版本号> 安装
- nvm user <版本号> 使用
Express
express是一个基于node.js平台极简、灵活的WEB应用开发框架。官网地址:https://erpressjs.com.cn/
安装
npm intall express
创建
const express=require("express")// 创建请求应用
let app=express()
// 创建路由请求
app.get("/home",(req,res)=>{res.setHeader("content-type","text/html;charset=utf-8")res.write("阿萨德哈健康会尽快")res.end()
})
// 监听端口,启动服务
app.listen(9000,()=>{console.log("启动正常")
})
路由
官网定义:路由确定了应用程序如何响应客户端对特定端点的请求
路由的组成
一个路由的组成有请求方法、路径和回调函数
格式:
app.<method>(路径,回调函数)
method:
- get
- post
- all
request
- request.method
- request.url
- request.pathname
- request.ip
- request.headers
- request.get(name) :获取请求头中指定的name
- requset.query:参数
路由参数
占位符 :id
// 请求路径:http://127.0.0.1:9000/9999.htmlapp.get("/:id.html",(req,res)=>{console.log(req.params.id) // 9999})
reseponse
express 中间件(类似java–filter)
介绍
中间件本质上是一个函数
作用
中间件的作用就是使用函数封装的公共操作,简化代码。
类型
- 全局中间件
- 路由中间件
全局中间件
全局配置
const express= require("express")
const fs=require("fs")
const path=require("path")
// 创建
function recordMiddleware(req,res,next){let {url,ip}=reqconsole.log(__dirname)fs.appendFileSync(path.resolve(__dirname,"./ip.txt"),`${url}--${ip}\r\n`)// 继续往下执行next()
}const app=express()
// 加载配置使用
app.use(recordMiddleware)
app.get("/get",(req,res)=>{res.send("success")
})app.listen(9000,()=>{console.log("启动成功")
})
路由中间件
路由配置
let routeMiddleware=(req,res,next)=>{if(req.query.code=="xusx"){next()}else{res.send("fail")}
}const app=express()
// app.use(recordMiddleware)
app.get("/get",routeMiddleware,(req,res)=>{res.send("success")
})app.listen(9000,()=>{console.log("启动成功")
})
express内置静态资源中间件
根据request.path去静态目录下查找然后直接输出
const app=express()
app.use(express.static(__dirname+"/public"))
文件目录
注:当请求路径为"/"时,会自动去目录下搜寻默认的index.html
获取post请求体-post入参
body-parser
const bodyParser=require("body-parser")// 请求体为json
const jsonParse=bodyParser.json()
// 请求体为form
const urlencodedParse=bodyParser.urlencoded({extended:false})
// 添加局部中间件
app.post("/postInfo",urlencodedParse,(req,res)=>{console.log(req.body)console.log(req.body.age)
})
路由模块化
express.Router()
app.use()
getRoute.js
const express=require("express")const getRouter=express.Router()getRouter.get("/getIndex",(req,res)=>{res.send("asdasd")
})module.exports= getRouter
const getRouter=require("./router/getRouter")
const app=express()app.use(getRouter)
// 可添加路由前缀
// app.use("/testGet",getRouter)
app.listen(9000,()=>{console.log("启动成功")
})
模板引擎-ejs
变量
格式:<%= %>const ejs=require("ejs")const str1="学习"
let result=ejs.render(`早上开始<%= str1%>`,{str1:str1})
代码
格式:<% %>
const ejs=require("ejs")
const isLogin=false
let result=ejs.render(`<% if(isLogin){ %><p>成功</p><% }else{%><p>失败</p><% }%>`,{isLogin:isLogin})
express 中使用ejs
const express=require("express")
const isLogin=true// 创建路由
const app=express()
// 设置所使用的模板引擎
app.set("view engine","ejs")
// 设置模板所在的目录
app.set("views",__dirname)app.get("/home",(req,res)=>{// 输出res.render('home',{isLogin})
})
app.listen(9000,()=>{console.log("启动成功")
})
home.ejs 后缀名ejs
<!DOCTYPE html>
<html><body><% if(isLogin){ %><p>成功</p><% }else{%><p>失败</p><% }%></body>
</html>
express-generator
是一个用于快速生成 Express.js 应用骨架的命令行工具。通过它,你可以轻松创建一个包含基本目录结构和文件的 Express 项目,从而节省手动配置的时间。
主要功能
-
生成项目结构:自动创建标准的 Express 应用目录,如 routes、views、public 等。
-
设置基本路由:生成默认的路由文件,帮助你快速开始开发。
-
配置模板引擎:支持多种模板引擎(如 EJS、Pug、Handlebars),并自动配置。
-
提供静态文件支持:自动设置 public 目录用于存放静态资源。
安装
npm install -g express-generator
使用
express [文件名]
文件结构
相关文章:
Node.js学习
概述 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,允许在服务器端运行 JavaScript 代码。它采用事件驱动和非阻塞 I/O 模型,适合构建高性能、可扩展的网络应用,尤其擅长处理实时应用和大规模数据密集型场景 背景 JavaScri…...
SQL注入漏洞中会使用到的函数
目录 一、信息获取函数 1. 通用函数 2. 元数据查询(INFORMATION_SCHEMA) 二、字符串操作函数 1. 字符串连接 2. 字符串截取 3. 编码/解码 三、报错注入专用函数 1. MySQL 2. SQL Server 3. PostgreSQL 四、时间盲注函数 1. 通用延迟 2. 计…...
MIT IDSS深度解析:跨学科融合与系统科学实践
麻省理工学院的IDSS(Institute for Data, Systems, and Society, IDSS)是一个致力于通过先进分析方法推动教育与研究的前沿机构。它将工程学、信息科学和数据科学的方法与社会科学的分析方法相结合,以应对复杂的社会挑战。 MIT IDSS 建立在统计学、计算机科学和特定应用领域…...
重塑智慧出行新生态,德赛西威全新战略愿景发布
4月22日,上海车展开幕前夕,德赛西威以“智新境,向远大”为主题,正式对外发布全新发展战略及使命、愿景;同时,代表未来AI出行趋势的智慧出行解决方案Smart Solution 3.0重磅亮相。 一、把握变革节点 创领产…...
全面解析 classification_report:评估分类模型性能的利器
解读 classification_report 的使用:评估分类模型性能的关键工具 在机器学习中,分类任务是最常见的应用场景之一。无论是垃圾邮件过滤、图像识别还是情感分析,分类模型的性能评估都是至关重要的一步。而 classification_report 是 Scikit-le…...
Qt案例 使用QFtpServerLib开源库实现Qt软件搭建FTP服务器,使用QFTP模块访问FTP服务器
本以为搭建和访问FTP服务器的功能已经是被淘汰的技术了,只会在学习新技术的时候才会了解学习学习,WinFrom版本,和windows Api版本访问FTP服务器的功能示例也都写过。没想到这次会在项目中再次遇到, 这里记录下使用Qt开源库QFtpSer…...
图像后处理记录
图像后处理记录 ocr后处理记录 opencv裁剪 编译命令 cmake -S . -B build-x64 -DBUILD_LIST"core,imgproc,imgcodecs,highgui" -DBUILD_SHARED_LIBSOFF -DBUILD_opencv_appsOFF -DBUILD_opencv_jsOFF -DBUILD_ANDROID_PROJECTSOFF -DBUILD_ANDROID_EXAMPLESOFF -…...
解决element中的el-anchor链接被作为路由跳转导致页面404
解决element中的el-anchor链接被作为路由跳转导致页面404 问题: 在使用elementPlus时,el-anchor-link中的href被识别为路由进行跳转,导致不能正常跳转到锚点,且页面显示404。 解决:自定义方法解决 <!--添加hand…...
Mapreduce中maven打包
MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序(例如:jar包),并发运行在…...
C++初阶——string的使用(下)
C初阶——string的使用(下) 一、string类对象的容量操作 对于string的容量操作,我们可以通过顺序表来理解,顺序表是通过动态数组来实现的,在数据结构专栏的第一篇就是顺序表的详细讲解,链接如下ÿ…...
AIGC vs 人类创作者:是竞争还是协作?
AIGC vs 人类创作者:是竞争还是协作? 随着人工智能技术的飞速发展,特别是生成式AI(AIGC, AI-Generated Content)的崛起,越来越多的领域开始出现AI的身影。从文本创作、图像生成到音乐制作,AIGC…...
Stable Baselines3 结合 gym 训练 CartPole 倒立摆
视频讲解: Stable Baselines3 结合 gym 训练 CartPole 倒立摆 今天介绍下stable_baselines3和gym,可以方便实现DL的实现,应用在机械臂catch、reach等场景 测试代码仓库:https://github.com/LitchiCheng/DRL-learning.git https:…...
ctfshow web8
前言 学习内容:简单的盲注脚本的书写 web8 这个题目题目手动注入很麻烦 主要是他过滤了 union 空格和 过滤了union的解决方法 1、使用盲注(报错注入和盲注) 2、使用时间盲注 3、堆叠注入 盲注脚本的书写 首先他是有注入点的 然后熟悉requests包的使用 …...
Linux程序地址空间
目录 研究背景 程序地址空间回顾 来段代码感受一下 进程地址空间 Linux2.6内核进程调度队列 一个CPU拥有一个runqueue 优先级 活跃队列(只出不进) 过期队列(只进不出) active指针和expired指针 总结 研究背景 Linux内核版本&#…...
破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级 AI 原生时代
丝滑升级拥抱大模型:详解AI时代的应用智能化升级路径 破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级AI原生时代 ——十年代码无需重写,三步开启智能化跃迁 作者:孤弋、孚阳 序幕:一场跨越 20 年的技术对话 在杭…...
游戏引擎学习第240天:将渲染器移至第三层
这节又枯燥又无聊简直了 回顾并为今天的内容做铺垫 昨天我们说到,想对渲染器和平台层的集成方式做一些修改。我们之前简单讲了一下修改的目的:我们希望游戏本身不再直接调用 OpenGL 的渲染代码,而是只生成一组渲染指令缓冲区,然…...
2025.04.23华为机考第三题-300分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 时空旅行者的最优路径 问题描述 A先生是一名时空旅行者,他可以在不同的时空点之间穿梭。每次从一个时空点跳跃到另一个时空点需要消耗一个时间单位。在每个时空点,都有一些特…...
Kafka 保证多分区的全局顺序性的设计方案和具体实现
Kafka 本身无法直接保证多分区的全局顺序性,因为分区设计旨在并行处理以提升吞吐量。 要实现多分区的顺序性,可尝试通过以下方法在系统层面或业务逻辑上解决: 一、方案设计 单一分区路由(还是将消息发送到同一分区)&a…...
数据结构初阶:二叉树(四)
概述:本篇博客主要介绍链式结构二叉树的实现。 目录 1.实现链式结构二叉树 1.1 二叉树的头文件(tree.h) 1.2 创建二叉树 1.3 前中后序遍历 1.3.1 遍历规则 1.3.1.1 前序遍历代码实现 1.3.1.2 中序遍历代码实现 1.3.1.3 后序遍历代…...
华为开发岗暑期实习笔试(2025年4月16日)
刷题小记: 第一题怀疑测试样例不完整,贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题,往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题,难点在于满足3重判断规则,所需…...
第一篇:Django简介
第一篇:Django简介 文章目录 第一篇:Django简介一、纯手写一个简易版的web框架1、软件开发架构2、HTTP协议3、简易的socket服务端4、wsgiref模块5、动静态网页6、后端获取当前时间展示到html页面上7、字典数据传给html文件8、数据从数据库中获取的展示到…...
2025年渗透测试面试题总结-拷打题库13(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库13 一、GitHub等三方敏感信息泄漏防御 二、业务逻辑漏洞技术规避 …...
(09)Vue脚手架的使用(Vite、vue-cli、create-vue)
本系列教程目录:Vue3Element Plus全套学习笔记-目录大纲 文章目录 第3章 Vue脚手架3.1 vite3.3.1 Vite使用1)创建Vite项目2)Vite项目打包 3.1.2 组件化开发3.1.4 Vite工程运行原理1)分析main.js2)自定义根组件 3.2 vue…...
Unity 将Excel表格中的数据导入到Mysql数据表中
1.Mysql数据表users如下: 2.即将导入的Excel表格如下: 3.代码如下: using System; using System.Data; using System.IO; using Excel; using MySql.Data.MySqlClient; using UnityEngine; using UnityEditor;public class ImportExcel {// …...
【QT】信号与槽中多个按钮(pushbutton)共用一个槽函数的两种实现方式
两种方法的对比 方法1:sender() 优点:代码简洁,无需额外参数 缺点:依赖运行时类型转换,安全性较低 适用场景:简单场景,少量按钮 方法2:Lambda (推荐) 优点:安全直观&…...
Python----深度学习(神经网络的过拟合解决方案)
一、正则化 1.1、正则化 正则化是一种用于控制模型复杂度的技术。它通过在损失函数中添加额外的项(正则 化项)来降低模型的复杂度,以防止过拟合。 在机器学习中,模型的目标是在训练数据上获得较好的拟合效果。然而,过…...
【金仓数据库征文】从 HTAP 到 AI 加速,KingbaseES 的未来之路
国产数据库早已实现 “可替代”,但要真正与国际头部厂商掰手腕,必须在 HTAP(Hybrid‑Transaction/Analytical Processing)与 AI 加速 两条技术赛道上实现跨越。KingbaseES 自 V8R3 调整为多进程架构后,历经 V8R6、KSOn…...
创建第一个Spring Boot项目
什么是Spring Boot 随着Spring的快速发展,项目中的XML文件越来越多,繁琐的配置以及,整合第三方框架的配置问题,导致大大增加了开发和部署的效率,使开发者无法专心于业务的开发。Spring Boot就相当于使Spring框架的脚手…...
Java—— 正则表达式 练习
需求: 请编写正则表达式验证用户输入的手机号码是否满足要求。 请编写正则表达式验证用户输入的邮箱号是否满足要求。 请编写正则表达式验证用户输入的电话号码是否满足要求。 验证手机号码 13112345678 13712345667 13945679027 139456790271 验证座机电话号码 02…...
Linux[指令与权限]
Linux指令与权限 Linux环境中,打包文件有多种 tar (打包/解包) 指令 tar -czvf 文件要打包到的位置 文件(打包并压缩到) tar -xzvf 文件(在当前目录下解压) tar选项 -c创建压缩文件 -z使用gzip属性压缩 -v展现压缩过程 -f后面使用新建文档名 -x不要新建,解压 -C 文件…...
MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…...
【Redis】集合类型Set 常用命令详解
1. sadd - 添加 语法:sadd key value > sadd testset A 1 > sadd testset B 1 > sadd testset C 1 > sadd testset C # set的值不能重复 0 > smembers set1 # 查询指定set的所有值,乱序 1) "B" 2) "A" 3) "C&qu…...
React 5 种组件提取思路与实践
在开发时,经常遇到一些高度重复但略有差异的 UI 模式,此时我们当然会把组件提取出去,但是组件提取的方式有很多,怎么根据不同场景选取合适的方式呢?尤其时在复杂的业务场景中,组件提取的思路影响着着代码的可维护性、可读性以及扩展性。本文将以一个[详情]组件为例,探讨…...
第十五届蓝桥杯 2024 C/C++组 合法密码
目录 题目: 题目描述: 题目链接: 思路: substr函数: 思路详解: 代码: 代码详解; 题目: 题目描述: 题目链接: P10906 [蓝桥杯 2024 国 B] 合法密码 -…...
云原生时代的双轮驱动
在当今数字化浪潮汹涌澎湃的时代,企业 IT 主管、CIO、CTO 们肩负着引领企业乘风破浪、实现数字化转型的重任。而主数据平台与数据中台,宛如企业数字化征程中的双引擎,为企业发展注入强劲动力。 一、主数据与数据中台:企业数据世界…...
GD32F407单片机开发入门(六)定时器TIMER详解及实战含源码
文章目录 一.概要二.通用定时器内部结构1.时基单元2.时钟源3.输入捕获4.输出比较 三.通用定时器内部特色四.TIME定时器1ms中断例程五.工程源代码下载六.小结 一.概要 定时器就是计数器,应用在我们生活的方方面面,比如有闹钟、计时器等。在GD32F407VET6定…...
时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库
小T导读:胜软科技在石油石化行业中选择使用 TDengine 处理时序数据,不仅显著降低了运维数据库的成本,也大幅减少了存储空间的占用,实现了从原有的 40 多套 Oracle 数据库向仅 9 套 TDengine集群的精简替换。在迁移过程中ÿ…...
【问题解决】本机navicat连接云服务器mysql
一般情况下,当你使用navicat等工具连接云服务器会因为mysql的安全机制,导致无法连接root用户,但是在测试环境中,不考虑安全性的前提条件下,可以通过修改MySQL的配置文件来连接云服务器mysql的root用户。 选择数据库&am…...
STM32F407 的通用定时器与串口配置深度解析
在 STM32F407 芯片的开发过程中,通用定时器和串口的配置与使用是极为关键的技能点。本文将结合提供的代码示例,深入剖析这两个模块的配置流程、工作原理以及实际应用,助力开发者更好地掌握相关技术。 一、通用定时器 (一&#x…...
深入探究Linux项目自动化构建工具:make与Makefile
目录 引言 一、make与Makefile概述 1.1 背景 1.2 理解 二、make工作原理 2.1 查找Makefile 2.2 确定目标文件 2.3 处理文件依赖 三、Makefile实例分析 3.1 简单C程序示例 3.2 项目清理机制 四、结合行缓冲区概念的有趣现象 五、结语 引言 在Linux软件开发的世界里…...
【Hive入门】Hive基础操作与SQL语法:DDL操作全面指南
目录 1 Hive DDL操作概述 2 数据库操作全流程 2.1 创建数据库 2.2 查看数据库 2.3 使用数据库 2.4 修改数据库 2.5 删除数据库 3 表操作全流程 3.1 创建表 3.2 查看表信息 3.3 修改表 3.4 删除表 4 分区与分桶操作 4.1 分区操作流程 4.2 分桶操作 5 最佳实践与…...
STM32F103 “BluePill” 上的 DMA 原理与实践
摘要:本文深入浅出地介绍什么是 DMA(直接存储器访问),它的核心原理、硬件架构,以及在 STM32F103(BluePill)上常见的几种使用场景(ADC、UART、内存拷贝等)。通过对比 CPU 轮询、中断、DMA 三种方式的数据搬运效率,结合寄存器级和 HAL 库示例代码,并附带性能测试与优化…...
软考软件设计师30天备考指南
文章目录 一、考情分析(一)综合知识(二)案例分析 二、30天学习规划(一)第1 - 5天:基础夯实(二)第6 - 10天:核心知识突破(三)第11 - 15…...
比较:AWS VPC peering与 AWS Transit Gateway
简述: VPC 对等连接和 Transit Gateway 用于连接多个 VPC。VPC 对等连接提供全网状架构,而 Transit Gateway 提供中心辐射型架构。Transit Gateway 提供大规模 VPC 连接,并简化了 VPC 间通信管理,相比 VPC 对等连接,支持大量 VPC 的 VPC 间通信管理。 VPC 对等连接 AWS V…...
【AI大模型】MCP:AI应用的“超级扩展坞”
一、什么是MCP MCP(Model Context Protocol,模型上下文协议)是一种新兴的开放协议,于2024年11月由Anthropic公司(Claude的开发者)开源。它的核心目标是建立一个类似USB-C的标准化协议,统一AI模…...
线程封装
目录 makefile Thread.hpp main.cc 以面向对象的方式造轮子 #ifndef _THREAD_HPP__ // 如果没有定义过 _THREAD_HPP__ #define _THREAD_HPP__ // 则定义 _THREAD_HPP__// 这里是头文件的实际内容(类、函数声明等)#endif // 结束条件…...
【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战
在日常开发中,SQL 注入是一种常见但危害巨大的安全漏洞。如果你正在使用 MyBatis 或 MyBatis-Plus 进行数据库操作,这篇文章将带你系统了解:这两个框架是如何防止 SQL 注入的,我们又该如何写出安全的代码。 什么是 SQL 注入&#…...
智能穿戴的终极形态会是AR眼镜吗?
清晨的地铁里,戴着普通眼镜的小张正通过镜片查看实时导航路线,眼前的虚拟箭头精准指引换乘方向;手术室里,主刀医生透过镜片看到患者血管的3D投影,如同获得透视眼般精准避开危险区域;装修现场,设…...
ubantu18.04(Hadoop3.1.3)Hive3.1.2安装指南
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。本文的操作均在Master主机下进行 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之…...
Hive 多表查询案例
文章目录 前提条件Hive 多表查询案例JOIN案例JOIN查询数据准备1. 内连接(INNER JOIN)2. 左外连接(LEFT OUTER JOIN)3. 右外连接(RIGHT OUTER JOIN)4. 全外连接(FULL OUTER JOIN)5. 多…...