NodeJs入门知识

****************************************************************************************************************************************************************************

1、配置Node.js与npm下载(精力所致,必有精品)          链接:https://pan.baidu.com/s/1k_AgwkMRCSsY1YQrW7Pp3Q 提取码:gb2o 
【1】第一步 下载指定位置安装NodeJs
【2】第二步 在安装目录下创文件夹:node_global、node_cache
【3】第三步(查看所有npm 配置 npm config list)
npm config set prefix "C://Program Files//nodejs//node_global"   查看 npm config get prefix
npm config set cache "C://Program Files//nodejs//node_cache"   查看 npm config get cache 
【4】第四步Path里添加C://Program Files//nodejs   与   C://Program Files//nodejs//node_global(这里可以让所有全局安装包,都能以CMD命令查看node_global)
【5】第五步
npm get registry
*******************************切换成淘宝镜像
npm config set registry=https://registry.npmmirror.com/ 
*******************************配置国内下载镜像地址
npm install -g cnpm
【6】第六步
npm install vue -g  检查是否安装成功:npm info vue
npm install vue-cli -g 检查是否安装成功:vue -V
【7】第七步   “用管理员运行命令窗口”   cd到对应项目执行npm install             npm run serve

****************************************************************************************************************************************************************************

2、解决下载包慢的问题
【1】因为默认是从国外https://registry.npmjs.org进行下载的,数据传输需要还低光缆,因此下载包速度很慢。
【2】淘宝npm镜像服务器。把国外的包克隆到淘宝服务器(镜像Mirror),然后从淘宝服务器下载。一些文章还是写着旧的淘宝 NPM 镜像 registry.npm.taobao.org,
但它已于 2022 年 05 月 31 日 废弃,读者需要更换为新的 registry.npmmirror.com 源。
*******************************查看当前从哪里下载
npm get registry
*******************************切换成淘宝镜像
npm config set registry=https://registry.npmmirror.com/
*******************************检查是否设置成功。
npm get registry
【3】npm i nrm -g 安装nrm小工具。注意配置node.js的安装路径添加到环境变量path
nrm ls
nrm use taobao

****************************************************************************************************************************************************************************

3、前端服务器部署
【1】npm run build打包出来dist
【2】npm install anywhere -g 安装前端静态服务器插件
【3】把dist上传到自己的服务器,配置nginx反向代理vue      cd /usr/local/nginx/conf  。        vim nginx.conf         配置如下location / {root /root/site/UserInterface/dist;index index.html index.htm;try_files $uri $uri/ /index.html;}
开头加:  user root;
【4】切换目录,重启nginx      cd /usr/local/nginx/sbin。          ./nginx -s reload 重启nginx
【5】注意上线后,原来本地传的头像地址会仍是localhost,需要改成对应的服务器地址的
【6】配置gzip报错nginx: [emerg] unknown directive "gzip_static" in /usr/local/nginx/conf/nginx.conf:52
【7】cd /opt/nginx/nginx-1.13.7
【8】./configure --prefix=/usr/local/nginx --with-http_gzip_static_module(过程如果报错参照Nginx安装那节,配置对应文件即可)
【9】make && make install
【10】cd /usr/local/nginx/sbin 完成后通过./nginx -s reload重新加载nginx即可

****************************************************************************************************************************************************************************

4、Nginx配置VUE快速访问
【1】npm install --save-dev compression-webpack-plugin
【2】配置压缩打包vue.config.js
const {serverPort} = require("./public/config");
const path = require('path');
const webpack = require('webpack');
const CompressionPlugin = require('compression-webpack-plugin');
const zlib = require('zlib');module.exports = {devServer: {port: serverPort, // 端口},configureWebpack: {resolve: {alias: {'@': path.resolve(__dirname, './src'),'@i': path.resolve(__dirname, './src/assets'),}},plugins: [new webpack.IgnorePlugin(/^./locale$/, /moment$/),// 下面两项配置才是 compression-webpack-plugin 压缩配置// 压缩成 .gz 文件new CompressionPlugin({filename: '[path][base].gz',algorithm: 'gzip',test: /.js$|.css$|.html$/,threshold: 10240,minRatio: 0.8}),// 压缩成 .br 文件,如果 zlib 报错无法解决,可以注释这段使用代码,一般本地没问题,需要注意线上服务器会可能发生找不到 zlib 的情况。new CompressionPlugin({filename: '[path][base].br',algorithm: 'brotliCompress',test: /.(js|css|html|svg)$/,compressionOptions: {params: {[zlib.constants.BROTLI_PARAM_QUALITY]: 11}},threshold: 10240,minRatio: 0.8})]}
}
【3】配置Nginx
server{listen 8088;server_name localhost;# compression-webpack-plugin 配置gzip on;gzip_min_length 1k;gzip_comp_level 9;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary on;# 配置禁用 gzip 条件,支持正则,此处表示 ie6 及以下不启用 gzip(因为ie低版本不支持)gzip_disable "MSIE [1-6].";
}
【4】最后首次访问可以提升到3秒

****************************************************************************************************************************************************************************

学习目标
【1】是什么。可以干什么。Node.js中js的组成部分。使用fs模块读写操作文件。使用path模块处理路径。使用http写一个基本的web服务器。
【2】学习目录:认识node.js。fs path http三个模块的学习。

****************************************************************************************************************************************************************************

1、整体概述
【1】已有基础HTML CSS JS。
【2】浏览器中JS的组成部分。JS核心语法+WebAPI(DOM BOM AJAX...)
【3】为什么JS可以在浏览器中执行?因为JS解析引擎的存在,不同浏览器解析引擎也不同,而Chrome的V8解析引擎性能最好。
【4】为什么JS可以操作DOM与BOM呢?因为浏览器“内置”了DOM与BOM的API,因此才可以调用。
【5】浏览器中JS的运行环境是什么呢?类似于JAVA的JDK。JS的是V8引擎+内置API(DOM BOM AJAX Canvas API等等)。API类似JAVA的基础包。
【6】JS能否做后端开发?答案是肯定的,但是需要借助Node.js。

****************************************************************************************************************************************************************************

2、Node.js概述
【1】Node.js是基于Chrome V8引擎的js运行环境。官方网站https://nodejs.org/zh-cn
【2】Node.js中的js运行环境。V8引擎+内置API。Node.js是js的后端运行环境。Node.js无法调用DOM与BOM等浏览器内置API。
【3】Node.js可以干什么?Node.js提供的是基础,而强大的框架雨后春笋。可以构建Web应用、构建跨平台桌面应用。敢说是后端大宝剑?
【4】主要会js一定可以学会node。学习路径:js基础语法+node.js内置API模块+第三方API模块。类比与js学习 js基础语法+浏览器内置API(DOM+BOM)+三方库(JQuery)

****************************************************************************************************************************************************************************

3、Node.js环境的安装
【1】https://nodejs.org/zh-cn/官网下载安装包。
【2】下载长期维护版我的哥。这个老师是真的细。一般不更改默认目录(不谋而合)。
【3】查看安装的版本号 node -v。

****************************************************************************************************************************************************************************

4、用node运行js代码
【1】终端:用于人机交互的一种方式。辅助我们更好的操作与使用计算机。
【2】打开终端-node xxx.js。
E:A计算机IT0001项目3.VUE学习day1js>node 1.js
hello js
【3】他说的快捷键还没有我的切换到文件夹直接cmd直接。↑↓可以执行上下的命令。使用tab键能快速补全文件名。这不都是我知道的吗...。ESC可以快速清空当前输入未执行的内容。cls清空当前终端。

****************************************************************************************************************************************************************************

6、fs文件系统模块
【1】安装了node,就会自动带fs模块。读取文件。
*******************************************************************
const fs = require("fs");
const res = fs.readFile("day.txt", "utf-8", function (err, data) {console.log(err); // 如果文件不存在,则是一个错误对象。console.log(data);
})
【2】判断是否读取成功
const fs = require("fs");
const res = fs.readFile("day.txt", "utf-8", function (err, data) {if (err) {return console.log("读取文件失败");}console.log(data);
})

****************************************************************************************************************************************************************************

7、写入文件内容
【1】写入的用法
const fs = require("fs");
fs.writeFile("dayOut.txt", "这是我写的", function (err) {if (err) {console.log("写入失败");} else {console.log("写入成功");}
});

****************************************************************************************************************************************************************************

8、整理成绩案例
【1】主要看循环+lambda表达式
let scoreArray = ["小明-98", "小红-97"];
let newArray = [];
scoreArray.forEach(item => {newArray.push(item.replace("-", ":"));
});
newArray = newArray.join("
");
console.log(newArray);

****************************************************************************************************************************************************************************

9、处理路径问题
【1】处理与jar包一样。解决方案使用绝对完整路径。带来了移植性差的问题。使用console.log(__dirname);类似于java的System.getProperty("user.dir");

****************************************************************************************************************************************************************************

10、path路径模块
【1】路径拼接的新方式
let path = require("path");
let finalPath = path.join("/a", "/b/c", "../", "./d", "e");
console.log(finalPath);
【2】改版后的读文件
let path = require("path");
let fs = require("fs");
fs.readFile(path.join(__dirname, "day.txt"), "utf-8", function (err, data) {console.log(data);
})
【3】获取路径最后的参数名。
let path = require("path");
let tempPath = "a/b/index.html"
console.log(path.basename(tempPath))
console.log(path.basename(tempPath, ".html"))
console.log(path.extname(tempPath))
console.log(path.basename(tempPath, path.extname(tempPath)))

****************************************************************************************************************************************************************************

10、时钟案例-分析需求与读取文件内容
【1】用node.js拆分一个整合文件为css/js/html。感觉就是用js的方式做后端该做的事情。
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>info.html</title>
</head>
<body>
<div>主体部分</div>
</body>
<script>console.log("执行了函数");
</script>
</html>
<style>.red {background-color: red;}
</style>
****************************************************
const fs = require("fs");
const path = require("path");
// 正则表达式 s表示空白字符 S表示非空白字符 *表示匹配任意次
const regStyle = /<style>[sS]*</style>/;
const regScript = /<script>[sS]*</script>/;
// 2.1读文件
fs.readFile(path.join(__dirname, "info.html"), "utf-8", function (err, data) {if (err) {return console.log("读取html失败");}// 读取成功 进行拆解resolveCSS(data);resolveJS(data);resolveHTML(data);
})// 定义方法
function resolveCSS(htmlStr) {const res = regStyle.exec(htmlStr);const finalRes = res[0].replace("<style>", "").replace("</style>", "");console.log(finalRes);// 提取的样式写入到文件fs.writeFile(path.join(__dirname, "clock/index.css"), finalRes, function (err) {if (err) {return console.log("写入失败");}console.log("写入样式成功");})
}// js解析方法
function resolveJS(htmlStr) {const res = regScript.exec(htmlStr);const finalRes = res[0].replace("<script>", "").replace("</script>", "");console.log(finalRes);// 提取的样式写入到文件fs.writeFile(path.join(__dirname, "clock/index.js"), finalRes, function (err) {if (err) {return console.log("写入失败");}console.log("写入JS成功");})
}// html解析方法
function resolveHTML(htmlStr) {const res = htmlStr.replace(regStyle, '<link rel="stylesheet" href="./index.css"/>').replace(regScript, '<script src="./index.js"></script>');fs.writeFile(path.join(__dirname, "clock/index.html"), res, function (err) {if (err) {return console.log("写入失败");}console.log("写入HTML成功");})
}

****************************************************************************************************************************************************************************

HTTP模块知识...

****************************************************************************************************************************************************************************

1、http模块概念与作用
【1】负责对外提供网络资源的电脑,叫服务器。负责消费资源的电脑叫做客户端。这个定义对于新手不好理解吧?
【2】常见web服务器软件。IIS、Apache等。能把普通的电脑变成web服务器。tomcat我们走。
【3】http模块可以自己写一个tomcat....

****************************************************************************************************************************************************************************

2、服务器相关的概念
【1】IP地址:唯一性。在0-255之间。互联网中每一台web服务器都有自己的IP地址。自己的电脑可以启动本地服务。127.0.0.1(本地IP)与localhost(本地域名)
【2】域名与域名服务器。IP是身份证号码,而域名相当于人的名字。IP与域名是一一对应关系。存放这份关系的电脑叫做域名服务器(DNS)Domain name server。
【3】端口号。就是现实中的房间号,比如你住酒店,外卖怎么送到你的手里,就需要房间号。服务器可以运行多个服务,每一个服务都住在一个房间。一个端口同时只能一个服务,80/443端口可以省略。

****************************************************************************************************************************************************************************

3、http创建基本web服务
【1】创建与启动web服务器,这玩意让我更懂java了,卧槽。
const http = require("http");
const server = http.createServer();
server.on("request", function (req, res) {console.log("有人访问服务");
})
server.listen(80, () => {console.log("服务器运行在localhost");
})
***********************************************
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {  //  function (req, res)  VS   (req, res) =>是一样的效果console.log("有人访问服务");
})
server.listen(80, () => {console.log("服务器运行在localhost");
})
【2】req请求对象携带数据。
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {console.log(req.url + " VS " + req.method);console.log("有人访问服务");
})
server.listen(80, () => {console.log("服务器运行在localhost");
})
【3】res响应请求
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {console.log(req.url + " VS " + req.method);console.log("有人访问服务");res.end("return data");
})
server.listen(80, () => {console.log("服务器运行在localhost");
})
【4】解决返回中文乱码问题
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {console.log(req.url + " VS " + req.method);console.log("有人访问服务");res.setHeader("Content-type", "text/html; charset=utf-8"); // 这里res.end("return data 返回了");
})
server.listen(80, () => {console.log("服务器运行在localhost");
})

****************************************************************************************************************************************************************************

4、http根据url不同响应对应html内容
【1】判定404与对应网页
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {const url = req.url;let content = '<h1>404 not found</h1>';if (url === "/" || url === "/index.html") {content = '<h1>首页</h1>';} else if (url === "/about.html") {content = '<h1>关于我们</h1>';}res.setHeader("Content-type", "text/html; charset=utf-8");res.end(content);
});
server.listen(80, () => {console.log("服务器运行在localhost");
})

****************************************************************************************************************************************************************************

5、web服务器案例
【1】res.end()这个方法很关键。用到了fs+path模块
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>主页</title>
</head>
<body>
<h1 style="color: red">欢迎大家访问~~~</h1>
</body>
</html>
*************************************************************
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {res.setHeader("Content-type", "text/html; charset=utf-8");const url = req.url;let content = '<h1>404 not found</h1>';if (url === "/" || url === "/index.html") {let fs = require("fs"); //!!!!!!!!!!let path = require("path"); //!!!!!!!!!!fs.readFile(path.join(__dirname, url), "utf-8", (err, data) => {if (err) {console.log("返回失败");res.end('<h1>返回失败</h1>');}res.end(data);});} else if (url === "/about.html") {content = '<h1>关于我们</h1>';res.end(content);}});
server.listen(80, () => {console.log("服务器运行在localhost");
})
**************************************************************优化不加后缀,也可以加在index.html
const http = require("http");
const server = http.createServer();
server.on("request", (req, res) => {res.setHeader("Content-type", "text/html; charset=utf-8");const url = req.url;let content = '<h1>404 not found</h1>';if (url === "/" || url === "/index.html") {let fs = require("fs");let path = require("path");fs.readFile(path.join(__dirname, "/index.html"), "utf-8", (err, data) => {if (err) {console.log("返回失败");res.end('<h1>返回失败</h1>');}res.end(data);});} else if (url === "/about.html") {content = '<h1>关于我们</h1>';res.end(content);}});
server.listen(80, () => {console.log("服务器运行在localhost");
})

****************************************************************************************************************************************************************************

6、模块化概述
【1】目标:好处。CommonJS规范。Node.js中模块的三大分类。能够使用npm。规范的结构包。模块的加载机制
【2】解决复杂问题,而拆解成多个模块。小霸王游戏机:游戏机+游戏卡。把大文件拆分成多个独立、相互依赖的小文件
【3】好处:复用性、可维护性、按需加载。
【4】模块化规范:引入模块、暴露成员。约定大于配置。

****************************************************************************************************************************************************************************

7、模块的分类与require的使用
【1】分类(和java好像呀):内置模块:fs path http
【2】自定义模块:用户创建的每一个js文件,都是一个自定义模块。
【3】第三方模块:第三方开发出来的模块,类似jar包。需要先下载才能使用。
【4】使用require()方法加载。require("fs")  require("./day.js")  require("moment");
console.log("加载了用户自定义模块...");
********************************
const day = require("./day.js"); // require他会执行引用模块的代码。
console.log(day);
*********************************  说明可以省略js的后缀名。
const day = require("./day");
console.log(day);

****************************************************************************************************************************************************************************

8、模块作用域与module对象
【1】模块作用域。函数作用域。模块内的变量、方法,只能在模块内访问。出了模块就访问不到了。从打印的对象是{}空对象可以得出结论。
【2】好处:防止全局变量污染问题。
const name = "陈翔";function say() {console.log("我是 " + name);
}
*************************************打印是空的
const day = require("./day");
console.log(day);
【3】如何向外共享模块作用域中的成员。module对象,每个js自定义模块都有一个module对象,它存储了当前模块的有关信息。
****************************************require拿到的对象,就是导入模块module.exports指向的对象,默认是{}
const name = "陈翔";function say() {console.log("我是 " + name);
}module.exports.name = "蘑菇头";
module.exports.say = function () {console.log("我是 球球");
};
**************************************************
const day = require("./day");
console.log(day);
day.say();
【4】如果module.exports指向新对象,就以新的为准。
const name = "陈翔";function say() {console.log("我是 " + name);
}module.exports.name = name;
module.exports.say = function () {console.log("我是 球球");
};
module.exports = {   // 以新的为准"newName": "闰土",sayHi() {console.log("Hi");}
}
******************************************
let day = require("./day");
console.log(day);

****************************************************************************************************************************************************************************

10、exports对象
【1】说明exports与module.exports是一致的。
console.log(exports === module.exports);
***********************************************************
const name = "陈翔";
module.exports = {"name": name,"say": function () {console.log("大家好");}
}
*********************************************************
const day = require("./day");
console.log(day.name);
day.say();

****************************************************************************************************************************************************************************

11、module.exports使用的误区
【1】都是以module.exports指向的对象为准。module.exports的优先级最高,那就直接用它好了,搞的花里胡哨的。
【2】使用两个反而会搞乱,就用module.exports={...}。时刻谨记require()模块时,得到的永远是module.exports指向的对象。

****************************************************************************************************************************************************************************

12、模块化-CommonJS模块化规范
【1】module变量代表当前模块。module.exports是对外的接口。加载某个模块就是require()方法。

****************************************************************************************************************************************************************************

13、npm包
【1】Node.js中第三方模块又叫包。jar包噗嗤。
【2】包的来源:第三方团队或个人开发者出来的,开源的提供所有人免费使用。
【3】包是基于内置模块API封装出来的,极大的提高了开发效率。类似于JQuery和浏览器内置API之间的关系。
【4】从哪里下载包?https://www.npmjs.com全球最大的包共享平台。下载包https://registry.npmjs.org
【5】npm包管理工具随着node一起安装的。cmd -> npm -v

****************************************************************************************************************************************************************************

14、格式化时间两种方式比对
【1】传统方法VS npm包格式化。
// 格式化时间的方法
function dataF(dataStr) {const dt = padZero(new Date(dataStr));const y = padZero(dt.getFullYear());const m = padZero(dt.getMonth() + 1);const d = padZero(dt.getDate());const hh = padZero(dt.getHours());const mm = padZero(dt.getMinutes());const ss = padZero(dt.getSeconds());return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
}// 补0函数
function padZero(n) {return n > 9 ? n : '0' + n;
}module.exports = {dataF,
}
****************************************************************
const dateF = require("./day");
const dt = new Date();
console.log(dt);
console.log(dateF.dataF(dt));
【2】格式化时间的高级做法(npm)。安装moment包-导入-使用。
npm install 或者npm i
****************************************************************导入的名称就是安装时候的名称
const moment = require("moment");
const dt = moment().format("YYYY-MM-DD HH:mm:ss");  // 怎么用去NPM中心去查
console.log(dt);

****************************************************************************************************************************************************************************

15、使用npm的注意点
【1】node_modules用来存放所有已安装到项目中的包。package-lock.json记录node_modules每个包的下载信息。
【2】千万不要手动修改node_modules或package-lock.json。
【3】指定版本号安装:npm i moment@2.22.2。执行完毕package-lock.json可以看到版本号变成了 "version": "2.22.2"。
【4】2.22.2。第一位数字代表大版本。第二位是功能版本。第三位是bug修复版本。规则:只要前面的版本号增长了,则后面的版本号归零。

****************************************************************************************************************************************************************************

1、包管理配置文件
【1】npm规定在项目根目录中,必须提供一个叫做package.json的包管理配置文件。里面包号了:名称、版本号、指定开发与部署用到的包。
【2】在git上传共享代码时,就比如maven如果把jar包也上传太大了,有个package.json标记需要哪些jar包就可以了。所以一定要把node_modules文件夹添加到.gitignore忽略文件中。
【3】npm init -y 就可以快速创建package.json文件。这个命令只能在英文目录下运行,npm安装时,npm会自动记录包名+版本号。
【4】dependencies节点。专门用来记录npm命令安装了哪些包。npm i jquery art-template同时安装两个包。
{"name": "day1","version": "1.0.0","dependencies": {"art-template": "^4.13.2","jquery": "^3.6.3","moment": "^2.22.2"}
}
【5】如何一次安装所有包。只需要npm i或者npm install就可以全部安装。
【6】卸载包。npm uninstall 这个没有简写。npm uninstall moment。 npm i moment
【7】只在开发阶段用到,项目上线后不会用到,建议把包记录到devDependencies。如果开发与项目上线都需要记录到dependencies。
npm install 包名 -D 简写
npm install 包名 --save-dev 完整的

****************************************************************************************************************************************************************************

2、解决下载包慢的问题
【1】因为默认是从国外https://registry.npmjs.org进行下载的,数据传输需要还低光缆,因此下载包速度很慢。
【2】淘宝npm镜像服务器。把国外的包克隆到淘宝服务器(镜像Mirror),然后从淘宝服务器下载。一些文章还是写着旧的淘宝 NPM 镜像 registry.npm.taobao.org,
但它已于 2022 年 05 月 31 日 废弃,读者需要更换为新的 registry.npmmirror.com 源。
*******************************查看当前从哪里下载
npm get registry
*******************************切换成淘宝镜像
npm config set registry=https://registry.npmmirror.com/
*******************************检查是否设置成功。
npm get registry
【3】npm i nrm -g 安装nrm小工具。注意配置node.js的安装路径添加到环境变量path
nrm ls
nrm use taobao

****************************************************************************************************************************************************************************

3、npm与包
【1】项目包,被安装到node_modules目录中的包,都是项目包。开发依赖包devDependencies。核心依赖包dependencies。
npm -i 包名 -D开发依赖包。npm i 包名 核心依赖包。
【2】全局包,npm i 包名 -g,就是全局包。会放到自己配置的node_global里面,但是我以前配置错了,日尼玛。配置到node_cache里了,卧槽!!!
npm uninstall 包名 -g。卸载全局包。只有工具性的包,才会会使用全局安装,不然就没有必要。也可以参考文档的使用说明。
【3】i5ting_toc可以把md文档转换为html的小工具。
***********************************全局安装
npm install -g i5ting_toc
***********************************转换命令,把md转换为html
i5ting_toc -f 1.md -o
【4】包必须以单独的目录而存在。在包的顶级目录必须包含package.json包管理配置文件。package.json必须包含name/version/main三个属性。

****************************************************************************************************************************************************************************

4、发布包-开发自己的包
【1】创建my_tool,创建package.json、index.js、README.md
****************************************初始化package.json
{"name": "my_tool","version": "1.0.0","main": "index.js","description": "格式化时间","keywords": ["my","tool"],"license": "ISC"
}
****************************************定义格式化时间方法
// 格式化时间的方法
function dataF(dataStr) {const dt = padZero(new Date(dataStr));const y = padZero(dt.getFullYear());const m = padZero(dt.getMonth() + 1);const d = padZero(dt.getDate());const hh = padZero(dt.getHours());const mm = padZero(dt.getMinutes());const ss = padZero(dt.getSeconds());return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
}// 补0函数
function padZero(n) {return n > 9 ? n : '0' + n;
}module.exports = {dataF,
}
*****************************************没有指定index.js,还可以通过package的"main": "index.js",来检索到。
const dt = require("./my_tool");
const dtStr = dt.dataF(new Date());
console.log(dtStr);
【2】不同js的暴露与引用!!!!!!!!!!!!!!!!!
**************************************************************************
// ./src/say.js  进一步拆分为更细的模块(模块的拆分)
function say() {console.log("我叫...");
}module.exports = {say,
}
**************************************************************************
// 格式化时间的方法
function dataF(dataStr) {const dt = padZero(new Date(dataStr));const y = padZero(dt.getFullYear());const m = padZero(dt.getMonth() + 1);const d = padZero(dt.getDate());const hh = padZero(dt.getHours());const mm = padZero(dt.getMinutes());const ss = padZero(dt.getSeconds());return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
}// 补0函数
function padZero(n) {return n > 9 ? n : '0' + n;
}const say = require("./src/say"); // !!!!!!!!!!!!!!!!!注意module.exports = {dataF,...say,// !!!!!!!!!!!!!!!!!注意
}
【3】编写包的说明文档
##安装方式
```
npm i my_tool
```
##导入方式
```js
const my_tool=require("my_tool");
```
##格式化时间
```js
const dt = require("./my_tool");
const dtStr = dt.dataF(new Date());
console.log(dtStr);
```
##说话
```js
dt.say();
```

****************************************************************************************************************************************************************************

8、发布包
【1】注册npm账号。访问https://www.npmjs.com 注册。邮箱账号密码很重要。账号验证通过就可以发布包了。
【2】npm login注意不要登录到淘宝服务器了。nrm use npm(切换到官方服务器)。
【3】把包发布到npm上。终端切换到包的根目录之后(my_tool目录下),运行npm publish即可发布到npm上(注意不能重名)
【4】删除已经发布的包。npm unpublish 包名 --force命令。只能删除72个小时内的包。通过此命令删除的24小时内不能重复发布。尽量不要往npm上发布没有意义的包。

****************************************************************************************************************************************************************************

9、模块的加载机制
【1】模块会被缓存,就意味着多次调用require()不会导致模块代码的多次执行(这个自己注意到过)。
【2】无论自带、自定义、三方都会有限从缓存中加载。从而提高模块的加载效率。
【3】内置模块加载优先级最高。自定义的重名想被加载,需要使用./或../开头。如果require()导入自定义模块,如果省略了扩展名。node.js会分别尝试一下文件。
确切文件名-补全.js-补全.json-补全.node扩展名依次进行加载。
【4】第三方模块的加载机制:如果没有以./或../开头。会从当前模块的父目录开始,常识从./node_modules文件夹中加载第三方模块。
【5】目录作为模块的加载方式:首先查找package.json文件,或者main入口不存在或无法解析,则node.js试图加载目录下index.js文件。

****************************************************************************************************************************************************************************

10、express概述并创建Web服务器
【1】目标:express.static托管资源。express路由精简项目结构。express中间件。express API接口。express中启用跨域资源共享。
【2】express概述:和node.js内置的http类似。是一个npm上的三方包。快速、开放、极简的Web服务器框架。(类似于浏览器中API与JQuery的关系)
【3】express能干什么?干了java干的活,Web网站服务器或API接口服务器。
【4】基本使用
*******************************************************安装
npm i express@4.17.1
******************************************************导入+启动
const express = require("express");
const app = express();
app.listen(80, () => {console.log("服务在localhost启动了...")
})

****************************************************************************************************************************************************************************

11、监听get与post请求&参数处理
【1】如果访问localhost,根据get还是post返回不同内容。
const express = require("express");
const app = express();
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
app.get("/", function (req, res) {res.send({name: "陈翔",age: 26});
});
app.post("/", function (req, res) {res.send("请求成功"); //!!!!!!!!!!!!!!
});
【2】获取url中携带的参数。http://localhost/?name=zs&age=20  能把{"name":"zs","age":"20"}显示在页面。
const express = require("express");
const app = express();
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
app.get("/", function (req, res) {res.send(req.query);
});
app.post("/", function (req, res) {res.send("请求成功");
});
【3】获取URL中的动态参数,完全没必要,我用java 哈哈哈
********************************************************************req.params
const express = require("express");
const app = express();
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
app.get("/:id", function (req, res) { // !!!!!!!!!!!!!!!/:id/:nameres.send(req.params);// !!!!!!!!!!!!!!!
});
app.post("/", function (req, res) {res.send("请求成功");
});
********************************************************************请求
http://localhost/:6

****************************************************************************************************************************************************************************

12、express-静态资源处理
【1】express.static()的使用
***********************************************
const express = require("express");
const app = express();
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
app.use(express.static("../day1")); // 好用呀
***********************************************访问,能看到Main.js的内容
http://localhost/Main.js
【2】托管多个静态资源路径。多次调用app.use(express.static("../day1"));   app.use(express.static("../day2"));如果文件相同,会优先展示day1下面的文件。
【3】挂载路径前缀。没必要的操作...
app.use("/public",express.static("../day1"));  // 访问 http://localhost/public/Main.js

****************************************************************************************************************************************************************************

13、express-安装使用nodemon
【1】能够热加载,重启项目。
npm install -g nodemon
【2】nodemon的使用,在WebStorm打开终端。执行
********************************************************************************!!!!!!!!!
nodemon Main.js
********************************************************************************
const express = require("express");
const app = express();
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
app.use("/public", express.static("../day1"));
********************************************************************************
只要Ctrl+s就可以了。重新启动了!!!

****************************************************************************************************************************************************************************

1、Express路由
【1】概念:现实中的路由,拨号码对应每个人之间的映射关系。客户端的请求与服务器处理函数之间的映射关系。
【2】其实就是路径对应Controller函数。哪有java牛批???
【3】使用案例
const express = require("express");
const app = express();
//挂载路由
app.get("/", (req, res) => {res.send("客户端发起的get请求")  //!!!!!!!!!!!
});
app.post("/", (req, res) => {res.send("客户端发起了post请求") //!!!!!!!!!!!
})
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
app.use("/public", express.static("../day1"));

****************************************************************************************************************************************************************************

2、路由的模块化
【1】都挂载app太多了,需要抽离为单独的模块。创建路由模块的.js文件,调用express.Router()函数创建路由对象。
***********************************************************router.js创建
// 1.导入express
const express = require("express");
// 2.创建路由对象
const router = express.Router();
// 3.挂载具体路由
router.get("/user/list", (req, res) => {res.send("客户端发起了get /user/list")
})
router.post("/user/add", (req, res) => {res.send("发起添加用户post请求")
})
// 4.向外导出对象
module.exports = router;
***********************************************************app.use(router)注册路由模块
const express = require("express");
const app = express();
const router = require("./router");
app.use(router);
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
【2】为路由模块添加前缀,请求就会变成 localhost/before/user/list
const express = require("express");
const app = express();
const router = require("./router");
app.use("/before", router); //!!!!!!!!!!!!!!!!!!!!!!!!
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});

****************************************************************************************************************************************************************************

3、中间件的概念
【1】中间件特指业务流程中的处理环节。处理污水,达到可排放。中间可能有三个处理环节。1 2 3级处理环节就是中间件。
【2】express中间件的调用流程,可以连续调用多个中间件,对这次请求进行预处理。
【3】express中间件本质上是一个function处理函数。他必须包含next()参数。不包含就是路由处理函数。
【4】next函数是多个中间件连续调用的关键。他表示把流转关系交给下一个中间件或路由。

****************************************************************************************************************************************************************************

4、定义中间件函数
【1】中间件函数
const express = require("express");
const app = express();
// 定义中间件函数
const mw = function (req, res, next) {console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
}
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
【2】定义全局中间件函数
const express = require("express");
const app = express();
// 定义中间件函数
const mw = function (req, res, next) {console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
}
app.use(mw); //!!!!!!!!!!!!!!
app.get("/", (req, res) => {res.send("客户端发起get请求");
})
app.get("/1", (req, res) => {res.send("客户端发起get1请求");
})
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
【3】全局中间件的简化形式
const express = require("express");
const app = express();
// 定义中间件函数
/*const mw = function (req, res, next) {console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
}*/
app.use((req, res, next) => {  //!!!!!!!!!!!!!!console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
});
app.get("/", (req, res) => {res.send("客户端发起get请求");
})
app.get("/1", (req, res) => {res.send("客户端发起get1请求");
})
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
【4】中间件的作用。多个中间件可以共享一份req和res的。比如记录请求到达服务器的时间。
const express = require("express");
const app = express();
// 定义中间件函数
/*const mw = function (req, res, next) {console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
}*/
app.use((req, res, next) => {// 获取当前到达服务器时间req.startTime = Date.now();req.msg = "中间件先消费..."console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
});//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
app.get("/", (req, res) => {res.send(req.msg + "客户端发起get请求" + req.startTime);
})
app.get("/1", (req, res) => {res.send(req.msg + "客户端发起get1请求" + req.startTime);
})
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
【5】定义多个中间件
const express = require("express");
const app = express();
// 定义中间件函数
/*const mw = function (req, res, next) {console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
}*/
app.use((req, res, next) => { //!!!!!!!!!!!!!!!// 获取当前到达服务器时间req.startTime = Date.now();req.msg = "中间件先消费..."console.log("最简单的中间件函数")// 流转关系给下一个中间件或路由next()
});
app.use((req, res, next) => {//!!!!!!!!!!!!!!!// 获取当前到达服务器时间req.msg2 = "第二个中间件再消费..."// 流转关系给下一个中间件或路由next()
});
app.get("/", (req, res) => {res.send(req.msg + req.msg2 + "客户端发起get请求" + req.startTime);
})
app.get("/1", (req, res) => {res.send(req.msg + req.msg2 + "客户端发起get1请求" + req.startTime);
})
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});

****************************************************************************************************************************************************************************

5、局部生效中间件
【1】局部中间件函数
const express = require("express");
const app = express();
// 定义中间件函数
const mw = function (req, res, next) {req.msg = "我是中间件函数"// 流转关系给下一个中间件或路由next()
}
app.get("/", mw, (req, res) => { // !!!!!!!只有这个生效,因为三个参数,多了mwres.send(req.msg + "客户端发起get请求" + req.startTime);
})
app.get("/1", (req, res) => {res.send(req.msg + "客户端发起get1请求" + req.startTime);
})
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
【2】使用多个局部中间件
const express = require("express");
const app = express();
// 定义中间件函数
const mw = function (req, res, next) {req.msg = "我是中间件函数..."// 流转关系给下一个中间件或路由next()
}
const mw1 = function (req, res, next) {req.msg1 = "我是中间件函数2..."// 流转关系给下一个中间件或路由next()
}
app.get("/", mw, mw1, (req, res) => {res.send(req.msg + req.msg1 + "客户端发起get请求");}
)
app.get("/1", (req, res) => {res.send(req.msg + "客户端发起get1请求");
})
app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});

****************************************************************************************************************************************************************************

6、中间件的使用注意点
【1】一定要在路由之前定义中间件。可以连续调用多个中间件。不要忘记使用next()函数。在使用next()后不要再写代码了。多中间件共享req res的,可以挂载属性。

****************************************************************************************************************************************************************************

7、中间件的分类
【1】应用级别中间件。路由级别中间件。错误级别中间件。express内置中间件。第三方的中间件。
【2】应用级别绑定在app.use上。express.Router()绑定的叫做路由级别的。
【3】错误级别的中间件是绑定项目中专门捕获发生的异常错误。从而防止崩溃。app.use(function(err,req,res,next))...
***************************************************************************错误级别中间件放在所有的路由之后
const express = require("express");
const app = express();app.get("/", (req, res) => {throw new Error("服务器错误");res.send("get请求");}
)
// 定义错误中间件 捕获错误 防止崩溃(全局)
app.use((err, req, res, next) => {console.log("发生错误" + err.message);res.send("错误信息:" + err.message)
})app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});
【4】Express内置中间件。解析客户端发起请求参数用的,不用深入掌握。
【5】第三方中间件。body-parser三方中间件。

****************************************************************************************************************************************************************************

8、自定义中间件
【1】模拟express.urlencoded中间件。

****************************************************************************************************************************************************************************

9、编写接口?API路由模块
【1】怎么又来了一遍?
// 1.导入express
const express = require("express");
// 2.创建路由对象
const router = express.Router();
// 3.挂载具体路由
router.get("/user/list", (req, res) => {res.send("客户端发起了get /user/list")
})
router.post("/user/add", (req, res) => {res.send("发起添加用户post请求")
})
// 4.向外导出对象
module.exports = router;
************************************************************
const express = require("express");
const app = express();
// 导入模块
const router = require("./router")
app.use(router);app.listen(80, () => {console.log("服务在 http://127.0.0.1 启动了...");
});

****************************************************************************************************************************************************************************

12、编写接口跨域问题
【1】CORS,主流解决方法,一定要在路由之前配置。也是一个中间件。
npm install cors
*******************************************
const cors=require("cors");
*******************************************
app.use(cors())
【2】什么是CORS,跨域资源共享。同源安全策略,配置CORS的的相关HTTP影响头,可以解决浏览器端的跨域访问限制。
【3】注意点:CORS主要在服务端配置,客户端不用。

****************************************************************************************************************************************************************************

13、跨域三个响应头
【1】Access-Control-Allow-Origin。可以指定特定网址,也可以指定*
【2】Access-Control-Allow-Headers。
【3】Access-Control-Allow-Methods。默认支持GET POST HEAD请求,如果需要PUT DELETE请求,需要配置这个。

****************************************************************************************************************************************************************************

14、CORS的请求分类
【1】简单请求:请求方式是GET POST HEAD之一  & HTTP头部信息是常用的字段
【2】预检请求:GET POST HEAD || 包含自定义头部字段 || 向服务器发送了application/json格式的数据。请求后服务器返回允许后,才会发送真正请求。
【3】简单请求与预检请求的区别:

****************************************************************************************************************************************************************************

数据库与身份认证:
【1】配置mysql
【2】认识sql语句
【3】express操作数据库
【4】Session的实现原理
【5】JWT的实现原理

****************************************************************************************************************************************************************************

1、Web开发模式
【1】基于服务端渲染的传统Web开发模式。
*******************************************************优点
前端耗时少、有利于SEO
*******************************************************缺点
占用服务端资源、不利于前后端分离,开发效率低
【2】基于前后端分离的新型Web开发模式,依赖于Ajax技术的广泛引用。后端只负责API接口,前端使用ajax调用接口的开发模式
*******************************************************优点
开发体验好、用户体验好、减轻了服务器端的渲染压力
*******************************************************缺点
不利于SEO
【3】如何选择Web开发模式?需要结合业务场景。

****************************************************************************************************************************************************************************

2、身份认证、身份验证、鉴权
【1】通过一定手段完成对用户身份的确认。保证业务的安全性。
【2】服务端渲染推荐使用Session认证机制。使用前后端分离推荐使用JWT认证机制

****************************************************************************************************************************************************************************

3、Session原理
【1】HTTP协议的无状态性。每次http请求是独立的,多次请求,服务器不会主动保留每次http请求的状态。
【2】如何突破http无状态的限制。超市办法VIP会员卡,绑定你的手机号为会员。3分
【3】Cookie 是存储在用户浏览器的一段不超过4KB的字符串。有效期、安全性、使用范围。特性:自动发送、域名独立、过期时限、4KB限制。
【4】Cookie在身份认证中的作用,客户端登录)—>服务器发Cookie给浏览器—>浏览器存本地,通过请求头发送给服务器,完成身份标记—>交互。
【5】Cookie不具有安全性。因为客户端的Cookie很容易被伪造。重要的隐私数据不要存储重要的隐私信息。
【6】提高身份认证的安全性。客户出示会员卡+刷卡认证或输入手机号查询。这就是Session认证机制的精髓。
【7】客户端登录—>服务器验证通过后,开辟内存将对应账号密码生成Cookie字符串发给浏览器—>浏览器存Cookie到本地—>请求的时候发送给服务器。

****************************************************************************************************************************************************************************

5、JWT
【1】Session认证机制需要配合Cookie才能实现,由于它不支持跨域访问,所以当前后端分离开发的时候,需要做额外的配置,才能实现跨域Session认证。
【2】所以不存在跨域直接使用Session认证即可。但是存在跨域就要使用JWT跨域认证解决方案。
【3】JWT的工作原理。客户端发起请求—>服务端验证账号密码后,经过加密生成token,发送给浏览器。—>浏览器存到LocalStorage或SessionStorage中—>请求是通过Authorization发送给服务器
—>服务器把token字符串还原成信息“对象”。
【4】JWT组成部分:Header+Payload+Signature。使用英文的.分割。Payload才是真正的用户信息。
{id:3,username:"admin"}—>Payload,而Header、Signature是为了保证token的安全性。
【5】JWT的使用方式,通常放在localStorage或者sessionStorage中。推荐做法是把JWT放在HTTP请求头的Authorization字段中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯-路径之谜

题目描述 小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。城堡里面什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡的地面时n*n个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或者纵向移动&#xff0c;但是不能斜着走&#x…

整数的表示和运算

目录 无符号整数 有符号整数 原码表示 原码的缺点 原码-->反码-->补码的转换 原码,补码快速转换技巧(手算) 补码的加法计算 补码的减法计算 总结 无符号整数 无符号整数,即"自然数",0,1,2,3,4,.... C语言中的无符号整数: unsigned short a 1; //无符…

Spark Stream

一、Spark Streaming是什么 Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多&#xff0c;例如&#xff1a;Kafka、Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。数据输入后可以用 Spark 的高度抽象原语如&#xff1a;map、reduce、join、wind…

C++ | Leetcode C++题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution { public:string addBinary(string a, string b) {string ans;reverse(a.begin(), a.end());reverse(b.begin(), b.end());int n max(a.size(), b.size()), carry 0;for (size_t i 0; i < n; i) {carry i < a.siz…

算法学习系列(五十五):背包模型(三)

目录 引言一、潜水员二、背包问题求具体方案三、机器分配四、开心的今明五、金明的预算方案 引言 今天介绍的是背包模型&#xff0c;还是以题目的形式来介绍的。主要讲了背包问题求方案&#xff0c;就是由最优方案递推回去即可。还有就是一些比较经典的背包问题&#xff0c;其…

im即时通讯源码/仿微信app源码+php即时通讯源码带红包+客服+禁言等系统php+uniapp开发

即时通讯(IM)系统是现代互联网应用中不可或缺的一部分&#xff0c;它允许用户进行实时的文本、语音、视频交流。随着技术的发展&#xff0c;IM系统的功能越来越丰富&#xff0c;如红包、客服、禁言等。本文将探讨如何使用PHP语言开发一个功能完备的即时通讯系统&#xff0c;包括…

逻辑漏洞:Cookie脆弱性导致的逻辑漏洞

前几天学习了逻辑漏洞中的越权漏洞和支付漏洞&#xff0c;今天学习一下cookie脆弱性导致的逻辑漏洞 还是和之前一样&#xff0c;所有内容都是参考别的大佬总结好的&#xff0c;我只是在这里进行学习练习 1、cookie介绍 用户在客户端 (一般为浏览器) 中访问某个页面 &#xff0…

电脑崩溃了,之前备份的GHO文件怎么恢复到新硬盘?

前言 之前咱们说到用WinPE系统给电脑做一个GHO镜像备份&#xff0c;这个备份可以用于硬盘完全崩溃换盘的情况下使用。 那么这个GHO镜像文件怎么用呢&#xff1f; 咱们今天详细来讲讲&#xff01; 如果你的电脑系统硬盘崩溃了或者是坏掉了&#xff0c;那么就需要使用之前备份…

华为机考入门python3--(20)牛客20- 密码验证合格程序

分类&#xff1a;字符串 知识点&#xff1a; 遍历字符串的每个字符 for char in my_str: 可以直接比较字符范围 a < char < z 列表统计元素个数 my_list.count(elem) 寻找子串 my_str.find(sub_str) 题目来自【牛客】 import re import sysdef check_…

【算法】唯一分解定理及最lcm和gcd关系 宝石组合

前言 今天在做一道宝石组合的题目时了解到了这个定理&#xff0c;还是蛮有意思的。 思想 唯一分解定理&#xff1a; 对于任何正整数n&#xff0c;有 n p 1 a 1 p 2 a 2 . . . p k a k n p_1^{a1} \times p_2^{a2} \times ... \times p_k^{ak} np1a1​p2a2​...pkak​ …

C语言零基础快速入门视频教程

C语言零基础快速入门视频教程 介绍C语言C语言零基础视频教程领取教程下期更新预报 介绍C语言 C语言零基础快速入门&#xff1a;探索C语言的起源、特性与魅力 在编程世界中&#xff0c;C语言犹如一座古老而坚实的桥梁&#xff0c;连接着计算机科学的过去与现在。作为一门历史悠…

家庭用水安全新举措:保障自来水管和储水设施卫生

随着公众对家庭用水安全意识的提高&#xff0c;如何确保自来水管和楼顶储水罐的安全性和卫生已成为家庭生活中的重要议题。近期&#xff0c;专家针对此问题提出了一系列实用的注意事项和建议。 注意事项&#xff1a; 定期检查&#xff1a;专家强调&#xff0c;家庭应每季度至…

分布式事务—> seata

分布式事务之Seata 一、什么是分布式事务&#xff1f; 分布式事务是一种特殊类型的事务&#xff0c;它涉及多个分布式系统中的节点&#xff0c;包括事务的参与者、支持事务的服务器、资源服务器以及事务管理器。 在分布式事务中&#xff0c;一次大型操作通常由多个小操作组成…

如何查公网IP?

在网络通信中&#xff0c;每个设备都被分配一个独特的IP地址&#xff0c;用于在Internet上进行标识和通信。公网IP是指可以直接从Internet上访问的IP地址&#xff0c;也称为全局IP。通过查公网IP&#xff0c;我们可以了解我们的设备在Internet上的位置和连接状态。 2. 查公网IP…

vue3使用echarts做树图tree

vue3使用echarts做树图tree 1.安装echarts npm install echarts --save2.在main.js引入 import * as echarts from echarts // 全局方法 app.config.globalProperties.$echarts echarts3.使用 <div id"myChart" :style"{ width: 1000px, height: 1000px …

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

[Linux][网络][传输层][UDP]详细讲解

目录 0.预备知识1.端口号的划分范围2.认识知名端口号3.netstat命令4.pidof 1.UDP协议端格式2.UDP特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 0.预备知识 1.端口号的划分范围 端口号的长度是16位&#xff0c;因此端口号的范围是0 ~ 65535 0 ~ 1023…

构建智能化商旅服务:酒店中台云服务架构设计与实践

随着商旅行业的不断发展和智能化趋势的兴起&#xff0c;酒店中台云服务成为了提升服务质量和效率的关键。本文将探讨酒店商旅中台云服务的架构设计与实现&#xff0c;介绍其关键特点和最佳实践&#xff0c;助力商旅行业迈向智能化未来。 1. **需求分析与场景设计&#xff1a;*…

ssm101珠宝首饰交易平台开发+jsp

珠宝首饰交易平台 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于珠宝首饰交易平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了珠宝首饰交易平台&#x…

开源博客项目Blog .NET Core源码学习(20:App.Hosting项目结构分析-8)

本文学习并分析App.Hosting项目中后台管理页面的个人资料页面、修改密码页面。 个人资料页面 个人资料页面用于显示和编辑个人信息&#xff0c;支持从本地上传个人头像。整个页面使用了layui中的表单、日期与时间选择、上传等样式或模块&#xff0c;通过layui.css文件设置样式…