Node.js |(六)express框架 | 尚硅谷2023版Node.js零基础视频教程

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手

在这里插入图片描述

文章目录

  • 📚express使用
    • 🐇初体验
    • 🐇express路由
      • ⭐️路由的使用
      • ⭐️获取请求参数
      • ⭐️获取路由参数
      • 🔥练习:根据路由参数响应歌手信息
    • 🐇express响应设置
    • 🐇express中间件
      • ⭐️定义全局中间件
      • ⭐️定义路由中间件
      • ⭐️静态资源中间件
      • 🔥静态资源中间件练习:局域网内访问网页❓
    • 🐇 获取请求体数据 body-parser
    • 🐇express防盗链
      • 🔥防盗链实践
  • 📚路由模块化Router
    • 🐇介绍
    • 🐇使用
  • 📚EJS模板引擎
    • 🐇介绍
    • 🐇列表渲染
    • 🐇条件渲染
    • 🐇express中使用ejs
  • 📚应用程序生成器express-generator

📚express使用

🐇初体验

  • express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址
  • 简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务)
  • express 本身是一个 npm 包,所以可以通过 npm 安装

    npm init
    npm i express
    
  • 初体验

    //1. 导入 express
    const express = require('express');
    //2. 创建应用对象
    const app = express();
    //3. 创建路由规则
    app.get('/home', (req, res) => {
    	res.end('hello express server');
    });
    //4. 监听端口 启动服务
    app.listen(3000, () =>{
    	console.log('服务已经启动, 端口监听为 3000...');
    });
    

    在这里插入图片描述

🐇express路由

官方定义: 路由确定了应用程序如何响应客户端对特定端点的请求。

⭐️路由的使用

  • 一个路由的组成由请求方法路径回调函数组成。

  • express中提供了一系列方法,使用路由,使用格式如下:app.<method>(path,callback)

  • res.end和res.send的区别

    //导入 express
    const express = require('express');
    //创建应用对象
    const app = express();
    //创建 get 路由
    app.get('/home', (req, res) => {
        res.send('网站首页');
    });
    //首页路由
    app.get('/', (req,res) => {
        res.send('我才是真正的首页');
    });
    //创建 post 路由
    app.post('/login', (req, res) => {
        res.send('登录成功');
    });
    //匹配所有的请求方法
    app.all('/search', (req, res) => {
        res.send('1 秒钟为您找到相关结果约 100,000,000 个');
    });
    //自定义 404 路由
    app.all("*", (req, res) => {
        res.send('<h1>404 Not Found</h1>')
    });
    //监听端口 启动服务
    app.listen(3000, () =>{
        console.log('服务已经启动, 端口监听为 3000');
    });
    

  • 以下是上述代码运行后直接输网址得到的返回。
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 针对login部分,上边那得不到想要的是因为指定了post
    在这里插入图片描述在这里插入图片描述

⭐️获取请求参数

  • express 框架封装了一些 API 来方便获取请求报文中的数据,并且兼容原生 HTTP 模块的获取方式。
    //导入 express
    const express = require('express');
    //创建应用对象
    const app = express();
    //获取请求的路由规则
    app.get('/request', (req, res) => {
    	//1. 获取报文的方式与原生 HTTP 获取方式是兼容的
    	console.log(req.method);
    	console.log(req.url);
    	console.log(req.httpVersion);
    	console.log(req.headers);
    	//2. express 独有的获取报文的方式
    	//获取查询字符串
    	console.log(req.query); // 『相对重要』
    	//获取ip
        console.log(req.ip)
        // 获取指定的请求头
    	console.log(req.get('host'));
    	res.send('请求报文的获取');
    });
    //启动服务
    app.listen(3000, () => {
    	console.log('启动成功....')
    })
    
    在这里插入图片描述

⭐️获取路由参数

  • 路由参数指的是 URL 路径中的参数(数据)
    //导入 express
    const express = require('express');
    
    //创建应用对象
    const app = express();
    
    //创建路由
    app.get('/:id.html', (req, res) => {
      //获取 URL 路由参数
      res.send('商品详情, 商品 id 为' + req.params.id);
    });
    
    
    //监听端口, 启动服务
    app.listen(3000, () => {
      console.log('服务已经启动, 端口 3000 正在监听中....')
    })
    
    在这里插入图片描述

🔥练习:根据路由参数响应歌手信息

//导入 express
const express = require('express');
//导入 json 文件(中括号解构,返回数组)
const {singers} = require('./singers.json');
//创建应用对象
const app = express();

//创建路由
app.get('/singer/:id.html', (req, res) => {
  //获取路由参数
  let {id} = req.params;
  //在数组中寻找对应 id 的数据
  let result = singers.find(item => {
    if(item.id === Number(id)){
      return true;
    }
  });

  //判断
  if(!result){
    res.statusCode = 404;
    res.send(`<h1>404 Not Found</h1>`)
    return;
  }

  res.send(`
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>
    <h2>${result.singer_name}</h2>
    <img src='${result.singer_pic}' />
  </body>
  </html>`);
});

//监听端口, 启动服务
app.listen(3000, () => {
  console.log('服务已经启动, 端口 3000 正在监听中....')
})

在这里插入图片描述

🐇express响应设置

  • express 框架封装了一些 API 来方便给客户端响应数据,并且兼容原生 HTTP 模块的获取方式

    //获取请求的路由规则
    app.get("/response", (req, res) => {
    //1. express 中设置响应的方式兼容 HTTP 模块的方式
    res.statusCode = 404;
    res.statusMessage = 'xxx';
    res.setHeader('abc','xyz');
    res.write('响应体');
    res.end('xxx');
    //2. express 的响应方法
    res.status(500); //设置响应状态码
    res.set('xxx','yyy');//设置响应头
    res.send('中文响应不乱码');//设置响应体
    //连贯操作
    res.status(404).set('xxx','yyy').send('你好朋友')
    //3. 其他响应
    res.redirect('http://atguigu.com')//重定向
    res.download('./package.json');//下载响应
    res.json();//响应 JSON
    res.sendFile(__dirname + '/home.html') //响应文件内容
    });
    

🐇express中间件

  • 中间件(Middleware)本质是一个回调函数。中间件函数可以像路由回调一样访问请求对象(request)和响应对象(response)。
  • 中间件的作用 就是 使用函数封装公共操作,简化代码。
  • 类型:全局中间件和路由中间件。

⭐️定义全局中间件

  • 声明中间件函数

    let recordMiddleware = function(request,response,next){
    	//实现功能代码
    	//.....
    	//执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next)
    	next();
    }
    

    在这里插入图片描述

  • 应用中间件:app.use(recordMiddleware);

  • 声明时直接传递

    app.use(function (request, response, next) {
    	console.log('定义第一个中间件');
    	next();
    })
    
  • express 允许使用 app.use() 定义多个全局中间件

    app.use(function (request, response, next) {
    	console.log('定义第一个中间件');
    	next();
    })
    app.use(function (request, response, next) {
    	console.log('定义第二个中间件');
    	next();
    })
    

/**
 * 记录每个请求的 url 与 IP 地址
 */
//导入 express
const express = require('express');
const fs = require('fs');
const path = require('path');

//创建应用对象
const app = express();

//声明中间件函数(在这里就是起一个函数声明形成模板,不用在每个app里写记录语句)
//把公共代码放这里(这样每次请求都能被记录)
function recordMiddleware(req, res, next){
  //获取 url 和 ip
  let {url, ip} = req;
  //将信息保存在文件中 access.log
  fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url}  ${ip}\r\n`);
  //调用 next,让它去调用后续的路由函数
  next();
}

//使用中间件函数
app.use(recordMiddleware);

//创建路由
app.get('/home', (req, res) => {
  res.send('前台首页');
});

app.get('/admin', (req, res) => {
  res.send('后台首页');
});

app.all('*',(req, res) => {
  res.send('<h1>404 Not Found</h1>')
})

//监听端口, 启动服务
app.listen(3000, () => {
  console.log('服务已经启动, 端口 3000 正在监听中....')
})

在这里插入图片描述

⭐️定义路由中间件

  • 如果只需要对某一些路由进行功能封装 ,则就需要路由中间件。

  • 调用格式如下:

    app.get('/路径',`中间件函数`,(request,response)=>{
    });
    app.get('/路径',`中间件函数1`,`中间件函数2`,(request,response)=>{
    });
    

/**
 * 针对 /admin  /setting 的请求, 要求 URL 携带 code=521 参数, 如未携带提示『暗号错误』  
 */

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

//创建应用对象
const app = express();

//创建路由
app.get('/home', (req, res) => {
  res.send('前台首页');
});

//声明中间件
let checkCodeMiddleware = (req, res, next) => {
  //判断 URL 中是否 code 参数等于 521
  if(req.query.code === '521'){
    // 满足条件就调用
    next();
  }else{
    res.send('暗号错误');
  }
}

//后台
app.get('/admin', checkCodeMiddleware, (req, res) => {
  res.send('后台首页');
});

//后台设置
app.get('/setting', checkCodeMiddleware, (req, res) => {
  res.send('设置页面');
});

app.all('*',(req, res) => {
  res.send('<h1>404 Not Found</h1>')
})

//监听端口, 启动服务
app.listen(3000, () => {
  console.log('服务已经启动, 端口 3000 正在监听中....')
})

在这里插入图片描述
在这里插入图片描述

⭐️静态资源中间件

  • express 内置处理静态资源(css,图片等)的中间件

    //引入express框架
    const express = require('express');
    //创建服务对象
    const app = express();
    //静态资源中间件的设置,将当前文件夹下的public目录作为网站的根目录
    app.use(express.static('./public')); //当然这个目录中都是一些静态资源
    //如果访问的内容经常变化,还是需要设置路由
    //但是,在这里有一个问题,如果public目录下有index.html文件,单独也有index.html的路由,
    //则谁书写在前,优先执行谁
    app.get('/index.html',(request,response)=>{
    	respsonse.send('首页');
    });
    //监听端口
    app.listen(3000,()=>{
    	console.log('3000 端口启动....');
    });
    

    在这里插入图片描述


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

//创建应用对象
const app = express();

//创建路由
app.get('/', (req, res) => {
  res.send('我才是首页~~~');
});

//静态资源中间件设置
app.use(express.static(__dirname + '/public'));


//监听端口, 启动服务
app.listen(3000, () => {
  console.log('服务已经启动, 端口 3000 正在监听中....')
})

在这里插入图片描述
在这里插入图片描述

🔥静态资源中间件练习:局域网内访问网页❓

喵喵大王立大功

  • 首先npm init
  • 其次npm i express
  • 创建server.js
    const express = require('express');
    const app = express();
    
    // 设置静态资源中间件
    app.use(express.static(__dirname + '/todolist'));
    
    app.listen(3000,() =>{
        console.log('服务已经启动,端口3000正在监听中......')
    })
    
  • node .\server.js
    在这里插入图片描述
  • 查看ip地址:cmd ——>ipconfig
  • 可实现局域网内访问喵喵大王立大功的网页(呜三个舍友只有一个可以呜呜)

在这里插入图片描述

  • 解决办法:ISS管理界面修改
    在这里插入图片描述

🐇 获取请求体数据 body-parser

  • 第一步:安装

    npm i body-parser
    
  • 第二步:导入 body-parser 包

    const bodyParser = require('body-parser');
    
  • 第三步:获取中间件函数

    //处理 querystring 格式的请求体
    let urlParser = bodyParser.urlencoded({extended:false}));
    //处理 JSON 格式的请求体
    let jsonParser = bodyParser.json();
    
  • 第四步:设置路由中间件,然后使用 request.body 来获取请求体数据

    app.post('/login', urlParser, (request,response)=>{
    	//获取请求体数据
    	//console.log(request.body);
    	//用户名
    	console.log(request.body.username);
    	//密码
    	console.log(request.body.userpass);
    	response.send('获取请求体数据');
    });
    

  • 应用:记得先装包
/**
 * 按照要求搭建 HTTP 服务
 * 
 * GET   /login  显示表单网页
 * POST  /login  获取表单中的『用户名』和『密码』
 */
//导入 express
const express = require('express');
const bodyParser = require('body-parser')

//创建应用对象
const app = express();

//解析 JSON 格式的请求体的中间件
// const jsonParser = bodyParser.json()

//解析 querystring 格式请求体的中间件
const urlencodedParser = bodyParser.urlencoded({ extended: false })

//创建路由规则
app.get('/login', (req, res) => {
  // res.send('表单页面')
  //响应 HTML 文件内容
  res.sendFile(__dirname + '/11_form.html');
});

//post 规则
app.post('/login', urlencodedParser, (req, res) => {
  //获取 用户名 和 密码
  console.log(req.body);
  res.send('获取用户的数据')
});

//启动服务
app.listen(3000, () => {
  console.log('server is running...');
})

在这里插入图片描述
在这里插入图片描述

🐇express防盗链

在这里插入图片描述

  • 不允许外部网页调用图片。

🔥防盗链实践

  • 关键:关注referer请求头。
  • 功能:只允许127.0.0.1访问
    //导入 express
    const express = require('express');
    
    //创建应用对象
    const app = express();
    
    //声明中间件
    app.use((req, res, next) => {
      //检测请求头中的 referer 是否为 127.0.0.1
      //获取 referer
      let referer = req.get('referer');
      if(referer){
        //实例化
        let url = new URL(referer);
        //获取 hostname
        let hostname = url.hostname;
        //判断
        if(hostname !== '127.0.0.1'){
          //响应 404 
          res.status(404).send('<h1>404 Not Found</h1>');
          return;
        }
      }
      next();
    });
    
    //静态资源中间件设置
    app.use(express.static(__dirname + '/public'));
    
    //监听端口, 启动服务
    app.listen(3000, () => {
      console.log('服务已经启动, 端口 3000 正在监听中....')
    })
    

在这里插入图片描述
在这里插入图片描述

📚路由模块化Router

🐇介绍

  • express 中的 Router 是一个完整的中间件和路由系统,可以看做是一个小型的 app 对象。
  • Router 作用:对路由进行模块化,更好的管理路由。
  • 主文件代码量减少,管理更方便,就类似css,js外部分离。

🐇使用

  • 创建独立的js文件(homeRouter.js)
    //1. 导入 express
    const express = require('express');
    //2. 创建路由器对象
    const router = express.Router();
    //3. 在 router 对象身上添加路由
    router.get('/', (req, res) => {
    res.send('首页');
    })
    router.get('/cart', (req, res) => {
    res.send('购物车');
    });
    //4. 暴露
    module.exports = router;
    
  • 主文件
    const express = require('express');
    const app = express();
    //5.引入子路由文件
    const homeRouter = require('./routes/homeRouter');
    //6.设置和使用中间件
    app.use(homeRouter);
    app.listen(3000,()=>{
    	console.log('3000 端口启动....');
    })
    

在这里插入图片描述

📚EJS模板引擎

🐇介绍

  • 模板引擎是分离用户界面和业务数据的一种通用型技术(但现在用的没那么多了)。
  • EJS 是一个高效的 Javascript 的模板引擎,官网,中文站
  • 下载安装:npm i ejs --save
  • 示例
    //1.引入ejs
    const ejs = require('ejs');
    //2.定义数据
    let person = ['张三','李四','王二麻子'];
    //3.ejs解析模板返回结构
    //<%= %> 是ejs解析内容的标记,作用是输出当前表达式的执行结构
    let html = ejs.render(<%= person.join(",") %>, {person:person});
    //4.输出结果
    console.log(html);
    

在这里插入图片描述

  • 执行js代码:<% code %>
  • 输出转义的数据到模板上:<%= code %>
  • 输出非转义的数据到模板上:<%- code %>

🐇列表渲染

//原生 JS
let str = '<ul>';
xiyou.forEach(item => {
   str += `<li>${item}</li>`;
})
//闭合 ul
str += '</ul>';
console.log(str);

<ul>
    <% xiyou.forEach(item => { %>
    <li><%= item %></li>
    <% }) %>
</ul>

在这里插入图片描述

🐇条件渲染

// 原生 JS
if(isLogin){
  console.log('<span>欢迎回来</span>')
}else{
  console.log('<button>登录</button>  <button>注册</button>');
}

<% if(isLogin){ %>
<span>欢迎回来</span>
<% }else{ %>
<button>登录</button>  <button>注册</button>
<% } %>

在这里插入图片描述

🐇express中使用ejs

//导入 express
const express = require('express');
//导入 path
const path = require('path');
//创建应用对象
const app = express();
//1. 设置模板引擎
app.set('view engine', 'ejs');// pug  twing
//2. 设置模板文件存放位置   模板文件: 具有模板语法内容的文件
app.set('views', path.resolve(__dirname, './views'));

//创建路由
app.get('/home', (req, res) => {
  //3. render 响应
  // res.render('模板的文件名', '数据');
  //声明变量
  let title = '尚硅谷 - 让天下没有难学的技术';
  res.render('home', {title});
  //4. 创建模板文件
});

//监听端口, 启动服务
app.listen(3000, () => {
  console.log('服务已经启动, 端口 3000 正在监听中....')
})

在这里插入图片描述

📚应用程序生成器express-generator

  • 可以快速创建一个应用的骨架
  • 首先全局安装npm install -g express-generator
  • 创建骨架:express -e <文件夹>
    在这里插入图片描述
  • 然后需要安装依赖npm i
  • 运行npm start
    在这里插入图片描述

  • 该有都有,补充什么,在对应内容添加即可。
    在这里插入图片描述

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

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

相关文章

小白学爬虫:通过关键词搜索1688商品列表数据接口|1688商品列表数据接口|1688商品列表数据采集|1688API接口

通过关键词搜索1688商品列表数据接口可以使用1688开放平台提供的API接口实现。以下是使用关键词搜索商品列表数据的基本步骤&#xff1a; 1、注册并获取AppKey。 2、构造请求参数&#xff0c;包括搜索关键词、页码、每页条数等。 3、通过API接口链接&#xff0c;将请求参数发送…

简单漂亮的登录页面

效果图 说明 开发环境&#xff1a;vue3&#xff0c;sass 代码 <template><div class"container"><div class"card-container"><div class"card-left"><span><h1>Dashboard</h1><p>Lorem ip…

后台管理系统解决方案-中大型-Vben Admin

后台管理系统解决方案-中大型-Vben Admin 官网 Vben Admin 在线演示 Vben Admin 为什么选择它 github现有20K星&#xff0c;并且它有个可视化生成表单&#xff0c;我很喜欢 快速开始 # 拉取代码 git clone https://github.com/vbenjs/vue-vben-admin-doc# 安装依赖 yarn#…

【ONE·C++ || 网络基础(二)】

总言 主要内容&#xff1a;演示socke套接字编程&#xff08;TCP模式&#xff09;&#xff0c;介绍序列化和反序列化&#xff0c;并进行演示&#xff08;json版本达成协议编写、守护进程介绍&#xff09;。 文章目录 总言4、基于套接字的TCP网络程序4.0、log.hpp4.1、version1.…

C++中将数据添加到文件的末尾

参考:https://blog.csdn.net/qq_23880193/article/details/44279283 C中文件的读取需要包含fstream文件&#xff0c;即&#xff1a;#include 文件的读取和写入是是通过流操作来的&#xff0c;这不像输入、输出流那样&#xff0c;库中已经定义了对象cin和cout 文件的读取需要声…

【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)

简介 :::warning 【 毕设项目源码推荐 javaweb 项目】 基于 springbootvue 的图书个性化推荐系统的设计与实现适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负…

Etcd 常用命令与备份恢复

1. etcd简介 官方网站&#xff1a;etcd.io 官方文档&#xff1a;etcd.io/docs/v3.5/op-guide/maintenance 官方硬件推荐&#xff1a;etcd.io/docs/v3.5/op-guide/hardware github地址&#xff1a;github.com/etcd-io/etcd etcd是CoreOS团队于2013年6月发起的开源项目&#xf…

算法--数据结构

这里写目录标题 本节内容链表与邻接表链表主要思想链表操作初始化在head结点后面插入普通插入删除操作 例子 双链表&#xff08;双向循环链表&#xff09;主要思想操作初始化双向插入删除第k个点 邻接表主要思想 栈和队列栈主要思想主要操作 队列主要思想操作 单调栈与单调队列…

Kafka中遇到的错误:

1、原因&#xff1a;kafka是一个去中心化结果的&#xff0c;所以在启动Kafka的时候&#xff0c;每一个节点上都需要启动。 启动的命令&#xff1a;kafka-server-start.sh -daemon /usr/local/soft/kafka_2.11-1.0.0/config/server.properties

【凡人修仙传】预计开播倒计时,线下举办超前观影活动,隆重期待

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料凡人最新资讯&#xff0c;《凡人修仙传》这部备受期待的动漫作品&#xff0c;终于在新年之际宣布了定档日期。据悉&#xff0c;该动漫将于11月25日&#xff0c;也就是周六上午11点&#xff0c;与广大…

【C++干货铺】STL简述 | string类的使用指南

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 什么是STL STL的版本 STL的六大组件 STL的缺陷 string类 C语言中的字符串 标准库中的string类 string类常用的接口使用指南 string类中常见的构造 strin…

全国5米高程DEM数据及衍生的坡度数据

坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡度。坡度的表示方法有百分比法、度数法、密位法和分数法四种&#xff0c;其中以百分比法和度数法较为常用。 坡度是地表单元陡缓的程度&#xff0c;通常把坡面的垂直高度和水平距离的比值称为坡…

Jmeter 性能压测 —— 混合场景

性能测试&#xff0c;单场景的目的一般是为了发现缺陷、发现瓶颈。 完成所有单个重点场景的性能测试之后&#xff0c;还需要做一个混合场景的性能测试-评估系统整体性能。 1、场景设计 使用Jmeter 做混合场景设计 在一个测试计划&#xff0c;将每个重点测试场景各创建为一个…

【PC电脑windows环境下-[jetson-orin-NX]Linux环境下-下载工具esptool工具使用-相关细节-简单样例-实际操作】

【PC电脑windows环境下-[jetson-orin-NX]Linux环境下-下载工具esptool工具使用-相关细节-简单样例-实际操作】 1、概述2、实验环境3、 物品说明4-2、自我总结5、本次实验说明1、准备样例2、设置芯片3、编译4、下载5、验证 &#xff08;1&#xff09;windows环境下进行烧写1、下…

服务器的操作系统,你选择哪些?

OpenCloudOS CentOS CentOS Stream Ubuntu Debian Windows Server

两个int(32位)整数m和n的二进制表达中,求有多少个位(bit)不同?

我先来讲一讲这道题的大概意思&#xff1a;假设我们输入的是 0 和 1: 0的32位二进制中为&#xff1a;000……0(32位) 1的32位二进制中为&#xff1a;000……1(32位) 那么就有一位不同。 方法一&#xff1a; 既然是二进制中&#xff0c;那么就是满二进一&#xff0c;就像…

图解三傻排序 选择排序、冒泡排序、插入排序

&#xff08;1&#xff09;选择排序 // 交换 void swap(int arr[], int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp; }// 选择排序 void selectionSort(int arr[],int len) {if (len < 2) return;for (int minIndex, i 0; i < len - 1; i) {minIndex i;f…

chrome driver下载、selenium安装及报错解决

目录 一、Chrome驱动下载 1.查看Chrome版本 2.下载驱动 3.驱动的路径 无法运行驱动 二、selenium的安装与使用 1.安装selenium 2.使用selenium 参考 一、Chrome驱动下载 1.查看Chrome版本 打开Chrome浏览器&#xff0c;点击右上角的三个点&#xff0c;再点击设置。 …

模态对话框和非模态对话框

创建到堆区这样非模态对话框就不会一闪而过 .exec使程序进入阻塞状态 ()[]{}lambda表达式 55号属性可以在对话框关闭的时候将堆区的内存释放掉从而防止内存泄露

Redis系列-Redis数据类型【3】

目录 Redis系列-Redis数据类型【3】字符串类型&#xff08;String&#xff09;SDS (simple dynamic string) 哈希类型&#xff08;Hash&#xff09;列表类型&#xff08;List&#xff09;集合类型&#xff08;Set&#xff09;有序集合类型&#xff08;ZSet&#xff09;字符串类…