当前位置: 首页 > news >正文

做网站能做职业吗/电工培训内容

做网站能做职业吗,电工培训内容,取消网站验证码,文成网站制作一、模块化规范 nodejs使用的模块化规范 叫做 common.js 规范: 每一个模块都有独立的作用域 代码在各自模块中执行 不会造成全局污染 每一个模块都是一个独立的文件(module对象) 模块可以被多次加载(module.exports 属性) 但是仅…

一、模块化规范

nodejs使用的模块化规范 叫做 common.js 规范:
每一个模块都有独立的作用域 代码在各自模块中执行 不会造成全局污染
每一个模块都是一个独立的文件(module对象)
模块可以被多次加载(module.exports 属性) 但是仅在第一次加载时执行一次
运行结果会被缓存 如果再次加载会从缓存中获得结果
模块的加载顺序和代码的书写顺序有关// exports对象是module对象的属性,包含导出的信息
导出:module.exports ={}          // module.exports.a = a || exports.a = a;默认指向以module.exports为准
导入:count a = require('');      //只有自定义模块需要写路径('./index'),导入对象永远是module.exports指向的对象

二、HTTP模块

HTTP模块
//导入模块
const http = require("http");
const https = require("https");//创建服务
let server = http.createServer((req, res) => {// request:解析客户端的请求//常用属性及方法:url(请求路径) method(请求方法)headers(头部)//url:请求的路径,可以根据URL设置出路由模式,express的就是基于此设置的//methoe:请求的方式分为,post get delete put patch//headers: 请求的头部,客户单的cookie,数据传输的类型等都放在header中//data事件:createServer想要获取请求数据体需要监听data事件//response:相应客户端请求,常用属性及方法如下://end:res.end()//setHeader(name,content),可以设置单个header属性,可以多次设置//destory:取消返回//statusCode:设置返回的状态码,如200 404 400 500等//statusMessage:设置状态码对应返回的信息//writeHead:可以同时设置statusCode statusMessage 和多个header属性res.writeHead(200, { "content-type": "text/html;charset=utf-8" });let data = ""; // 返回数据// 根据不同的请求类型 设置不同的响应头switch (req.method) {case "GET":// data事件流 接收到数据时触发的事件 参数 chunk 数据块,在函数内是将数据块拼接给datahttps.get("www.baidu.com", (res) => {res.on("data", (chunk) => (data += chunk));// end事件 在数据响应结束时触发res.on("end", () => {data = querystring.parse(data);// 接口路由设置 (后端数据接口)switch (req.url) {case "/users":console.log("获取用户信息");break;case "/addUser":// 将数据写入数据库data.add = true;res.end(JSON.stringify(data));break;case "/weather":weather(res);}});});break;case "POST":const options = {hostname: "",port: "443",path: "",method: "POST",headers: {"content-type": "application/json",},};https.request(options, (res) => {res.on("data", (chunk) => (data += chunk));// end事件 在数据响应结束时触发res.on("end", () => {data = querystring.parse(data);console.log(daat);});});req.write(JSON.stringify({ name: "", age: "" })); // 发送的请求数据req.end();break;default:}
});
//监听3000端口,开启服务
server.listen(3000, () => {console.log("打开了3000端口");
});
jsonp跨域
const http = require("http");
const url = require("url");//创建服务
http.createServer((req, res) => {res.writeHead(200, { "content-type": "text/html;charset=utf-8" });if (req.url === "/favicon.ico") return;const urlObj = url.parse(req.url, true);res.end(`${urlObj.query.callback}(${JSON.stringify({name: "xiaoming",age: 18,})})`); // 返回一个函数 fn( ${urlObj.query.callback} ) 与前端定义的 fn 名称一致}).listen(3000, () => {console.log("打开了3000端口");});
cors头跨域
const http = require("http");//创建服务
http.createServer((req, res) => {res.writeHead(200, {"content-type": "application/json;charset=utf-8","access-control-allow-origin": "*",     // 跨域});res.end(JSON.stringify({name: "xiaoming",age: 18,})); // 返回一个函数 fn( ${urlObj.query.callback} ) 与前端定义的 fn 名称一致}).listen(3000, () => {console.log("打开了3000端口");});

三、URL模块

parse模块
const http = require("http");
const url = require("url");//创建服务
let server = http.createServer((req, res) => {res.writeHead(200, { "content-type": "text/html;charset=utf-8" });if (req.url === "/favicon.ico") return;console.log(url.parse(req.url, true)); // 接收第二个参数,为true则转化query对象// =Url {//   protocol: null,//   slashes: null,//   auth: null,//   host: null,//   port: null,//   hostname: null,//   hash: null,//   search: '?user=b&age=18',//   query: [Object: null prototype] { user: 'b', age: '18' },//   pathname: '/api',//   path: '/api?user=b&age=18',//   href: '/api?user=b&age=18'// }res.end();
});
//监听3000端口,开启服务
server.listen(3000, () => {console.log("打开了3000端口");
});
format模块
const url = require("url"); 
const urlObj= {protocol: 'https',slashes: true,auth: null,host: 'www.baidu.com:443',port: 443,hostname: 'www.baidu.com',hash: '#tag=110',search: '?user=b&age=18',query: { user: 'b', age: '18' },pathname: '/api',path: '/api?user=b&age=18',}
url.format(urlObj)   =>  https://www.baidu.com:443/api?user=b&age=18#tag=110
resolve模块
url.resolve('/one/two','three')   => '/one/three'
url.resolve('/one/two/','three')   => '/one/two/three'
url.resolve('http://www.baidu.com/a/b/c','d')   => 'http://www.baidu.com/d'
新url模块
const http = require("http");let server = http.createServer((req, res) => {res.writeHead(200, { "content-type": "text/html;charset=utf-8" });if (req.url === "/favicon.ico") return;const newUrl = new URL(req.url, "http://localhost:3000");console.log(newUrl);// URL {//   href: 'http://localhost:3000/api?user=b&age=18',//   origin: 'http://localhost:3000',//   protocol: 'http:',//   username: '',//   password: '',//   host: 'localhost:3000',//   hostname: 'localhost',//   port: '3000',//   pathname: '/api',//   search: '?user=b&age=18',//   searchParams: URLSearchParams { 'user' => 'b', 'age' => '18' }, // 可迭代对象//   hash: ''// }res.end();
});server.listen(3000, () => {console.log("打开了3000端口");
});

四、querystring模块

const queryatring = require("querystring");const str = "name=abc&age=18&location=shanghai";
const obj = {name: "abc",age: "18",location: "shanghai",
};// 将query格式转成对象 querystring.parse(str);  
// => [Object: null prototype] {
//   name: 'abc',
//   age: '18',
//   location: 'shanghai'
// }// 将对象转成query格式字符串  querystring.stringify(obj);  
// => "name=abc&age=18&location=shanghai"

五、爬虫模块

cheerio模块
cheerio模块为Node.js 爬虫第三方模块,内置jq基本操作 // npm i cheerio
//加载数据(网页),进行元素操作
let $ = cheerio.load(rawData);

六、path模块

console.log(__dirname); // 当前目录 绝对路径
console.log(__filename); // 当前文件 绝对路径
拼接路径:
path.join(path):path.join('__dirname,'a','b');       //拼接当前文件绝对路径
获得文件后缀:
path.extname(path)
获得路径名:
path.dirname(path)

七、event模块

//导入模块
const EventEmitter = require("events");const event = new EventEmitter();event.on("start", (data) => {console.log("触发了");console.log(data);
});setTimeout(() => {event.emit("start", "开始");
}, 2000);

八、fs模块

//导入模块 
count fs = require('fs');
//读取文件
fs.readFile(url,'utf8',(err,data)=>{if (err) throw err;
})
//写入文件
fs.writeFile(file,data[,options],callback)
//文件追加
fs.appendFile(file,data[,options],callback)
//修改文件名
fs.rename(oldpath,newpath,callback)
//读取目录
fs.readdir(path[,option],callback(err,files))

九、mysql模块

连接池文件:
const mysql = require('mysql');
var pool = mysql.createPool({ //  创建连接池connectionLimit: 10,host: 'localhost',user: 'root',password: 'root',database: 'h5_2013'
});
module.exports = pool;        //导出模块文件2:
const mysql = require('pool');   //引入导出的配置
执行sql语句:mysql.query('select * from users', (err, data) =>
{ // 查数据if (err) console.log(err);res.send(data); // 发送查询到的数据
});

十、jwt模块

token 令牌
它是一个三段式的加密字符串
xxxxxxxxxx.yyyyyyyyyyyyyyyy.zzzzzzz
第一段: 头信息 签证:安全信息验证 口令 使用不可逆的哈希算法进行加密
第二段: 你需要存储的信息  采用base64 可逆加密 截取一部分
第三段: 额外信息 使用不可逆哈希算法进行加密
浏览器在发送请求进行登陆时 
服务器验证完信息 信息正确 则生产一个 token
服务器将这个token发送给前端 前端进行存储
如果前端请求了需要验证登录权限的页面或数据 前端将token跟随请求发回后端
后端通过解密 验证token的有效性const jwt = require('jsonwebtoken');// 生成 token:
// jwt.sign(存储的数据,口令,参数);
// 口令 是一个验证需要的 额外字符串
// 解码token的时候 如果口令不同就无法正确解码// 解码token:
// jwt.verify(token,口令,回调);let userInfo = {username: 'zhangsan',age: 25,sex: 'nan',phone: 13688888888
};// 生成token
let token = jwt.sign(userInfo, 'rootbk', { expiresIn: 60 });        //expiresIn 过期时间// console.log(token);// 解码token
jwt.verify(token, 'rootbk', (err, data) => {if (err) console.log(err.message);console.log(data);
})

十一、项目脚手架express

安装
#你可以通过 npx (包含在 Node.js 8.2.0 及更高版本中)命令来运行 Express 应用程序生成器。
$ npx express-generator
#对于较老的 Node 版本,请通过 npm 将 Express 应用程序生成器安装到全局环境中并执行即可。
$ npm install -g express-generator
$ express name 
#然后安装所有依赖包:
$ cd myapp
$ npm install
#然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了,通过生成器创建的应用一般都有如下目录结构:- 项目名- [bin]       # 存放可执行程序- www     # 开启http服务- [public]    # 存放静态前端文件- [images]- [javascripts]- [stylesheet]- [routes]    # 存放路由文件- index.js- users.js- [views]     # 前端视图模板- error.ejs- index.ejs- app.js      # 主程序- package.json   # 依赖信息
处理数据
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
搭建静态web服务
const express = require('express'); // 引入第三方模块的方式和引入内置模块的方式相同
const path = require('path');
const app = express(); // 创建一个express应用
const conf = {port: 8888,host: '10.31.168.73'
};
// 使用express搭建一个静态的web服务器// 静态服务器 使用一个中间件实现
// 将public目录 设置成静态的web目录
// public中所有内容都可以在web服务中被访问// app.use()  使用中间件
app.use(express.static(path.join(__dirname, 'public'))); // 静态服务app.listen(conf.port, conf.host, () => { // 监听端口启动服务console.log(`server is running at http://${conf.host}:${conf.port}`);
});
api服务
// 搭建一个api 服务    应用程序接口
// express可以快速搭建api服务
// 接口的作用是给前端提供数据支持(CRUD)  
// 前端如何发送请求
// ajax    get/post
// href    get
// form    get/post
// jsonp   getconst express = require('express');
const app = express(); // 创建一个express应用
const conf = {port: 8088,host: 'localhost'
};// app.get(url,callback);   用于接受get请求
// 参数
// url[string] 请求路径
// callback[function] 回调函数
//    回调参数
//    req      request
//    res      response
//    next     函数 交出中间的控制权 将这个请求交给下一个中间件app.get('/getItem', (req, res, next) => {console.log('我收到了一个请求');// 响应内容// res.send() 发送数据 接受一个字符串作为参数 发送数据后自动终止请求// res.send('hahaha');// res.send({ username: 'zhangsan', age: 20 });// res.json() 发送数据 接受一个JSON 发送后自动终止请求res.json({ data:{username: 'zhangsan', age: 20},status:success });
});
app.get('/getuser', (req, res, next) => {res.json({ username: 'lisi', age: 20, success: 1 });
});
app.post('/getuser', (req, res, next) => {res.json({ username: 'xiaoming', age: 20, success: 1 });
});
app.listen(conf.port, conf.host, () => {console.log(`server is running at http://${conf.host}:${conf.port}`);
});
use中间件
const express = require('express');
const path = require('path');
const app = express();
const conf = {port: 8888,host: 'localhost'
};
// 配置静态web服务器
app.use(express.static(path.join(__dirname, 'public')));// express 封装的是 http 服务器
// express 接受到前端发送过来的请求 会交给 中间件 依次处理// 当前回调函数就是我的自定义中间件
app.use((req, res, next) => {console.log('我是中间件一号');// 如果在中间中没有使用 send 或 json 结束请求// 这个请求会被认为没有完成 进程将被挂起// next 调用next可以将中间件的控制权交出 // 将这个请求传递给下一个中间件next();// res.send('hahah');
});
app.use((req, res, next) => {console.log('我是中间件二号');next();
});
app.listen(conf.port, conf.host, () => {console.log(`server is running at http://${conf.host}:${conf.port}`);
});
request模块-实现跨源请求(代理)
const express = require('express');
const request = require('request');
const querystring = require('querystring');
const app = express();
let requestUrl = 'http://api.k780.com/?';
let props = {app: 'weather.future',cityNm: '杭州',appkey: '38926',sign: 'f8b4121c2d581be2623569b24f798dee',format: 'json'
}
requestUrl += querystring.stringify(props);
app.get('/api', (req, res, next) => {request(requestUrl, (err, response, body) => {if (err) console.log(err);res.send(body);});
});
app.listen(8877, 'localhost', () => {console.log('start');
});

相关文章:

Node.js学习指南

一、模块化规范 nodejs使用的模块化规范 叫做 common.js 规范: 每一个模块都有独立的作用域 代码在各自模块中执行 不会造成全局污染 每一个模块都是一个独立的文件(module对象) 模块可以被多次加载(module.exports 属性) 但是仅…...

2.5学习总结

今天看了二叉树&#xff0c;看的一脸懵&#xff0c;写了两道题 P4913&#xff1a;二叉树深度 #include <stdio.h> #include <stdlib.h> struct hly {int left;int right; }tree[1000005]; int hulingyun(int x) {if(x0)return 0;return 1max(hulingyun(tree[x].le…...

java进阶文章链接

java 泛型&#xff1a;java 泛型详解-绝对是对泛型方法讲解最详细的&#xff0c;没有之一 Java 泛型&#xff0c;你了解类型擦除吗&#xff1f; java 注解&#xff1a;深入理解Java注解类型 秒懂&#xff0c;Java 注解 &#xff08;Annotation&#xff09;你可以这样学 jav…...

vue2+vue3 HMCXY基础入门

vue2vue3 HMCXY基础入门 一、Vue2.x技术精讲1.Vue快速上手&#xff08;1&#xff09;Vue概念&#xff08;2&#xff09;创建实例&#xff08;3&#xff09;插值表达式&#xff08;4&#xff09;响应式特性&#xff08;5&#xff09;开发者工具 2.Vue指令二、Vue3.x技术精讲 一、…...

一次线程数超限导致的hive写入hbase作业失败分析

1.集群配置 操作系统:SuSe操作系统 集群节点:100台相同配置的服务器 单台:核心112Core,内存396G 2.问题现象 现象1:跑单个入库任务报错,批量提交任务后出现OOM异常 执行12个hivesql,将数据写入hbase.hbase入库有近一半的任务报错。 每次报错的任务不是同一个,hivesql…...

ip属地是手机号还是手机位置?一文理清

在数字化和网络化的今天&#xff0c;IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上&#xff0c;IP属地的显示往往让人联想到用户的地理位置。然而&#xff0c;关于IP属地到底与手机号还是手机位置有关&#xff0c;却存在着不少误解和混淆。本文将深入…...

查看设备uuid

在大多数操作系统中&#xff0c;可以通过不同的方式来查看设备的 UUID&#xff08;Universally Unique Identifier&#xff09;。以下是一些常见的方法&#xff1a; 在Linux系统中&#xff0c;可以使用命令行工具blkid或lsblk来查看设备的 UUID。例如&#xff0c;执行以下命令…...

C_C++输入输出(下)

C_C输入输出&#xff08;下&#xff09; 用两次循环的问题&#xff1a; 1.一次循环决定打印几行&#xff0c;一次循环决定打印几项 cin是>> cout是<< 字典序是根据字符在字母表中的顺序来比较和排列字符串的&#xff08;字典序的大小就是字符串的大小&#xff09;…...

All in one 的 AI tool Chain “Halomate”

这不算广告啊&#xff0c;就是真好用&#xff0c;虽然是我哥们儿的产品 比如你定了个gpt的plus 订阅&#xff0c;你发现好像有挺多功能 1- chat&#xff0c;这个自不必说&#xff0c;必须的功能 2- 高级语音 现在变成学英语的了&#xff0c;实时视频也就是我过年给姑婶介绍是…...

crewai框架第三方API使用官方RAG工具(pdf,csv,json)

最近在研究调用官方的工具&#xff0c;但官方文档的说明是在是太少了&#xff0c;后来在一个视频里看到了如何配置&#xff0c;记录一下 以PDF RAG Search工具举例&#xff0c;官方文档对于自定义模型的说明如下&#xff1a; 默认情况下&#xff0c;该工具使用 OpenAI 进行嵌…...

脉冲信号傅里叶变换与频域分析:从计算到理解

摘要 本文聚焦于脉冲信号的傅里叶变换&#xff0c;详细推导了矩形脉冲信号和单边指数信号的傅里叶变换过程&#xff0c;深入解释了傅里叶变换结果 F ( ω ) F(\omega) F(ω) 的内涵&#xff0c;包括其定义、物理意义、包含的信息以及在实际应用中的重要性。旨在帮助读者全面掌…...

6.【BUUCTF】[SUCTF 2019]CheckIn

打开题目页面如下 看样子是一道有关文件上传的题 上传一句话木马 显示&#xff1a;非法后缀&#xff01; 看来.php后缀被过滤了 上传一张带有木马的照片 在文件地址处输入cmd 输入以下代码执行 copy 1.jpg/b4.php/a 5.jpg 最后一行有一句话木马 上传带有木马的图片 但其实…...

基于springboot的体质测试数据分析及可视化设计

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…...

孟加拉国_行政边界省市边界arcgis数据shp格式wgs84坐标

这篇内容将深入探讨孟加拉国的行政边界省市边界数据&#xff0c;该数据是以arcgis的shp格式提供的&#xff0c;并采用WGS84坐标系统。ArcGIS是一款广泛应用于地理信息系统&#xff08;GIS&#xff09;的专业软件&#xff0c;它允许用户处理、分析和展示地理空间数据。在GIS领域…...

可视化相机pose colmap形式的相机内参外参

目录 内参外参转换 可视化相机pose colmap形式的相机内参外参 内参外参转换 def visualize_cameras(cameras, images):fig plt.figure()ax fig.add_subplot(111, projection3d)for image_id, image_data in images.items():qvec image_data[qvec]tvec image_data[tvec]#…...

数据结构 树2

文章目录 前言 一&#xff0c;二叉搜索树的高度 二&#xff0c;广度优先VS深度优先 三&#xff0c;广度优先的代码实现 四&#xff0c;深度优先代码实现 五&#xff0c;判断是否为二叉搜索树 六&#xff0c;删除一个节点 七&#xff0c;二叉收索树的中序后续节点 总结 …...

GB/T 44721-2024 与 L3 自动驾驶:自动驾驶新时代的基石与指引

1.前言 在智能网联汽车飞速发展的当下&#xff0c;自动驾驶技术成为了行业变革的核心驱动力。从最初的辅助驾驶功能&#xff0c;到如今不断迈向高度自动化的征程&#xff0c;每一步都凝聚着技术的创新与突破。而在这一进程中&#xff0c;标准的制定与完善对于自动驾驶技术的规…...

AURIX TC275学习笔记3 官方例程 (UART LED WDT)

文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件&#xff0c;按照参…...

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…...

Linux的简单使用和部署4asszaaa0

一.部署 1 环境搭建方式主要有四种: 1. 直接安装在物理机上.但是Linux桌面使用起来非常不友好.所以不建议.[不推荐]. 2. 使用虚拟机软件,将Linux搭建在虚拟机上.但是由于当前的虚拟机软件(如VMWare之类的)存在⼀些bug,会导致环境上出现各种莫名其妙的问题比较折腾.[非常不推荐…...

Linux 的 sysfs 伪文件系统介绍【用户可以通过文件操作与内核交互(如调用内核函数),而无需编写内核代码】

1. 什么是 sysfs伪文件系统&#xff1f; sysfs 是 Linux 内核提供的 伪文件系统&#xff0c;用于向用户空间暴露内核对象的信息和控制接口。它是 procfs 的补充&#xff0c;主要用于管理 设备、驱动、内核子系统 等信息&#xff0c;使用户可以通过文件操作&#xff08;如用户空…...

每日一题洛谷P5721 【深基4.例6】数字直角三角形c++

#include<iostream> using namespace std; int main() {int n;cin >> n;int t 1;for (int i 0; i < n; i) {for (int j 0; j < n - i; j) {printf("%02d",t);t;}cout << endl;}return 0; }...

计算机网络笔记再战——理解几个经典的协议1

目录 前言 从协议是什么出发 关于TCP/IP协议体系 几个传输方式的分类 地址 网卡 中继器&#xff08;Repeater&#xff09; 网桥&#xff08;Bridge&#xff09; 路由器&#xff08;Router&#xff09; 网关 前言 笔者最近正在整理&#xff08;笔者开的坑不少&#xf…...

ElasticSearch学习笔记-解析JSON格式的内容

如果需要屏蔽其他项目对Elasticsearch的直接访问操作&#xff0c;统一由一个入口访问操作Elasticsearch&#xff0c;可以考虑直接传入JSON格式语句解析执行。 相关依赖包 <properties><elasticsearch.version>7.9.3</elasticsearch.version><elasticsea…...

浅谈密码相关原理及代码实现

本代码仅供学习、研究、教育或合法用途。开发者明确声明其无意将该代码用于任何违法、犯罪或违反道德规范的行为。任何个人或组织在使用本代码时&#xff0c;需自行确保其行为符合所在国家或地区的法律法规。 开发者对任何因直接或间接使用该代码而导致的法律责任、经济损失或…...

Spring Boot常用注解深度解析:从入门到精通

今天&#xff0c;这篇文章带你将深入理解Spring Boot中30常用注解&#xff0c;通过代码示例和关系图&#xff0c;帮助你彻底掌握Spring核心注解的使用场景和内在联系。 一、启动类与核心注解 1.1 SpringBootApplication 组合注解&#xff1a; SpringBootApplication Confi…...

can not add outlook new accounts on the outlook

link : Reference url...

私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手

私有化部署 DeepSeek Dify&#xff0c;构建你的专属私人 AI 助手 概述 DeepSeek 是一款开创性的开源大语言模型&#xff0c;凭借其先进的算法架构和反思链能力&#xff0c;为 AI 对话交互带来了革新性的体验。通过私有化部署&#xff0c;你可以充分掌控数据安全和使用安全。…...

【Elasticsearch】post_filter

post_filter是 Elasticsearch 中的一种后置过滤机制&#xff0c;用于在查询执行完成后对结果进行过滤。以下是关于post_filter的详细介绍&#xff1a; 工作原理 • 查询后过滤&#xff1a;post_filter在查询执行完毕后对返回的文档集进行过滤。这意味着所有与查询匹配的文档都…...

验证工具:GVIM和VIM

一、定义与关系 gVim&#xff1a;gVim是Vim的图形界面版本&#xff0c;提供了更多的图形化功能&#xff0c;如菜单栏、工具栏和鼠标支持。它使得Vim的使用更加直观和方便&#xff0c;尤其对于不习惯命令行界面的用户来说。Vim&#xff1a;Vim是一个在命令行界面下运行的文本编…...