干旱预测方法总结及基于人工神经网络的干旱预测案例分析(MATLAB全代码)

news2025/1/10 12:06:30

本案例采用SPEI干旱指数,构建ANN和BP神经网络预测模型,并开展1~3个月预见期的干旱预测,对比分析干旱预测模型的适用性,为流域干旱预警和管理提供技术依据。

干旱预测

1 干旱预测方法

1.1 统计学干旱预测

根据历史降水或气温等时间序列建立预测对象与预测因子间统计关系的干旱预测,称之为统计学干旱预测。此类方法的本质是基于历史气象、水文资料的内在统计关系,建立预测对象与预测因子之间的函数关系以对未来干旱进行预测。

常用的统计学干旱预测方法有:

  • 回归分析
  • 时间序列分析
  • 灰色系统
  • 马尔科夫链
  • 神经网络
  • 支持向量机等

1.2 动力学干旱预测

第二类是基于全球或区域气候模式,经过偏差校正和降尺度处理后得到未来气候变化趋势,然后结合干旱指数对未来干旱状况进行预测。其中,在预测农业干旱和水文干旱时需要驱动水文模型,常用的模型有可变下渗容量模型(Variable Infiltration Capacity, VIC)、 SWAT(Soil and Water Assessment Tool)模型以及新安江模型等。这类干旱预测方法称之为动力学干旱预测

2 案例

2.1 基于人工神经网络的干旱预测

采用SPEI干旱指数,构建ANN和BP神经网络预测模型,并开展1~3个月预见期的干旱预测,对比分析干旱预测模型的适用性,为流域干旱预警和管理提供技术依据。技术路线如图1所示。
在这里插入图片描述

2.1.1 模型构建

在这里插入图片描述

2.1.2 不同时间尺度的SPEI

请添加图片描述

2.1.3 模型预测结果

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

2.1.4 MATLAB相关代码

SPEI计算代码:

clc
close all
clear
%% 导入降水和气温数据
yearStart =1960;
yearEnd = 2020;
N_day = datenum(2020,12,31)-datenum(1960,1,1)+1;
ii = datenum('01-Jan-1960');
jj = datenum('31-Dec-2020');

%% 计算潜在蒸散发PET 
% 方法1:Thornthwaite法
PET = GetPE_Thornthwaite( DataMonthMean{3,1} , DataMonthMean{2,1});

%% 计算1960-2020年各月SPEI指数
SPEI1= GetSPEI( P(:) , PET(:) , 1 );
SPEI3 = GetSPEI( P(:) , PET(:)  , 3 );
SPEI6 = GetSPEI( P(:) , PET(:)  , 6 );
SPEI12 = GetSPEI( P(:) , PET(:)  , 12 );

%% 绘制各尺度SPEI值
figure(2)
SPEI1Plot = SPEI1(end-720+1:end,1);
subplot(4,1,1)
hold on;box on;
n1=find(SPEI1Plot>=0); %找出大于或等于0的元素的序号
n2=find(SPEI1Plot<0);  %找出小于0的元素的序号
h(1) = bar(n1,SPEI1Plot(n1),1,'FaceColor',[0.2902 0.4392 0.5451],'EdgeColor',[0.2902 0.4392 0.5451],'FaceAlpha',0.8); % [0.2902 0.4392 0.5451] 'b'
h(2) = bar(n2,SPEI1Plot(n2),1,'FaceColor',[0.6471 0.1647 0.1647],'EdgeColor',[0.6471 0.1647 0.1647],'FaceAlpha',0.8); % [0.6471 0.1647 0.1647] 'r'
set(gca, 'XTick', [1:10*12:60*12],'XTickLabel',{'1961','1971','1981','1991','2001','2011'}) 
text( 'string',"(a) SPEI_1", 'Units','normalized','position',[0.02,0.75],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');   
set(gca,'FontSize',12,'Fontname', 'Times New Roman');

SPEI3Plot = SPEI3(end-720+1:end,1);
subplot(4,1,2)
hold on;box on;
n3=find(SPEI3Plot>=0); %找出大于或等于0的元素的序号
n4=find(SPEI3Plot<0);  %找出小于0的元素的序号
h(3) = bar(n3,SPEI3Plot(n3),1,'FaceColor',[0.2902 0.4392 0.5451],'EdgeColor',[0.2902 0.4392 0.5451],'FaceAlpha',0.8); % [0.2902 0.4392 0.5451] 'b'
h(4) = bar(n4,SPEI3Plot(n4),1,'FaceColor',[0.6471 0.1647 0.1647],'EdgeColor',[0.6471 0.1647 0.1647],'FaceAlpha',0.8); % [0.6471 0.1647 0.1647] 'r'
set(gca, 'XTick', [1:10*12:60*12],'XTickLabel',{'1961','1971','1981','1991','2001','2011'}) 
text( 'string',"(b) SPEI_3", 'Units','normalized','position',[0.02,0.75],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');   
set(gca,'FontSize',12,'Fontname', 'Times New Roman');

SPEI6Plot = SPEI6(end-720+1:end,1);
subplot(4,1,3)
hold on;box on;
n5=find(SPEI6Plot>=0); %找出大于或等于0的元素的序号
n6=find(SPEI6Plot<0);  %找出小于0的元素的序号
h(5) = bar(n5,SPEI6Plot(n5),1,'FaceColor',[0.2902 0.4392 0.5451],'EdgeColor',[0.2902 0.4392 0.5451],'FaceAlpha',0.8); % [0.2902 0.4392 0.5451] 'b'
h(6) = bar(n6,SPEI6Plot(n6),1,'FaceColor',[0.6471 0.1647 0.1647],'EdgeColor',[0.6471 0.1647 0.1647],'FaceAlpha',0.8); % [0.6471 0.1647 0.1647] 'r'
set(gca, 'XTick', [1:10*12:60*12],'XTickLabel',{'1961','1971','1981','1991','2001','2011'}) 
text( 'string',"(c) SPEI_6", 'Units','normalized','position',[0.02,0.75],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');   
set(gca,'FontSize',12,'Fontname', 'Times New Roman');

SPEI12Plot = SPEI12(end-720+1:end,1);
subplot(4,1,4)
hold on;box on;
n7=find(SPEI12Plot>=0); %找出大于或等于0的元素的序号
n8=find(SPEI12Plot<0);  %找出小于0的元素的序号
h(7) = bar(n7,SPEI12Plot(n7),1,'FaceColor',[0.2902 0.4392 0.5451],'EdgeColor',[0.2902 0.4392 0.5451],'FaceAlpha',0.8); % [0.2902 0.4392 0.5451] 'b'
h(8) = bar(n8,SPEI12Plot(n8),1,'FaceColor',[0.6471 0.1647 0.1647],'EdgeColor',[0.6471 0.1647 0.1647],'FaceAlpha',0.8); % [0.6471 0.1647 0.1647] 'r'
set(gca, 'XTick', [1:10*12:60*12],'XTickLabel',{'1961','1971','1981','1991','2001','2011'}) 
text( 'string',"(d) SPEI_1_2", 'Units','normalized','position',[0.02,0.75],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');   
set(gca,'FontSize',12,'Fontname', 'Times New Roman');

function ET = GetPE_Thornthwaite( T ,N)
% 形式二:《五种潜在蒸散发公式在汉江流域的应用》
%------------------------------------------------------
% T为月均温度
% u为每月天数
% I为热量指数
% N为月均日照时间
% k为经验系数
k = 16;
monthAmount_Common = [31 28 31 30 31 30 31 31 30 31 30 31 ];      % 平年
monthofYear = length(monthAmount_Common);

T = max(0,T);
% 输入序列为矩阵形式
if size(T)==size(N)
    Nmonth = size(T,1)*size(T,2);
    Nyear = size(T,1);
else
    error("月均温度序列长度同月均日照时间序列长度不相等!");
end

% 计算各年份热量指数I
I = zeros(Nyear,1);
a = zeros(Nyear,1);
ET = zeros(Nyear,monthofYear);
for iyear=1:Nyear
    I(iyear) = sum(0.09*T(iyear,:).^1.5) ;
    a(iyear) = 0.016*I(iyear) +0.5;
    for imonth=1:monthofYear
        ET(iyear,imonth) = k*(10*T(iyear,imonth)/I(iyear))^a(iyear)*monthAmount_Common(imonth)*N(iyear,imonth)/360;
    end
end

%{
% 输入序列为向量形式
if length(T)==length(N)
    if rem(T,12)==0
        Nmonth = length(T);
        Nyear = T/12;
    else
        error("温度序列T并未整年数据!");
    end
else
    error("月均温度序列长度同月均日照时间序列长度不相等!");
end
%}

end


% 函数2:GetSPEI用于计算各尺度SPEI值
%-----------------------------------------------------------------------------------
% (1) Computes accumulated precipitation-ET data for the specific time scale
% (2) Computes drought indicators (SPEI)
function SPEI = GetSPEI( P , PET , scale )
% SPEI(不考虑闰年)常采用Log-logistic概率分布函数拟合降水与蒸散的差值系列
% P     降水          precipitation
% PET 潜在蒸散发 potential evapotranspiration (mm/day)  
% 注:降水和蒸散发均为日尺度数据
%  scale (事件尺度): 1,3,6,12,48  月尺度

monthOfYear = 12;
if length(P)==length(PET)
else
    printf("降水和潜在蒸散发的数据长度不等!")
end

% 1) Computes accumulated precipitation-ET data for the specific time scale 计算水分亏缺量D
Data = P -PET;

A1=[];          % 初始化
for is=1:scale
    A1=[A1,Data(is:length(Data)-scale+is)];    % 按时间尺度列出数据
end
XS=sum(A1,2);        % 对A1的每行分别求和

Nlength = length(XS);
SPEI = zeros(Nlength,2);

for is=1:monthOfYear
    tind = is:monthOfYear:length(XS);
    Xn = XS(tind);                   % 对应序数
    Xnsort = sort(Xn);
    beta = GetBeta(Xnsort,length(Xnsort),0,0,0); 
    par=logLogisticFit(beta);
    Gam_xs = logLogisticCDF(Xn,par);
    
% 2) Computes drought indicators (SPEI) 计算SPEI
    SPEI(tind,2) =  norminv( real(Gam_xs) );
    % SPEI(tind,1) = real( norminv( real(Gam_xs)) );
    SPEI(tind,1) = real( Normalize( Gam_xs) );
end

end
% ============================ SPEI 调用函数开始 ============================ 
% 函数1:利用矩法计算三参数Log-logistic的参数
% -------------------------------------------------------------------------------
function beta = GetBeta(series,n,A,B,isBeta)
acum=zeros(3,1);
if A==0&&B==0
    for i=1:n
        acum(1) = acum(1) + series(i);
        if isBeta==0              % compute alpha PWMs
            acum(2) = acum(2) + series(i) * (n-i) / (n-1);
            acum(3) = acum(3) + (series(i) * (n-i) * (n-i-1) / (n-1) / (n-2));
        elseif isBeta==1        % compute beta PWMs
            acum(2) = acum(2) + series(i) * (i-1) / (n-1);
            acum(3) = acum(3) + (series(i) * (i-1) * (i-2) / (n-1) / (n-2));
        end
    end
elseif A==-0.35&&B==0                 %use plotting-position (biased) estimator
    for i=1:n
        F = (i+A) / (n+B);
        acum(1) = acum(1)+series(i);
        if isBeta==0            % compute alpha PWMs
            acum(2) = acum(2)+series(i)*(1-F);
            acum(3) = acum(3)+series(i)*(1-F)*(1-F);
        elseif isBeta==1     %  compute beta PWMs
            acum(2) = acum(2)+series(i)*(F);
            acum(3) = acum(3)+series(i)*(F)*(F);
        end
    end
else 
    for i=1:n
       %F = (i+A) / (n+B);
       acum(1) = acum(1)+series(i)*nchoosek(n-i,0)/nchoosek(n-1,0);
       acum(2) = acum(2)+series(i)*nchoosek(n-i,1)/nchoosek(n-1,1);
       acum(3) = acum(3)+series(i)*nchoosek(n-i,2)/nchoosek(n-1,2);
     end
end
beta(1) = acum(1) / n;
beta(2) = acum(2) / n;
beta(3) = acum(3) / n;
end

% 函数2:利用矩法计算三参数Log-logistic的参数
% -------------------------------------------------------------------------------
function logLogisticParams=logLogisticFit(beta)

% estimate gamma parameter 形状参数β
logLogisticParams(3) = (2*beta(2)-beta(1)) / (6*beta(2)-beta(1)-6*beta(3));

g1 = exp(gammaLn(1+1/logLogisticParams(3)));
g2 = exp(gammaLn(1-1/logLogisticParams(3)));

% estimate alpha parameter 尺度参数α
logLogisticParams(2) = (beta(1)-2*beta(2))*logLogisticParams(3) / (g1*g2);

% estimate beta parameter 源参数γ
logLogisticParams(1) = beta(1) - logLogisticParams(2)*g1*g2;
end

% 函数3:利用三参数Log-logistic的参数,计算累积概率分布CDF
% -------------------------------------------------------------------------------
function M=logLogisticCDF(value,params)
% logLogistic分布
    M=1./(1+(params(2)./(value-params(1))).^params(3));
end

% 函数4:求gammaΓ分布
% -------------------------------------------------------------------------------
function z=gammaLn(xx)
cof=[76.18009172947146,-86.50532032941677,24.01409824083091,-1.231739572450155,0.1208650973866179e-2,-0.5395179384953e-5];
y = xx;
x = xx;
tmp = x + 5.5;
tmp = tmp-(x+0.5) * log(tmp);
ser = 1.000000000190015;
for j=1:6
    y=y+1;
    ser=ser+cof(j)/y;
end
z=-tmp+log(2.5066282746310005*ser/x);
end

% 函数5:standardGaussianInvCDF通过变换,将累计概率密度CDF转化为标准正态分布
% -------------------------------------------------------------------------------
function resul = Normalize(prob)
% X 输入序列概率值
n = length(prob);      % 序列长度

% 常数
C= [2.515517,0.802853,0.010328];
d= [0,1.432788,0.189269,0.001308];

resul =zeros(n,1);
for in=1:n
    if prob(in)<=0.5
        W = sqrt(-2*log(prob(in)));
    else
        W =sqrt(-2*log(1-prob(in)));
    end
    WW = W*W;
    WWW = WW*W;
    resul(in) = W - (C(1) + C(2)*W + C(3)*WW) / (1 + d(2)*W + d(3)*WW + d(4)*WWW);

    if prob(in)<0.5
        resul(in) = -resul(in);
    end
end

end
% ============================ SPEI 调用参数结束 ============================ 

BP神经网络分析代码:

clc
close all
clear
%% 导入数据
% 原始数据
load('dataTrainOutput.mat')
load('dataTrainInput.mat')
load('dataTestOutput.mat')
load('dataTestInput.mat')

% 预见期 N
N = [1 2 3];
trainLength = length(dataTrainOutput{1,1});
testLength = length(dataTestOutput{1,1});

%% 利用BP神经网络进行预测
% 第一组 SPEI1 N=1
input_train = dataTrainInput{1,1}(:,1:10)';
output_train = dataTrainOutput{1,1}(:,1)';
input_test = dataTestInput{1,1}(:,1:10)';
output_test = dataTestOutput{1,1}(:,1)';
% 训练数据归一化
[inputn,inputps] = mapminmax(input_train);
[outputn,outputps] = mapminmax(output_train);
% 构建BP神经网络
net=newff(inputn,outputn,5);
% 网络参数配置
net.trainParam.epochs=1000;
net.trainParam.lr=0.05;
net.trainParam.goal=0.00004;
net.divideFcn = '';
% 训练
net=train(net,inputn,outputn);
% 预测数据归一化:各个维度的数据在-11之间,均值为0
inputn_test=mapminmax('apply',input_test,inputps);
% BP神经网络预测输出
an=sim(net,inputn_test);
% 输出结果反归一化
BPoutput1=mapminmax('reverse',an,outputps);

% 构建BP神经网络
net=newff(inputn,outputn,4);
% 网络参数配置
net.trainParam.epochs=500;
net.trainParam.lr=0.05;
net.trainParam.goal=0.00004;
net.divideFcn = '';
% 训练
net=train(net,inputn,outputn);
% 预测数据归一化:各个维度的数据在-11之间,均值为0
inputn_test=mapminmax('apply',input_test,inputps);
% BP神经网络预测输出
an=sim(net,inputn_test);
% 输出结果反归一化
BPoutput11=mapminmax('reverse',an,outputps);

% 结果整理
figure(1)
hold on;box on;
h(1) = plot(output_test,'-o','linewidth',1.5,'markersize',5,'color',[106 90 205]/255);
h(2) = plot(BPoutput11,'k-+','linewidth',1.5,'markersize',5);
h(3) = plot(BPoutput1,'r-*','linewidth',1.5,'markersize',2);
hl = legend(h([1 2 3]),"实际值","ANN","BP");
set(hl,'Box','off','Location','northeast','NumColumns',3);
xlabel("时间(年.月)")
ylabel("SPEI_1")
set(gca,'ylim',[-4 3 ]);  
set(gca, 'XTick', [ 6, 66, 126, 174],'XTickLabel',{'2006.6','2011.6','2016.6','2020.6'}) 
text( 'string',"(a) SPEI_1-N=1", 'Units','normalized','position',[0.02,0.95],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');   
%set(gca,'FontSize',12,'Fontname', 'Times New Roman');

% 计算相应指标
R2(1,1) = GetR2(output_test,BPoutput11);
R2(1,2) = GetR2(output_test,BPoutput1);
RMSE(1,1) =GetRMSE(output_test,BPoutput11);
RMSE(1,2) =GetRMSE(output_test,BPoutput1);
 
figure(2)
hold on;box on;
plot(output_test,BPoutput11,'r*','markersize',5);
plot([-3 3],[-3 3],'k-','linewidth',1)
axis([-3 3 -3 3]);
xlabel("实际值")
ylabel("预测值")
text( 'string',"(a) SPEI_1-N=1", 'Units','normalized','position',[0.02,0.95],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');   

figure(3)
hold on;box on;
plot(output_test,BPoutput1,'k+','markersize',5);
plot([-3 3],[-3 3],'k-','linewidth',1)
axis([-3 3 -3 3]);
xlabel("实际值")
ylabel("预测值")
text( 'string',"(a) SPEI_1-N=1", 'Units','normalized','position',[0.02,0.95],  'FontSize',14,'FontWeight','Bold','FontName','Times New Roman');   

%% 调用函数
% 计算决定系数R2
function Result = GetR2(X,Y)

if length(X)==length(Y)
    n = length(X);
else
    error("输入X和Y序列不等!")
end
S1 = ( n*sum( X.*Y)-sum(X)*sum(Y))^2;
S2 = (n-1)*sum(X.^2);
S3 = (n-1)*sum(Y.^2);
Result = S1/S2/S3;

end

% 计算均方根误差RSME
function Result = GetRMSE(X,Y)

if length(X)==length(Y)
    n = length(X);
else
    error("输入X和Y序列不等!")
end
Result = sqrt( sum( (X-Y).^2 )/n);

end

参考

1.博士论文-D2022-气候变化下长江流域未来径流与旱涝变化特征研究-岳艳琳

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

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

相关文章

【python】用plotly绘制正二十面体

文章目录顶点棱实现正二十面体plotly 的 Python 软件包是一个开源的代码库&#xff0c;它基于 plot.js&#xff0c;而后者基于 d3.js。我们实际使用的则是一个对 plotly 进行封装的库&#xff0c;名叫 cufflinks&#xff0c;能让你更方便地使用 plotly 和 Pandas 数据表协同工作…

设备树(配合LED驱动说明)

目录 一、起源 二、基本组成 三、基本语法 四、特殊节点 4.1 根节点 4.2 /memory 4.3 /chosen 4.4 /cpus 多核CPU支持 五、常用属性 5.1 phandle 5.2 地址 --------------- 重要 5.3 compatible --------------- 重要 5.4 中断 --------------- 重要 5.5 …

python攻陷米哈游《元神》数据?详情请看文章。。

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 《原神》是由米哈游自研的一款全新开放世界冒险RPG。 里面拥有许多丰富得角色&#xff0c;让玩家为之着迷~ 今天&#xff0c;我们就来用python探索一下原神游戏角色信息&#xff01; 标题大家看看就好了哈~&#xff08…

DNS,DNS污染劫持,DNS加密

1. DNS&#xff08;Domain Name System&#xff09;DNS&#xff08;Domain Name System&#xff09;&#xff0c; 也叫网域名称系统&#xff0c;是互联网的一项服务。它实质上是一个 域名 和 IP 相互映射的分布式数据库.DNS&#xff08;Domain Name Server&#xff0c;域名服务…

医疗保健和智慧城市服务将引领5G物联网采用

Juniper Research预测&#xff0c;到2026年&#xff0c;全球5G物联网连接将达到1.16亿&#xff0c;而2023年仅为1700万。该公司预测&#xff0c;医疗保健部门和智慧城市服务将在未来三年推动这1100%的增长&#xff0c;到2026年占5G物联网设备的60%以上。5G物联网技术的超低延迟…

配置Flutter开发环境

一、在Windows上搭建Flutter开发环境 1、去flutter官网下载其最新可用的安装包&#xff0c;下载地址&#xff1a;https://flutter.dev/docs/development/tools/sdk/releases 。 注意&#xff0c;Flutter的渠道版本一直在不断的更新&#xff0c;请以Flutter官网为准。 另外&…

自动化测试框架对比

Robot Framework&#xff08;RF&#xff09; 链接&#xff1a;http://robotframework.org/ Robot Framework&#xff08;RF&#xff09;是用于验收测试和验收测试驱动开发&#xff08;ATDD&#xff09;的自动化测试框架。 基于 Python 编写&#xff0c;但也可以在 Jython&…

Android 基础知识4-3.1 TextView(文本框)详解

一、前言 TextView就是一个显示文本标签的控件&#xff0c;就是用来显示文本。可以在代码或者 XML中设置字体&#xff0c;字体大小&#xff0c;字体颜色 &#xff0c;字体样式 &#xff08;加粗级斜体&#xff09;&#xff0c;文字截断&#xff08;比如&#xff1a;只显示10个字…

【Python数据挖掘入门】一、数据挖掘概况

一、数据挖掘概况 数据挖掘是指从大量的数据中&#xff0c;通过统计学、人工智能、机器学习等方法&#xff0c;挖掘出未知的、具有价值的信息和知识的过程。 典型案例&#xff1a; 啤酒与尿布杜蕾斯与口香糖杜蕾斯与红酒 数据挖掘是一门交叉学科&#xff0c;覆盖了统计学、数…

正则表达式常见语法_findall方法、r原串的使用

正则表达式常见语法 re.findall&#xff08;&#xff09;方法 findall&#xff08;&#xff09;方法中flag参数的作用 运行结果为 运行结果是空列表&#xff0c; 以上说明&#xff0c;正则表到时中的“点号”不能和换行符匹配。 如果匹配模式设置为re.DOTALL或者re.S&#xff…

类与对象(this 关键字、构造器)

目录一、面向对象二、类与对象三、对象内存图四、成员变量和局部变量区别五、this关键字六、构造器/构造方法一、面向对象 一种编程思想:也就是说我们要以何种思路&#xff0c;解决问题&#xff0c;以何种形式组织代码 当解决一个问题的时候&#xff0c;面向对象会把事物抽象成…

23年六级缓考

【【六级674】3月六级规划+许愿成功的小伙伴记得来还愿啦!!(四六级延期考2周冲刺计划)】https://www.bilibili.com/video/BV1nx4y1w7fz?vd_source=5475f4f6010a81c8e6d4789af8e1a20f 作文

「TCG 规范解读」初识 TPM 2.0 库续一

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

前端预防XSS攻击全攻略

如何防止XSS攻击 一、是撒子 XSS攻击&#xff08;跨站点脚本攻击&#xff09;&#xff0c;就是黑客恶意篡改你网页的前端代码&#xff0c;在里面注入一些恶意的 htmljavascript的脚本&#xff0c;并在你的浏览器内运行&#xff0c;获取你的信息&#xff0c;或者进行一些恶意操…

3年自动化测试经验,面试连20K都拿不到,现在都这么卷了吗····

我的情况 大概介绍一下个人情况&#xff0c;女&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;会自动化&#xff0c;然而到今天都没有收到一份offer&#xff01;从2022年11月1…

Html 代码学习

场景:在页面中插入音频 代码 常见属性: src 音频的路径 controls 显示播放的控件 autoplay 自动播放 loop 循环播放 场景:在页面中插入视频 代码 常见属性: src 路径 controls 显示播放的控件 autoplay 自动播放 要配合muted 例如 autoplay muted loop 循环播放 链接 /…

MySQL 的体系结构、引擎与索引

MySQL的引擎与体系结构 体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层 第二层架构主要完成大多数的核心服务功能&#xff0c;如SQL…

合宙Air780E|FTP|内网穿透|命令测试|LuatOS-SOC接口|官方demo|学习(18):FTP命令及应用

1、FTP服务器准备 本机为win11系统&#xff0c;利用IIS搭建FTP服务器。 搭建方式可参考博文&#xff1a;windows系统搭建FTP服务器教程 windows系统搭建FTP服务器教程_程序员路遥的博客-CSDN博客_windows服务器安装ftp 设置完成后&#xff0c;测试FTP&#xff08;已正常访问…

Nginx配置代理解决本地html进行ajax请求接口跨域问题

场景 Nginx在Windows下载安装启动与配置前后端请求代理&#xff1a; Nginx在Windows下载安装启动与配置前后端请求代理_霸道流氓气质的博客-CSDN博客 上面基于Vue的web项目进行代理请求后台接口。 如果是进行异地接口联调&#xff0c;访问后台接口都需要通过vpn访问&#x…

【Maven】(二)使用 Maven 创建并运行项目、聊聊 POM 中的坐标与版本号的规则

文章目录1.前言2.hello-world2.1.Archetype 创建2.2.使用 IDE 创建2.3.Maven的目录结构3.pom的基本组成3.1.Maven坐标的概念与规则3.2.版本号规则2.3.打包成可运行的JAR4.结语1.前言 本系列文章记录了从0开始到实战系统了解 Maven 的过程&#xff0c;Maven 系列历史文章&#…