【超多代码、超多图解】Node.js一文全解析

news2025/1/16 6:50:36

在这里插入图片描述


目录

    • 一、Node.js简介
      • 1.1什么是Node.js
      • 1.2 Node.js可以做什么
      • 1.3 Node.js的安装
      • 1.4 Node.js的使用
    • 二、模块化处理
      • 2.1 什么是模块化
      • 2.2 内置模块
        • 2.2.1 fs文件系统模块
          • (1)基本用法
          • (2)防止动态拼接
          • (3)路径问题
        • 2.2.2 path内置模块
        • 2.2.3 http内置模块
          • (1) 初始化
          • (2) web服务器
      • 2.3 自定义模块
      • 2.4 外部模块
        • 监听nodemon
      • 2.5 模块化处理
      • 2.6 加载机制
    • 三、包的基本应用
      • 3.1 使用流程
      • 3.2 版本问题
      • 3.3 参数问题
      • 3.4 npm命令
      • 3.5 下载镜像
      • 3.6 开发自己的包
    • 四、Express
      • 4.1 简介
      • 4.2 基本使用
      • 4.3 托管静态资源
      • 4.4 路由
        • 4.4.1 简单挂载
        • 4.4.2 模块化路由
      • 4.5 中间件
        • 4.5.1 基本使用
        • 4.5.2 中间件分类
          • (1)应用
          • (2)路由
          • (3)错误
          • (4)Express 内置
          • (5)第三方
      • 4.6 自定义中间件
      • 4.7 接口
        • 4.7.1 GET接口
        • 4.7.2 POST接口
        • 4.7.3 PUT接口
        • 4.7.4 DELETE接口
        • 4.7.5 区别
    • 五、跨域
      • 5.1 CORS
        • 5.1.1 原理
        • 5.1.2 响应头
        • 5.1.3 分类
          • (1)简单请求
          • (2)预检请求
      • 5.2 JSONP
    • 六、Mysql数据库
      • 6.1 SQL命令
        • 6.1.1 查询
        • 6.1.2 插入
        • 6.1.3 更新
        • 6.1.4 删除
      • 6.2 Node.js使用
        • 6.2.1 初始化
        • 6.2.2 查询
        • 6.2.3 插入
        • 6.2.4 更新
        • 6.2.5 删除
          • (1) 一般删除
          • (2) 标记删除
    • 七、前后端的身份认证
      • 7.1 Web开发模式
        • 7.1.1 基于服务端渲染的传统 Web 开发模式
        • 7.1.2 基于前后端分离的新型 Web 开发模式
      • 7.2 身份认证
      • 7.3 Session认证机制
        • 7.3.1 Cookie
        • 7.3.2 Session


一、Node.js简介

1.1什么是Node.js

Node.js是一个调用内置ApI并且基于Chrome V8引擎的js运行环境,之前自己在本地总结了一些零散的只知识点,今天整合一下发出来。

官网地址: https://nodejs.org/zh-cn/

1.2 Node.js可以做什么

①基于 Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用

②基于 Electron 框架(https://electronjs.org/),可以构建跨平台的桌面应用

③基于restify框架(http://restify.com/),可以快速构建 API 接口项目

④读写和操作数据库、创建实用的命令行工具辅助前端开发、etc…

1.3 Node.js的安装

下载链接https://nodejs.org/en/

QQ截图20220908153309

  • LTS:长期稳定版
  • Current:尝鲜版

查看版本号:node –v

QQ截图20220908153215

学习路线:JavaScript 基础语法 + Node.js 内置 API 模块(fs、path、http等)+ 第三方 API 模块(express、mysql 等)

1.4 Node.js的使用

命令:node js文件名

QQ截图20220908153309

终端快捷键

①使用 ↑ 键,可以快速定位到上一次执行的命令

②使用 tab 键,能够快速补全路径

③使用 esc 键,能够快速清空当前已输入的命令

④输入 cls 命令,可以清空终端

二、模块化处理

2.1 什么是模块化

1

定义:把复杂问题简单化,分成一个个小问题。编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块

把代码进行模块化拆分的好处

  • 提高了代码的复用性
  • 提高了代码的可维护性
  • 可以实现按需加载

2.2 内置模块

定义:由Node.js官方提供,如fs、http、path

2.2.1 fs文件系统模块

(1)基本用法
// 引用内部模块
const fs = require('fs');

// 文件读取
fs.readFile('../files/test-fs.txt', 'utf-8', (err, results) => {
    if (err) return console.log(err.message);// 错误信息err null
    console.log(results);
})

// 文件写入
fs.writeFile('../files/test-fs.txt', 'Node.js', 'utf-8', (err) => {
    if (err) return console.log(err.message);
    console.log('写入文件成功!');
})

注意点

  • readFile只能读取已经存在的文件
  • writeFile写入内容已经有文件,则创建同名文件,再写入文件
  • readFile需要在writeFile后面读取,不然出错
(2)防止动态拼接

在这里插入图片描述

  • node 命令自动将当前路径和js脚本文件路径拼接,而不管.\day总复习这个路径
  • 我们可以使用绝对路径改善

在这里插入图片描述

(3)路径问题
  • ./ 表示当前目录 ../ 表示父级目录../..表示祖父目录
  • 动态拼接,首部不能出现./ ../,否则拼接失败 /…/

2.2.2 path内置模块

定义:拼接绝对路径

  • path.join()
  • path.basename()
  • path.extname()
const fs = require('fs');

const path = require('path');

const fpath = path.join(__dirname, '/../files/test-fs.txt');

fs.readFile(fpath, 'utf-8', (err, results) => {
    console.log(__dirname);
    console.log(path.basename(fpath, '.txt'));
    console.log(path.extname(fpath));

    if (err) return console.log(err.message);
    console.log(results);
})
// test-fs
// .txt
// Node.js

2.2.3 http内置模块

定义Node.js提供创建web服务器

在这里插入图片描述

(1) 初始化
// 导入http模块
const http = require('http');

//创建web服务器实例
const server = http.createServer();

//绑定request事件,监听客户端请求
server.on('request', (req, res) => {
    let str = `路径 ${req.url} 方法 ${req.method}`;
    console.log(str);
    // 向客户端发送中文前,设置响应头
    res.setHeader('Content-Type', 'text/html;charset=utf-8');
    res.end(str);
})


//启动服务器
server.listen(80, () => {
    console.log('http://127.0.0.1');
})
(2) web服务器

在这里插入图片描述

  • 根据浏览器访问的url地址不同,返回相应的绝对路径
const fs = require('fs');
const http = require('http');
const path = require('path');
const server = http.createServer();

let fpath = '';
server.on('request', (req, res) => {
    if (req.url === '/') {
        fpath = path.join(__dirname + '/../files/clock/index.html');
        console.log(__dirname);
        console.log(fpath);
    }
    else {
        fpath = path.join(__dirname + '/../files/clock' + req.url);
    }
    fs.readFile(fpath, 'utf-8', (err, results) => {
        if (err) res.end('404 not find');
        res.end(results);
    })
})

server.listen(80, () => {
    console.log('http://127.0.0.1');
})

2.3 自定义模块

定义:用户自定义的js模块

//引入本地文件
const custom = require('./01-node.js的使用');

在这里插入图片描述

注意:自定义模块开头必须有./ …/

2.4 外部模块

定义:由第三方提供,使用前需要下载

//下载外部导入
const moment = require('moment');

在这里插入图片描述

监听nodemon

npm i nodemon -g

代替node使用nodedmon每次修改内容不需要重启服务器,自动监听

2.5 模块化处理

模块作用域定义:和函数一致,当前模块定义的方法、变量,只能在当前模块访问,防止变量污染

在这里插入图片描述

暴露:通过module.exports或者exports暴露出去,使用 require() 方法导入模块时,导入的结果,永远以module.exports 指向的对象为准

2.6 加载机制

定义一次加载缓存,从缓存加载 内置模块加载优先级MAX

三、包的基本应用

:概念像node.js的第三方模块,包是基于内置模块封装出来的,提供了更高级、更方便的 API,极大的提高了开发效率

npm: 包管理工具

2

3.1 使用流程

  • npm安装包
  • js导入包
  • 根据开发文档使用包
// npm i moment
const moment = require('moment');
const date = moment().format('YYYY-MM-DD HH:mm:ss');
console.log(date);//2022-09-10 10:43:24

3.2 版本问题

包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如 2.24.0
其中每一位数字所代表的的含义如下:

  • 第1位数字:大版本

  • 第2位数字:功能版本

  • 第3位数字:Bug修复版本

    版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零。

npm i comment@2.22.2

3.3 参数问题

在这里插入图片描述

  • node_modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。
  • package-lock.json 配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。
  • package.json项目的名称、版本号、描述等、用到了哪些包、开发期间使用的包、部署使用的包
    • devDependencies :开发依赖
    • dependencies :核心依赖
  • 注意:程序员不要手动修改 node_modules 或 package-lock.json 文件中的任何代码,npm 包管理工具会自动维护它们,今后在项目开发中,一定要把 node_modules 文件夹,添加到 .gitignore 忽略文件中

3.4 npm命令

//安装包 
npm i moment
//安装全局包
npm i 包名 -g
//安装包到开发阶段到devDependencies
npm i 包名 -D
//安装所有依赖包 
npm install
//卸载包 
npm uninstall moment
//查看已经安装的局部包
npm ls
//查看全局安装的包
npm ls -g

查看包命令:https://blog.csdn.net/qq_41664096/article/details/121797260

3.5 下载镜像

在这里插入图片描述

//查看当前npm镜像
npm config get registry
//nrm镜像工具,安装为全局镜像
nrm ls
//切换镜像
nrm use taobao

2

3.6 开发自己的包

一个规范的包,它的组成结构,必须符合以下 3 点要求:

  • 包必须以单独的目录而存在
  • 包的顶级目录下要必须包含 package.json 这个包管理配置文件
  • package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口

3

发布包到npm

  • 镜像切换到npm上
  • npm login登录
  • 发布包 npm publish
  • 删除包 npm unpublish 包名 --force

资源

  • https://www.npmjs.com/ 网站上搜索自己所需要的包
  • https://registry.npmjs.org/ 服务器上下载自己需要的包

四、Express

4.1 简介

Express:基于Node.js http进一步封装,更加高级的Web开发框架

对于前端程序员来说,最常见的两种服务器,分别是:

  • Web 网站服务器:专门对外提供 Web 网页资源的服务器
  • API 接口服务器:专门对外提供 API 接口的服务器

4.2 基本使用

//导入包
const express = require('express');
//创建服务器
const app = express();

app.get('/user', (req, res) => {
    res.send({ : '18', age: 28 });
})

app.post('/user', (req, res) => {
    res.send('post请求');
})

app.get('/', (req, res) => {
    //req.query  ?name=zs&age=18  这种数据
    //http://127.0.0.1?name=zs&age=18
    console.log(req.query);
})
app.post('/:id', (req, res) => {
    //动态匹配参数
    console.log(req.params);
})

//启动服务器
app.listen(80, () => {
    console.log('http://127.0.0.1');
})

4.3 托管静态资源

定义通过路径暴露文件,省去文件路径的描写

const express = require('express');

const app = express();

//托管静态资源,不需要访问
app.use('/public', express.static('../files/clock'));

app.listen(80, () => {
    console.log('http://127.0.0.1');
})

推荐VScode插件:postcode

Express 的中文官网: http://www.expressjs.com.cn/

4.4 路由

在这里插入图片描述

定义:客户端与服务器映射关系

在这里插入图片描述

4.4.1 简单挂载

//导入包
const express = require('express');
//创建服务器
const app = express();

app.get('/user', (req, res) => {
    res.send({ : '18', age: 28 });
})

app.post('/user', (req, res) => {
    res.send('post请求');
})
//启动服务器
app.listen(80, () => {
    console.log('http://127.0.0.1');
})

4.4.2 模块化路由

为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块

将路由抽离为单独模块的步骤如下:

  1. 创建路由模块对应的 .js 文件
  2. 调用express.Router()函数创建路由对象
  3. 向路由对象上挂载具体的路由
  4. 使用 module.exports 向外共享路由对象
  5. 使用app.use()函数注册路由模块

创建路由对象

const express = require('express');//导入包

const router = express.Router();//创建路由对象

//绑定路由规则
router.get('/user/list', (req, res) => {
    res.send('user list message');
})

router.post('/user/add', (req, res) => {
    res.send('user add message');
})

//向外导出路由对象
module.exports = router;

使用路由对象

const express = require('express');
const app = express();

const router = require('./11-模块化路由');

app.use(router);

app.listen(80, () => {
    console.log('http://127.0.0.1');
})

4.5 中间件

在这里插入图片描述

在这里插入图片描述

中间件:与路由处理函数不同,必须包含next参数

4.5.1 基本使用

const express = require('express');
const app = express();
//全局中间件的简化形式
app.use((req, res, next) => {
    console.log('正在使用全局中间件');
    next();
});

app.get('/',(req, res) => {
    res.send('Get message');
})


app.listen(80, () => {
    console.log('http://127.0.0.1');
})

注意

  • 多个中间件共享req,res,上游设置好,下游的中间件/路由使用

  • 中间件定义先后顺序执行

  • 局部生效的中间件,定义在

    • app.get('/',中间件,(req, res) => {
          res.send('Get message');
      })
      
    • 2

  • 路由之前调用中间件

  • next()函数不能忘,后面不用写内容

4.5.2 中间件分类

(1)应用
const express = require('express');
const app = express();

//全局中间件
app.use((req, res, next) => {
    console.log('全局中间件');
    next();
})
//局部中间件
function mw(req, res, next) {
    console.log('局部中间件');
    next();
}

app.get('/', mw, (req, res) => {
    res.send('server is visting');
})
app.listen(80, () => {
    console.log('http://127.0.0.1');
})
(2)路由

定义:绑定到 express.Router() 实例上的中间件

(3)错误

定义捕获项目错误,防止出错,在所有路由之后定义

const express = require('express');
const app = express();


app.get('/', (req, res) => {
    throw new Error('服务器出错');
    res.send('server is visting');
})


//全局中间件
app.use((err, req, res, next) => {
    console.log('Error!' + err.message);
    res.send('Error!' + err.message);
    next();
})

app.listen(80, () => {
    console.log('http://127.0.0.1');
})
//Error!服务器出错
(4)Express 内置

在这里插入图片描述

const express = require('express');
const app = express();

// express.json()解析JSON请求体
app.use(express.json());

//解析application/x-www-
app.use(express.urlencoded({ extended: false }));

app.post('/user', (req, res) => {
    console.log(req.body);
})

app.post('/book', (req, res) => {
    console.log(req.body);
})

app.listen(80, () => {
    console.log('http://127.0.0.1');
})
// http://127.0.0.1
// { name: 'zs', age: 18 }
// [Object: null prototype] { name: '西游记' }

(5)第三方
  • npm install body-parse
  • require导入
  • app.use()为全局
const express = require('express');
const app = express();

const parser = require('body-parser');

app.use(parser.urlencoded({ extended: false }));

app.post('/book', (req, res) => {
    console.log(req.body);
})

app.listen(80, () => {
    console.log('http://127.0.0.1');
})

注意:Express 内置的 express.urlencoded 中间件,就是基于 body-parser 这个第三方中间件进一步封装出来的。

4.6 自定义中间件

封装中间件

const querystring = require('querystring');

function parsebody(req, res, next) {
    let str = '';
    req.on('data', (result) => {
        str += result;
    })
    req.on('end', () => {
        const body = querystring.parse(str);
        req.body = body;
        next();
    })
}

module.exports = parsebody;

测试中间件

const express = require('express');
const app = express();
const parsebody = require('./14-自定义中间件');

app.use(parsebody);

app.post('/user', (req, res) => {
    res.send(req.body);
    console.log(req.body);

})

app.listen(80, () => {
    console.log('http://127.0.0.1');
})

4.7 接口

const express = require('express');
const app = express();

const router = require('./15-接口问题');
app.use(router);

app.listen(80, () => {
    console.log('http://127.0.0.1');
})

4.7.1 GET接口

const express = require('express');

const apiRouter = express.Router();

apiRouter.get('/user', (req, res) => {
    const query = req.query;
    res.send({
        status: 0,
        msg: 'GET 请求成功',
        data: query
    });
})
module.exports = apiRouter;

4.7.2 POST接口

apiRouter.use(express.urlencoded({ extended: false }));

apiRouter.post('/user', (req, res) => {
    const body = req.body;
    res.send({
        status: 0,
        msg: 'POST 请求成功',
        data: body
    });
})

4.7.3 PUT接口

4.7.4 DELETE接口

4.7.5 区别

https://blog.csdn.net/qq_42931285/article/details/119852294

https://zhuanlan.zhihu.com/p/135454697

五、跨域

5.1 CORS

5.1.1 原理

概念:由Http响应头构成,决定浏览器是否阻止js代码获取资源,在服务器端配置

在这里插入图片描述

5.1.2 响应头

在这里插入图片描述

//只允许特定的域名访问、*代表全部
    res.setHeader('Access-Control-Allow-Origin', 'http://www.baidu.com');
//配置请求头信息
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type,X-Custom-Header');
//配置请求头方法 * 代表全部
    res.setHeader('Access-Control-Allow-Methods', 'GET,POST,DELETE,PUT');

5.1.3 分类

(1)简单请求
  • 请求方式:GET、POST、HEAD
  • HTTP 头部信息不超过以下几种字段无自定义头部字段、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type(只有三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)
  • 客户端与服务器只发送一次请求
(2)预检请求
  • 请求方式:GET、POST、HEAD之外的方式
  • 自定义头部字段
  • OPTION预检,成功后发送带有数据的请求

5.2 JSONP

概念:只支持GET请求

六、Mysql数据库

定义组织存储管理数据仓库

6.1 SQL命令

6.1.1 查询

select * from users
where id>1 and id <5

6.1.2 插入

insert into users(username,password) values('jack','666')

6.1.3 更新

update users set password='666666'
where username='jack'

6.1.4 删除

delete from users
where id=9

6.2 Node.js使用

6.2.1 初始化

  • 导包:npm i mysql
//引入mysql
const mysql = require('mysql');
//建立数据库连接
const db = mysql.createPool({
    url: '127.0.0.1',//数据库IP地址
    user: 'root',//账号
    password: '123456',//密码
    database: 'test_db'//操作哪一个数据库
});

6.2.2 查询

const queryStr = 'select * from users';
db.query(queryStr, (err, results) => {
    if (err) return console.log(err.message);
    console.log(results);
})

PS E:\FED\js\node.js\node.js—资料\day总复习\code> node .\18-mysql操作.js
[
  RowDataPacket { id: 1, username: 'zz', password: '123', status: 0 },
  RowDataPacket { id: 2, username: 'ls', password: 'abc', status: 0 },
  RowDataPacket { id: 4, username: 'jony', password: '456', status: 0 }
]

6.2.3 插入

const user = { username: 'superman', password: 'jknad' };
const insertStr = 'insert into users set ?';
db.query(insertStr, user, (err, results) => {
    if (err) return console.log(err.message);
    if (results.affectedRows == 1) {
        console.log('插入数据成功');
    }
})
//插入数据成功

6.2.4 更新

const user = { id: 10, username: 'super', password: '123456' };
const updateStr = 'update users set ? where id=?';
db.query(updateStr, [user, user.id], (err, results) => {
    if (err) return console.log(err.message);
    if (results.affectedRows == 1) {
        console.log('更新数据成功');
    }
})

6.2.5 删除

(1) 一般删除
const deleteStr = 'delete from users where id=?';
db.query(deleteStr, 10, (err, results) => {
    if (err) return console.log(err.message);
    if (results.affectedRows == 1) {
        console.log('删除成功');
    }
})
(2) 标记删除
const deleteStr = 'update users set status=1 where id=?';
db.query(deleteStr, 10, (err, results) => {
    if (err) return console.log(err.message);
    if (results.affectedRows == 1) {
        console.log('删除成功');
    }
})

七、前后端的身份认证

7.1 Web开发模式

7.1.1 基于服务端渲染的传统 Web 开发模式

概念:服务端在后台拼接html页面,发送给客户端,不需要ajax

特点

  • 前端耗时少
  • 有利于SEO
  • 占用服务端资源
  • 不利于前后端分离开发

7.1.2 基于前后端分离的新型 Web 开发模式

概念:后端提供API接口,前端通过ajax调用接口

特点

  • 开发体验好
  • 用户体验好
  • 减轻服务器渲染压力
  • 不利于SEO

不谈业务场景而盲目选择使用何种开发模式都是耍流氓

  • 比如企业级网站,主要功能是展示而没有复杂的交互,并且需要良好的 SEO,则这时我们就需要使用服务器端渲染
  • 而类似后台管理项目交互性比较强,不需要考虑 SEO,那么就可以使用前后端分离的开发模式
  • 另外,具体使用何种开发模式并不是绝对的,为了同时兼顾了首页的渲染速度和前后端分离的开发效率,一些网站采用了首屏服务器端渲染 + 其他页面前后端分离的开发模式

7.2 身份认证

概念:通过不同的手段(验证码、密码、人脸、指纹...),认证客户的身份

1

7.3 Session认证机制

7.3.1 Cookie

在这里插入图片描述

Cookie:存储在浏览器不超过4KB字符串,键值对形式存储

  • 自动发送
  • 域名独立
  • 过期时限
  • 4KB限制
  • 容易伪造,不建议存放隐私数据

在这里插入图片描述

7.3.2 Session

核心会员卡+pos机认证

在这里插入图片描述

  • npm install express-session

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

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

相关文章

前缀函数与KMP算法

一&#xff0c;前缀函数 1&#xff0c;定义 该函数存储一个字符串的各个长度的子串真前缀与真后缀相等的长度&#xff08;注意&#xff0c;真前缀最多长度为n-1&#xff0c;不包含最后一个字符&#xff0c;真后缀同理&#xff0c;不包含第一个字符&#xff09; 用p[i]数组储…

【LeetCode每日一题】——744.寻找比目标字母大的最小字母

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 二分查找 二【题目难度】 简单 三【题目编号】 744.寻找比目标字母大的最小字母 四【题目描述…

【小5聊】基础算法 - 实现字符串1到N位长度的组合关键词

在本篇文章中&#xff0c;我们讲一起了解下基础算法的运用 在程序开发里&#xff0c;算法无处不在&#xff0c;掌握算法才能更好的提高程序效率和质量 【算法返回效果】 【实现的功能描述】 当前算法主要实现输入一定长度的字符串后&#xff0c;能够返回按顺序1个字符长度、…

第二证券|七位投资专家指点2023 战略性看好A股 市场将提供更多机会

2022年行将收官&#xff0c;2023年新征途行将开启。 阅历了本年的一波三折、震动大跌&#xff0c;2023年A股商场将怎么演绎&#xff1f;有哪些时机值得注重&#xff1f;哪些危险要素需求留意&#xff1f; 对此&#xff0c;我国基金报记者专访了来自公募、券商资管、私募的七位…

Vjudge如何绑定洛谷账号

因为洛谷不支持Vjudge的bot提交&#xff0c;一个学弟问我才发现。要绑定洛谷账号才能在vj本地提交&#xff0c;绑定的方法也很奇怪&#xff0c;方法如下。 在题目来自洛谷的题目界面点击提交&#xff0c;出现如下界面。 发现没有bot提交选项&#xff0c;只能选择My Account,点…

NetInside网络攻击分析帮您轻松发现网络异常

分析概述 分析概述从以下四点做介绍。 故障信息来源 根据网络管理老师提供信息&#xff0c;29日上午7点半到9点时分&#xff0c;网络出现过故障。 分析对象 使用NetInside全流量分析系统对改故障进行分析。 分析思路 1、对比分析故障时段与非故障时段总流量信息。 2、对…

硬盘数据恢复的方法有哪些?这五种恢复方法你知道吗

硬盘通常泛指电脑硬盘&#xff0c;也可以将其定义为电脑数据的“载体”。硬盘的主要作用是存储数据&#xff0c;它具有读写速度快、耗能低、体积小等优势&#xff0c;但是在使用过程中&#xff0c;总会遇到硬盘数据丢失问题&#xff0c;比如受病毒感染、误格式化、误删除、操作…

C++中的多态(概念篇)

多态的概念 通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某一个行为&#xff0c;不同的对象去完成时会产生出不同的状态。比如最常见的买票&#xff0c;学生为半价&#xff0c;成人为全票。 多态的分类 静态的多态&#xff1a;如函数重载&#xff0c;看起…

【Linux入门指北】 网站服务

网站服务 文章目录网站服务一、简介二、静态站点三、动态站点1.LAMP2.部署论坛系统discuz3.部署博客系统 wordpress4.部署网上商城 ecshop5.部署网校系统edusoho一、简介 1.前言 UI的转变&#xff1a;B/S架构 2.名词 HTML&#xff08; HyperText Markup Language&#xff09;…

Arduino 简易屏显电子温度计

Arduino 简易屏显电子温度计一、前言二、硬件要求三、参数基础四、原理剖析五、实验思路六、程序概要七、arduino使用接线八、成果展示九、总结一、前言 温度计的使用&#xff0c;在日常生活中随处可见&#xff0c;电子行业也有相应的温控传感器设备&#xff0c;不管的是电子芯…

单片机实训day6——Proteus8.6版本+ STM32F103驱动LCD12864显示Keil5程序设计

内 容&#xff1a;实现LCD显示 学 时&#xff1a;4学时 知识点&#xff1a;LCD12864芯片介绍&#xff0c;读写操作时序&#xff0c;电路设计 重点&#xff1a; 读写操作时序 难点&#xff1a;读写操作时序 时间&#xff1a;2022年12月26日 9:00&#xff5e;11:50 总结&…

抖音小程序实践一:申请初始化

一、官方文档与实践 抖音小程序是什么&#xff1f;从官方视频了解 从2022年开始&#xff0c;字节跳动就开始火力全开的与知名企业合作&#xff0c;推动抖音小程序的孵化&#xff0c;然后逐步开放普通企业争相进入抖音小程序领域&#xff0c;来分一分流量的红利。 巨量星图抖…

微信小程序----使用发布订阅模式

目录 前言 小程序使用PubSubJS 获取 PubSubJS npm 构建 使用pubsub-js 1、使用publish发布消息 2、使用subscribe函数订阅消息 前言 发布-订阅模式 又叫 观察者模式。 它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于…

excel图表设计:如何让数据变化更加可视化

挖掘数据背后的意义&#xff0c;不能只是单纯的将原始数据&#xff0c;从数字变成图表&#xff1b;而是要让数据变化具现出来&#xff0c;能直观看到其变化形态。 在我们的实际工作中&#xff0c;通常会看到很多类似下面这种架构的数据。 【正文】 因为这样的数据是非常常见的…

HTTP协议及Servlet详解

目录 HTTP协议 1、HTTP协议简介 2、HTTP协议特点 3、HTTP协议通信流程&#xff08;工作原理&#xff09; 4、HTTP报文格式 4.1、HTTP请求报文 4.2、HTTP响应报文 4.3、HTTP状态消息 Servlet详解 1、Servlet核心接口和类 1.1、Servlet接口 1.2、GenericServlet抽象类 …

分层自动化测试模型深入研究

分层自动化测试模型的发展 分层自动化测试模型最早是由Mike Cohn在2009年出版的《Succeeding with Agile》书中的第十六章进行阐述的,他说“测试金字塔是分层测试的一种最佳实践“。金字塔自动化测试模型如上图A所示,从下往上分为单元测试、接口测试、界面测试(其实我更习惯…

C语言 指针进阶学完指针必看练习题详解

该篇与上篇衔接 二维数组 int main() {int a[3][4] { 0 };printf("%d\n", sizeof(a));//48 3*4*sizeof(int)printf("%d\n", sizeof(a[0][0]));//4 第一行第一个元素 就是整形大小printf("%d\n", sizeof(a[0]));//16//a[0]就可以理解为 第…

Windows卸载easyconnect

Windows卸载easyconnect卸载深信服VPN客户端easyconnect解决办法卸载SangforPWEx服务手动卸载安装目录卸载深信服VPN客户端easyconnect Windows下的深信服VPN客户端easyconnect无法卸载. 解决办法 下载地址: http://download.sangfor.com.cn/download/product/sslvpn/Sangfor…

浅谈图数据库1:什么是图?

目录 一、图是什么&#xff1f; 二、“图”源自哪里&#xff1f; 三、加权图是什么&#xff1f; 四、有向图是什么&#xff1f; 五、图能给我们带来什么&#xff1f; 一、图是什么&#xff1f; 说到“图” 大部分人首先想到的是这样滴——图像 ​或者是 饼状图 折线图…

【ML实验4】多分类贝叶斯模型

实验代码获取 github repo 山东大学机器学习课程资源索引 实验目的 实验内容 数据集 构建多分类贝叶斯模型 这里的条件独立性指的是特征xjx_jxj​之间相互独立&#xff0c;这是一个十分强的假设。 证明 Problem Set 2 思路主要是证明下面引理&#xff0c;用拉格朗日乘子法&a…