整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Fastjson最想版本RCE漏洞「漏洞分析」

          Fastjson最想版本RCE漏洞「漏洞分析」

          1漏洞編號(hào)

          CVE-2022-25845
          
          CNVD-2022-40233
          
          CNNVD-202206-1037
          

          二、Fastjson知多少

          萬(wàn)惡之源AutoType

          Fastjson的主要功能是將Java Bean序列化為JSON字符串,這樣得到的字符串就可以通過(guò)數(shù)據(jù)庫(kù)等方式進(jìn)行持久化了。

          但是,F(xiàn)astjson在序列化及反序列化的過(guò)程中,沒(méi)有使用Java自帶的序列化機(jī)制,而是自定義了一套機(jī)制。

          對(duì)于JSON框架來(lái)說(shuō),想要把一個(gè)Java對(duì)象轉(zhuǎn)換成字符串,有兩種選擇:

          1、基于屬性

          【一一幫助安全學(xué)習(xí),所有資源文末領(lǐng)取方式一一】
          ①網(wǎng)絡(luò)安全學(xué)習(xí)路線
          ②20份滲透測(cè)試電子書
          ③安全攻防357頁(yè)筆記
          ④50份安全攻防面試指南
          ⑤安全紅隊(duì)滲透工具包
          ⑥網(wǎng)絡(luò)安全必備書籍
          ⑦100個(gè)漏洞實(shí)戰(zhàn)案例
          ⑧安全大廠內(nèi)部教程

          TOC

          1.認(rèn)識(shí)webpack

          • webpack是一個(gè)現(xiàn)代的JavaScript應(yīng)用的靜態(tài)模塊打包工具
          • 1.模塊化
          • 在ES6之前,我們要想進(jìn)行模塊化開(kāi)發(fā),就必須借助于其他的工具,讓我們可以進(jìn)行模塊化開(kāi)發(fā)。
          • 并且在通過(guò)模塊化開(kāi)發(fā)完成了項(xiàng)目后,還需要處理模塊間的各種依賴,并且將其進(jìn)行整合打包。 而webpack其中一個(gè)核心就是讓我們可能進(jìn)行模塊化開(kāi)發(fā),并且會(huì)幫助我們處理模塊間的依賴關(guān)系。
          • 而且不僅僅是JavaScript文件,我們的CSS、圖片、json文件等等在webpack中都可以被當(dāng)做


          • 2.打包
          • 將webpack中的各種資源模塊進(jìn)行打包合并成一個(gè)或多個(gè)包(Bundle)
          • 并且在打包的過(guò)程中,還可以對(duì)資源進(jìn)行處理,比如壓縮圖片,將scss轉(zhuǎn)成css,將ES6語(yǔ)法轉(zhuǎn)成ES5語(yǔ)法,將TypeScript轉(zhuǎn)成JavaScript等等操作。


          • 3.和grunt/gulp的對(duì)比
          • 如果你的工程模塊依賴非常簡(jiǎn)單,甚至是沒(méi)有用到模塊化的概念。
          • 只需要進(jìn)行簡(jiǎn)單的合并、壓縮,就使用grunt/gulp即可。
          • 但是如果整個(gè)項(xiàng)目使用了模塊化管理,而且相互依賴非常強(qiáng),我們就可以使用更加強(qiáng)大的webpack

          在這里插入圖片描述



          2.webpack的安裝

          • 安裝node.js(https://nodejs.org/zh-cn/)
          • 查看node版本 node -v
          • 全局安裝webpack npm install webpack@3.6.0 -g,指定了版本為3.6.0
          • 局部安裝webpack cd 對(duì)應(yīng)目錄;npm install webpack@3.6.0 --save-dev
          • 其中--save-dev是開(kāi)發(fā)時(shí)依賴,項(xiàng)目打包后不需要繼續(xù)使用
          • 為什么全局安裝后,還需要局部安裝呢?
          • 在終端直接執(zhí)行webpack命令,使用的全局安裝的webpack
          • 當(dāng)在package.json中定義了scripts時(shí),其中包含了webpack命令,那么使用的是局部webpack


          3.webpack的起步

          • 創(chuàng)建目錄結(jié)構(gòu)

          在這里插入圖片描述


          • 文件和文件夾解析:
          • dist文件夾:用于存放之后打包的文件
          • src文件夾:用于存放我們寫的源文件
          • main.js:項(xiàng)目的入口文件。
          • mathUtils.js:定義了一些數(shù)學(xué)工具函數(shù),可以在其他地方引用,并且使用。
          • info.js:定義了一些變量信息


          • index.html:瀏覽器打開(kāi)展示的首頁(yè)html
          • package.json:通過(guò)npm init生成的,npm包管理的文件


          • mathUtils.js function add(num1,num2){ return num1 + num2; } function mul(num1,num2){ return num1*num2; } module.exports={ add, mul }
          • info.js javascript<br />export const name='why';<br />export const height=180;<br />
          • main.js const {add,mul}=require('./mathUtils.js'); console.log(add(20,30)); console.log(mul(20,30)); import {name,height} from './info.js'; console.log(name); console.log(height); 注:可以看到main.js引入了其它js文件
          • webpack打包 webpack ./src/main.js ./dist/bundle.js
          • 打包后會(huì)在dist文件下,生成一個(gè)bundle.js文件
          • bundle.js文件,是webpack處理了項(xiàng)目直接文件依賴后生成的一個(gè)js文件,我們只需要將這個(gè)js文件在index.html中引入即可
          • index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script src="dist/bundle.js"></script> </body> </html>

          4.webpack的配置

          • 目標(biāo):簡(jiǎn)化上面的打包命令
          • 1.創(chuàng)建webpack.config.js文件 const path=require('path') module.exports={ entry : "./src/main.js", output: { path: path.resolve(__dirname,'dist'), //動(dòng)態(tài)獲取絕對(duì)路徑,__dirname是node中全局變量 filename : "bundle.js" }, }
          • 2.npm init,生成package.json文件,這里面是針對(duì)當(dāng)前項(xiàng)目的主要描述文件(里面會(huì)生成所有安裝的依賴)

          在這里插入圖片描述


          • 3.局部安裝webpack----cd 當(dāng)前目錄;npm install webpack@3.6.0 --save-dev,生成node模塊

          在這里插入圖片描述


          • 4.配置package.json文件,簡(jiǎn)化命令

          在這里插入圖片描述


          • 5.命令npm run build

          5.loader的使用

          • 在開(kāi)發(fā)中我們不僅僅有基本的js代碼處理,我們也需要加載css、圖片,也包括一些高級(jí)的將ES6轉(zhuǎn)成ES5代碼,將TypeScript轉(zhuǎn)成ES5代碼,將scss、less轉(zhuǎn)成css,將.jsx、.vue文件轉(zhuǎn)成js文件等等
          • 對(duì)于webpack本身的能力來(lái)說(shuō),對(duì)于這些轉(zhuǎn)化是不支持的。需要webpack擴(kuò)展對(duì)應(yīng)的loader
          • loader使用過(guò)程:
          • 步驟一:通過(guò)npm安裝需要使用的loader
          • 步驟二:在webpack.config.js中的modules關(guān)鍵字下進(jìn)行配置


          5.1 css的loader使用

          • 1.創(chuàng)建css文件

          在這里插入圖片描述

          css<br />body {<br /> background-color:red; <br />}<br />

          • 2.main.js引用 //1.使用commonjs的模塊化規(guī)范 const {add,mul}=require('./js/mathUtils.js'); console.log(add(20,30)); console.log(mul(20,30)); //2.使用ES6的模塊化規(guī)范 import {name,height} from './js/info.js'; console.log(name); console.log(height); //3.依賴css文件 require("./css/normal.css")
          • 3.run build打包(報(bào)錯(cuò))

          在這里插入圖片描述


          • 4.https://v4.webpack.docschina.org/loaders/,配置cssloader文檔
          • 5.npm install --save-dev css-loader@2.0.2
          • 6.npm install style-loader@0.23.1 --save-dev
          • 7.配置webpack.json.js文件

          在這里插入圖片描述


          • 8.index.html的使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> 你好 <h2> 你好 </h2> <script src="dist/bundle.js"></script> </body> </html>

          5.2 less的loader使用(同理)

          • 1.創(chuàng)建less文件

          在這里插入圖片描述

          @fontSize: 50px; @fontColor: orange; body{ font-size: @fontSize; color: @fontColor; }

          • 2.引入less文件(main.js) //1.使用commonjs的模塊化規(guī)范 const {add,mul}=require('./js/mathUtils.js'); console.log(add(20,30)); console.log(mul(20,30)); //2.使用ES6的模塊化規(guī)范 import {name,height} from './js/info.js'; console.log(name); console.log(height); //3.依賴css文件 require("./css/normal.css") //4.依賴less文件 require("./css/special.less")
          • 3.npm install less-loader@4.1.0 --save-devnpm install less@3.9.0 --save-dev
          • 4.配置webpack.json.js文件

          在這里插入圖片描述


          • 5.打包 run build

          5.3 圖片文件處理

          • 1.創(chuàng)建img文件

          在這里插入圖片描述


          • 2.修改css文件 body { /* background-color:red; */ background-image: url("../img/timg.jpg"); }
          • 3.直接打包會(huì)出錯(cuò),需要安裝url-loader包 npm install url-loader@1.1.2 --save-dev
          • 4.修改webpack.json.js文件

          在這里插入圖片描述


          • 5.這時(shí)候打包會(huì)成功,但是換了一張的圖片就會(huì)報(bào)錯(cuò)

          在這里插入圖片描述


          • 6、安裝file-loader處理大文件npm install file-loader@3.0.1 --save-dev
          • 7、再次打包即可成功

          在這里插入圖片描述

          注:可以發(fā)現(xiàn),對(duì)于大的圖片打包成功會(huì)輸出到dist文件夾下,此時(shí)引用的話會(huì)找不到,需要配置下路徑

          • 8.修改webpack.config.js

          在這里插入圖片描述


          • 9.另外對(duì)于生成的圖片名字太長(zhǎng),我們可以配置下生成規(guī)則--webpack.config.js,表示生成名字+8位哈希值+擴(kuò)展名

          在這里插入圖片描述


          5.4 babel的使用(es6轉(zhuǎn)es5)

          • 1.npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
          • 2.配置webpack.json.js文件

          在這里插入圖片描述


          • run build

          6.webpack中配置Vue

          6.1 引入vue.js

          • 1 . npm install vue@2.5.21 --save 因?yàn)槲覀兒罄m(xù)是在實(shí)際項(xiàng)目中也會(huì)使用vue的,所以并不是開(kāi)發(fā)時(shí)依賴
          • 2 . main.js引入 //1.使用commonjs的模塊化規(guī)范 const {add,mul}=require('./js/mathUtils.js'); console.log(add(20,30)); console.log(mul(20,30)); //2.使用ES6的模塊化規(guī)范 import {name,height} from './js/info.js'; console.log(name); console.log(height); //3.依賴css文件 require("./css/normal.css") //4.依賴less文件 require("./css/special.less") //5.使用Vue進(jìn)行開(kāi)發(fā) import Vue from "vue" new Vue({ el:'#app', data:{ name : 'codewhy' } })
          • 3.run build(報(bào)錯(cuò))---這個(gè)錯(cuò)誤說(shuō)的是我們使用的是runtime-only版本的Vue,

          在這里插入圖片描述


          • 4.修改webpack.config.js配置,即可成功

          在這里插入圖片描述


          • 5.index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body > <div id="app"> 你好 </div> <h2> 你好 </h2> <script src="dist/bundle.js"></script> </body> </html>

          6.2 el和template的區(qū)別

          • 正常運(yùn)行之后,我們來(lái)考慮另外一個(gè)問(wèn)題:
          • 如果我們希望將data中的數(shù)據(jù)顯示在界面中,就必須是修改index.html
          • 如果我們后面自定義了組件,也必須修改index.html來(lái)使用組件
          • 但是html模板在之后的開(kāi)發(fā)中,我并不希望手動(dòng)的來(lái)頻繁修改,是否可以做到呢?


          • 定義template屬性:
          • 在前面的Vue實(shí)例中,我們定義了el屬性,用于和index.html中的#app進(jìn)行綁定,讓Vue實(shí)例之后可以管理它其中的內(nèi)容
          • 這里,我們可以將div元素中的{{message}}內(nèi)容刪掉,只保留一個(gè)基本的id為div的元素
          • 但是如果我依然希望在其中顯示{{message}}的內(nèi)容,應(yīng)該怎么處理呢?
          • 我們可以再定義一個(gè)template屬性,代碼如下:

          在這里插入圖片描述



          • 那么,el和template模板的關(guān)系是什么呢?
          • 在我們之前的學(xué)習(xí)中,我們知道el用于指定Vue要管理的DOM,可以幫助解析其中的指令、事件監(jiān)聽(tīng)等等。
          • 而如果Vue實(shí)例中同時(shí)指定了template,那么template模板的內(nèi)容會(huì)替換掉掛載的對(duì)應(yīng)el的模板。


          • 這樣做有什么好處呢?
          • 這樣做之后我們就不需要在以后的開(kāi)發(fā)中再次操作index.html,只需要在template中寫入對(duì)應(yīng)的標(biāo)簽即可


          6.3 分離template模板

          • 書寫template模塊非常麻煩怎么辦呢?
          • 沒(méi)有關(guān)系,稍后我們會(huì)將template模板中的內(nèi)容進(jìn)行抽離。
          • 會(huì)分成三部分書寫:template、script、style,結(jié)構(gòu)變得非常清晰。

          在這里插入圖片描述



          • 1 .App.vue文件 <template> <div> <h2 class="title">{{message}}</h2> <button @click="btnClick">按鈕</button> <h2>{{name}}</h2> <Cpn/> </div> </template> <script> import Cpn from "./Cpn.vue" export default { name:"App", components: { Cpn }, data(){ return { name : 'codewhy', message:"123" } }, methods:{ btnClick(){ } } } </script> <style scoped> .title{ color:green; } </style>
          • 2 .子組件Cpn.vue文件 <template> <div> <h2 class="title">我是cpn組件的標(biāo)題</h2> <p>我是cpn組件的內(nèi)容</p> <h2>{{name}}</h2> </div> </template> <script> export default { name:"Cpn", data(){ return { name : 'Cpn的組件的name', } }, methods:{ btnClick(){ } } } </script> <style scoped> .title{ color:green; } </style>
          • 3 .main.js引入App.vue //1.使用commonjs的模塊化規(guī)范 const {add,mul}=require('./js/mathUtils.js'); console.log(add(20,30)); console.log(mul(20,30)); //2.使用ES6的模塊化規(guī)范 import {name,height} from './js/info.js'; console.log(name); console.log(height); //3.依賴css文件 require("./css/normal.css") //4.依賴less文件 require("./css/special.less") //5.使用Vue進(jìn)行開(kāi)發(fā) import Vue from "vue" // import App from "./vue/app" import App from './vue/App.vue' const app=new Vue({ el:'#app', // 如果同時(shí)有el和template,會(huì)直接用template 替換掉el內(nèi)容 template: <App/> , components:{ App } })
          • 4 .index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body > <div id="app"> 你好 </div> <h2> 你好 </h2> <script src="dist/bundle.js"></script> </body> </html>

          7.認(rèn)識(shí)plugin

          7.1 添加版權(quán)聲明

          • 在webpack.config.js配置如下

          在這里插入圖片描述


          • 重新打包

          在這里插入圖片描述


          7.2 HtmlWebpackPlugin

          • 目的:將index.html打包到dist中
          • 1.安裝插件npm install html-webpack-plugin@3.2.0 --sava-dev
          • 2.在webpack.config.js導(dǎo)入

          在這里插入圖片描述


          • 3.因?yàn)閕ndex.html的js 打包后會(huì)自動(dòng)引入,所以注釋了dist 以及下面的內(nèi)容 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body > <div id="app"> 你好 </div> <!-- <script src="dist/bundle.js"></script> --> </body> </html>
          • 4.最后生成的如下

          在這里插入圖片描述


          7.3 壓縮js的插件

          • 1.npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
          • 2.配置webpack.config.js

          在這里插入圖片描述


          • 3.npm run build
          • 對(duì)js丑化

          在這里插入圖片描述



          8.plugin的使用搭建本地服務(wù)器

          • webpack提供了一個(gè)可選的本地開(kāi)發(fā)服務(wù)器,這個(gè)本地服務(wù)器基于node.js搭建,內(nèi)部使用express框架,可以實(shí)現(xiàn)我們想要的讓瀏覽器自動(dòng)刷新顯示我們修改后的結(jié)果。
          • 不過(guò)它是一個(gè)單獨(dú)的模塊,在webpack中使用之前需要先安裝它
          • npm install --save-dev webpack-dev-server@2.9.1


          • 修改webpack.config.js
          • devserver也是作為webpack中的一個(gè)選項(xiàng),選項(xiàng)本身可以設(shè)置如下屬性:
          • contentBase:為哪一個(gè)文件夾提供本地服務(wù),默認(rèn)是根文件夾,我們這里要填寫./dist
          • port:端口號(hào)
          • inline:頁(yè)面實(shí)時(shí)刷新
          • historyApiFallback:在SPA頁(yè)面中,依賴HTML5的history模式

          在這里插入圖片描述


          • 修改package.json文件

          在這里插入圖片描述


          • 開(kāi)始熱部署npm run dev

          在這里插入圖片描述

          這樣就會(huì)實(shí)現(xiàn),當(dāng)文件改變的時(shí)候,頁(yè)面會(huì)自動(dòng)修改,因?yàn)榇藭r(shí)這些修改保存到了內(nèi)存中,類似于java的熱部署

          • 補(bǔ)充1:(自動(dòng)打開(kāi)鏈接)

          在這里插入圖片描述


          • 補(bǔ)充2:js壓縮在開(kāi)發(fā)中,不應(yīng)該使用

          在這里插入圖片描述


          9.webpack的配置分離

          • 目的:開(kāi)發(fā)時(shí),使用一個(gè)配置文件;發(fā)布時(shí)使用另一個(gè)配置文件
          • npm install webpack-merge@4.1.5 --save-dev 安裝merge包,用于合并下面的配置文件
          • 所以將webpack.config.js抽離成3個(gè)文件
          • 1 . base.config.js const path=require('path') const webpack=require('webpack') const HtmlWebpackPlugin=require('html-webpack-plugin') const uglifyjsWebpackPlugin=require('uglifyjs-Webpack-plugin') module.exports={ entry : "./src/main.js", output: { path: path.resolve(__dirname,'../dist'), //動(dòng)態(tài)獲取絕對(duì)路徑,__dirname是node中全局變量 filename : "bundle.js", //publicPath: 'dist/' }, plugins:[ new webpack.BannerPlugin('最終版權(quán)swz所有!'), new HtmlWebpackPlugin({ template:'index.html' }), //new uglifyjsWebpackPlugin() ], module: { rules: [ { test: /\.css/,//style¨E45Eloader將模塊的導(dǎo)出作為樣式添加到DOM中//css¨E45Eloader解析CSS文件后,使用import加載,并且返回CSS代碼//使用多個(gè)loader時(shí),是從右向左use:¨E91E′style¨E45Eloader′,′css¨E45Eloader′¨E93E¨E125E,¨E123Etest:/¨E92E.less/, // style-loader 將模塊的導(dǎo)出作為樣式添加到 DOM 中 // css-loader 解析 CSS 文件后,使用 import 加載,并且返回 CSS 代碼 //使用多個(gè)loader時(shí),是從右向左 use: ['style-loader','css-loader'] }, { test: /\.less/,//style¨E45Eloader將模塊的導(dǎo)出作為樣式添加到DOM中//css¨E45Eloader解析CSS文件后,使用import加載,并且返回CSS代碼//使用多個(gè)loader時(shí),是從右向左use:¨E91E′style¨E45Eloader′,′css¨E45Eloader′¨E93E¨E125E,¨E123Etest:/¨E92E.less/, use: [{ loader: 'style-loader' // creates style nodes from JS strings }, { loader: 'css-loader' // translates CSS into CommonJS }, { loader: 'less-loader' // compiles Less to CSS }] }, { test: /\.(png|jpg|jpeg|gif)/i,use:¨E91E¨E123Eloader:′url¨E45Eloader′,options:¨E123E//當(dāng)加載的圖片,小于limit時(shí),會(huì)將圖片編譯成base64字符串形式//反之,需要使用file¨E45Eloader沒(méi)模塊進(jìn)行加載limit:13000,//¨E91E¨E93E表示變量name:′img/¨E91Ename¨E93E.¨E91Ehash:8¨E93E.¨E91Eext¨E93E′¨E125E¨E125E¨E93E¨E125E,¨E123Etest:/¨E92E.m?js/i, use: [ { loader: 'url-loader', options: { //當(dāng)加載的圖片,小于limit時(shí),會(huì)將圖片編譯成base64字符串形式 //反之,需要使用file-loader沒(méi)模塊進(jìn)行加載 limit: 13000, //[]表示變量 name: 'img/[name].[hash:8].[ext]' } } ] }, { test: /\.m?js/i,use:¨E91E¨E123Eloader:′url¨E45Eloader′,options:¨E123E//當(dāng)加載的圖片,小于limit時(shí),會(huì)將圖片編譯成base64字符串形式//反之,需要使用file¨E45Eloader沒(méi)模塊進(jìn)行加載limit:13000,//¨E91E¨E93E表示變量name:′img/¨E91Ename¨E93E.¨E91Ehash:8¨E93E.¨E91Eext¨E93E′¨E125E¨E125E¨E93E¨E125E,¨E123Etest:/¨E92E.m?j exclude: , : { : , : { : [] } } }, { : s/,//exclude 排除,include包含/(node_modules|bower_components)/useloader'babel-loader'optionspresets'es2015'test/\.vue/,use:¨E91E′vue¨E45Eloader′¨E93E¨E125E¨E93E¨E125E,resolve:¨E123Ealias:¨E123E′vue/, : [] } ] }, :{ : { use'vue-loader'resolvealias'vue/,use:¨E91E′vue¨E45Eloader′¨E93E¨E125E¨E93E¨E125E,resolve:¨E123Ealias:¨E123E′vu: } }} e'"vue/dist/vue.esm.js"
          • 2 . prod.config.js const uglifyjsWebpackPlugin=require('uglifyjs-Webpack-plugin') const webpackMerge=require('webpack-merge') const baseConfig=require('./base.config') module.exports=webpackMerge(baseConfig, {plugins:[ new uglifyjsWebpackPlugin() ] })
          • 3 . dev.config.js const webpackMerge=require('webpack-merge') const baseConfig=require('./base.config') module.exports=webpackMerge(baseConfig, { devServer:{ contentBase: "./dist", inline: true } })
          • 修改配置文件package.json

          在這里插入圖片描述

          注:以上安裝的模塊的版本要對(duì)應(yīng)!!!

          學(xué)習(xí)視頻: https://www.bilibili.com/video/BV15741177Eh?p=90&spm_id_from=pageDriver

          在 Vue.js 中,使用 Element UI 的 `el-table` 組件實(shí)現(xiàn)跨頁(yè)多選功能,可以通過(guò)以下步驟實(shí)現(xiàn):
          
          1. 在 `el-table` 上添加 `@selection-change` 事件監(jiān)聽(tīng)器,用于監(jiān)聽(tīng)選擇狀態(tài)的變化。
          2. 在事件處理函數(shù)中,判斷當(dāng)前頁(yè)是否與上一次選擇的頁(yè)相同,如果相同則不進(jìn)行多選操作。
          3. 如果需要實(shí)現(xiàn)跨頁(yè)多選,可以在切換頁(yè)時(shí)清空已選中的數(shù)據(jù)。
          
          下面是一個(gè)簡(jiǎn)單的代碼示例:
          
          ```html
          <template>
              <div>
                  <el-table :data="tableData" @selection-change="handleSelectionChange" ref="multipleTable">
                      <el-table-column type="selection" width="55"></el-table-column>
                      <el-table-column prop="date" label="日期" width="180"></el-table-column>
                      <el-table-column prop="name" label="姓名" width="180"></el-table-column>
                  </el-table>
                  <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
                      :page-sizes="[10, 20, 30, 40]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
                      :total="total">
                  </el-pagination>
              </div>
          </template>
          
          <script>
          export default {
              data() {
                  return {
                      tableData: [{
                          date: '2016-05-02',
                          name: '王小虎',
                          age: 27
                      }, {
                          date: '2016-05-04',
                          name: '王小虎',
                          age: 29
                      }, {
                          date: '2016-05-01',
                          name: '王小虎',
                          age: 25
                      }, {
                          date: '2016-05-03',
                          name: '王小虎',
                          age: 26
                      }],
                      currentPage: 1,
                      pageSize: 10,
                      total: this.tableData.length,
                      lastSelectedPage: null, // 用于存儲(chǔ)上一次選擇的頁(yè)碼
                      lastSelectedRows: [] // 用于存儲(chǔ)上一次選擇的數(shù)據(jù)行索引數(shù)組
                  };
              },
              methods: {
                  handleSelectionChange(val) {
                      const selectedRows=val; // 已選中的數(shù)據(jù)行索引數(shù)組
                      const lastSelectedRows=this.lastSelectedRows; // 上一次選擇的數(shù)據(jù)行索引數(shù)組
                      const isSamePage=this.lastSelectedPage===this.$refs.multipleTable.currentPage; // 判斷是否在同一頁(yè)內(nèi)進(jìn)行多選操作(跨頁(yè)多選需要清空已選中的數(shù)據(jù))
                      const isMultiSelect=Array.isArray(selectedRows); // 判斷是否為多選操作(單選不需要判斷)
                      const isSameSelection=isMultiSelect && JSON.stringify(selectedRows)===JSON.stringify(lastSelectedRows); // 判斷是否選擇了相同的數(shù)據(jù)行(跨頁(yè)多選需要判斷是否選擇了相同的數(shù)據(jù)行)
                      const shouldClearSelection=isSamePage && isMultiSelect && isSameSelection; // 根據(jù)上述條件判斷是否需要清空已選中的數(shù)據(jù)(跨頁(yè)多選需要清空已選中的數(shù)據(jù))
                      const newLastSelectedRows=shouldClearSelection && lastSelectedRows || selectedRows; // 根據(jù)上述條件更新上一次選擇的數(shù)據(jù)行索引數(shù)組(跨頁(yè)多選需要更新上一次選擇的數(shù)據(jù)行索引數(shù)組)
                      const newLastSelectedPage=shouldClearSelection && this.lastSelectedPage || this.$refs.multipleTable.currentPage; // 根據(jù)上述條件更新上一次選擇的頁(yè)碼(跨頁(yè)多選需要更新上一次選擇的頁(yè)碼)
                      this.lastSelectedRows=newLastSelectedRows; // 更新已選中的數(shù)據(jù)行索引數(shù)組(跨頁(yè)多選需要更新已選中的數(shù)據(jù)行索引數(shù)組)
                      this.lastSelectedPage=newLastSelectedPage; // 更新上一次選擇的頁(yè)碼(跨頁(yè)多選需要更新上一次選擇的頁(yè)碼)
                  },
                  handleSizeChange(val) { // 每頁(yè)顯示條數(shù)改變時(shí)的處理函數(shù)(無(wú)實(shí)際作用)
                  },
                  handleCurrentChange(val) { // 每頁(yè)顯示條數(shù)改變時(shí)的處理函數(shù)(無(wú)實(shí)際作用)
                  }
              }
          };
          </script>
          ```

          主站蜘蛛池模板: 成人精品一区二区激情| 亚洲日本一区二区三区在线不卡| 国产萌白酱在线一区二区| 国产亚洲一区二区精品| 国产精品va无码一区二区| 亚洲AV无码一区二区二三区入口| 国产成人精品一区二三区熟女| 亚洲一区二区三区乱码A| 无码一区二区三区在线| 国产乱码一区二区三区四| 天堂资源中文最新版在线一区| 亚洲国模精品一区| 国产在线一区视频| 日韩精品一区二区三区在线观看 | 熟女大屁股白浆一区二区| 国产成人无码一区二区在线播放 | 一夲道无码人妻精品一区二区| 国产一区二区成人| 亚洲AV福利天堂一区二区三| 免费精品一区二区三区在线观看| 国产精品伦一区二区三级视频| 国产成人一区二区在线不卡| 亚洲av成人一区二区三区观看在线 | 丰满爆乳一区二区三区| 免费一区二区无码东京热| tom影院亚洲国产一区二区 | 色精品一区二区三区| 视频一区精品自拍| 亚洲av色香蕉一区二区三区蜜桃| 国产成人精品日本亚洲专一区| 中文乱码人妻系列一区二区| 女人和拘做受全程看视频日本综合a一区二区视频 | 国产精品一区二区毛卡片| 日本在线视频一区| 天天看高清无码一区二区三区| 精品国产高清自在线一区二区三区 | 天堂一区二区三区在线观看| 日韩一区二区三区精品| 日韩高清国产一区在线| 日韩精品一区二区三区中文精品 | 一区二区三区四区免费视频|