Qt天气预报系统获取天气数据

news2025/1/12 5:37:26

Qt天气预报系统获取天气数据

  • 1、获取天气数据
    • 1.1添加天气类头文件
    • 1.2定义今天和未来几天天气数据类
    • 1.3定义一个解析JSON数据的函数
    • 1.4在mainwindow中添加weatherData.h
    • 1.5创建今天天气数据和未来几天天气数据对象
    • 1.6添加parseJson定义
    • 1.7把解析JSON数据添加进去
    • 1.8添加错误
    • 1.9解析整个天气数据
  • 2、.h文件和.cpp文件
    • 2.1 mainwindow.h文件
    • 2.2weatherData.h文件
    • 2.3 .cpp文件

1、获取天气数据

1.1添加天气类头文件

鼠标放到项目上, 右键选择Add New...

在这里插入图片描述

选择C++,选择C++Header File

在这里插入图片描述

起名为weatherData

在这里插入图片描述

1.2定义今天和未来几天天气数据类

//今天的数据类
class Today{
public:
    Today()
    {
        city ="广州";     //城市
        date ="2025-1-10";  //日期

        
        weatherType ="多云";     //天气类型
        highTem = 30;           //最高温
        lowTem = 18;            //最低温

        ganMao ="感冒指数";      //感冒指数

        Temperature = 0;       //温度
        Humidity = "0%";       //湿度
        PM25 = 0;              //PM2.5
        windType ="南风";       //风的类型
        windPower ="2级";       //风力
        airQuality ="无数据";    //空气质量
    }

    QString city;
    QString date;

    int Temperature;
    QString weatherType;

    int highTem;
    int lowTem;

    QString ganMao;

    QString Humidity;
    int PM25;
    QString windType;
    QString windPower;
    QString airQuality;

};

//未来几天的数据类
class Day{
public:
    Day()
    {
        week ="周五";             //星期
        date ="2023-7-29";       //日期

        weatherType ="多云";      //天气类型

        airQuality = 0; //空气指数,优        //空气质量

        highTem = 0;              //最高温
        lowTem = 0;               //最低温

        windType ="南风";          //风的类型
        windPower ="2级";         //风力
    }

    QString week;
    QString date;

    QString weatherType;

    int airQuality;

    int highTem;
    int lowTem;

    QString windType;
    QString windPower;
};

1.3定义一个解析JSON数据的函数

void parseJson(QByteArray& byteArray);                  //解析JSON数据

1.4在mainwindow中添加weatherData.h

#include "weatherData.h"

1.5创建今天天气数据和未来几天天气数据对象

Today today;                                //定义一个今天天气数据对象
Day day[7];                                 //定义未来几天天气数据对象

1.6添加parseJson定义

在这里插入图片描述

1.7把解析JSON数据添加进去

void MainWindow::readHttpReply(QNetworkReply *reply)
{
    int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();   //状态码

    //请求错误
    if(reply->error() != QNetworkReply::NoError || status_code != 200)
    {
        qDebug() << reply->errorString().toLatin1().data();     //打印错误信息
        QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);      //弹出警告信息框
    }
    //请求成功
    else
    {
        QByteArray byteArray = reply->readAll();        //读取服务器数据
        qDebug() << "read all:"<< byteArray.data();     //打印接收到的数据
        parseJson(byteArray);                           //解析JSON数据
    }
    reply->deleteLater();       //释放对象
}

1.8添加错误

//解析JSON格式天气数据
void MainWindow::parseJson(QByteArray &byteArray)
{
    //错误
    QJsonParseError err;
}
鼠标放到QJsonParseError上, ALT+Enter选择添加头文件,后面的也类似,使用一个

新类的时候,记得添加头文件

在这里插入图片描述

1.9解析整个天气数据

//解析JSON格式天气数据
void MainWindow::parseJson(QByteArray &byteArray)
{
    //错误
    QJsonParseError err;        //创建一个错误对象
    QJsonDocument doc = QJsonDocument::fromJson(byteArray, &err);   //将JSON格式解析为QJsonDocument对象
    //如果错误
    if(err.error != QJsonParseError::NoError)
    {
        return;    //返回
    }
    
    QJsonObject rootObj = doc.object();     //创建一个QJsonObject对象返回文档
    //    qDebug() << rootObj.value("message").toString();
    
    //1.解析城市和日期
    today.city = rootObj.value("cityInfo").toObject().value("city").toString();     //城市
    today.date = rootObj.value("date").toString();                                  //日期
    
    //2.解析昨天yesterday数据
    QJsonObject objData = rootObj.value("data").toObject();         //获取data对象
    
    QJsonObject objYesterday = objData.value("yesterday").toObject();          //昨天
    day[0].week = objYesterday.value("week").toString();                       //星期
    day[0].date = objYesterday.value("date").toString();                       //日期
    
    day[0].weatherType = objYesterday.value("type").toString();                      //天气类型
    
    QString highT;          //最高温
    highT = objYesterday.value("high").toString().split(" ").at(1); //空格分割,取分割后第二个数据,1是第二个,0是第一个
    day[0].highTem = highT.left(highT.length() - 1).toInt(); //把℃减掉,只剩数字
    QString lowT;           //最低温
    lowT = objYesterday.value("low").toString().split(" ").at(1);
    day[0].lowTem = lowT.left(lowT.length() - 1).toInt();
    
    //风的类型,风力
    day[0].windType = objYesterday.value("fx").toString();      //风的类型   
    day[0].windPower = objYesterday.value("fl").toString();     //风力
    
    //空气指数
    day[0].airQuality =objYesterday.value("aqi").toDouble();    //空气质量
    
    //3.解析未来几天的天气数据
    QJsonArray forecastArray = objData.value("forecast").toArray();        //获取forecast数组
    //遍历未来几天天气数据
    for(int i=0 ; i<6 ; i++)
    {
        QJsonObject forecastObj = forecastArray[i].toObject();             //获取JSON对象
        
        day[i+1].week = forecastObj.value("week").toString();             //星期
        day[i+1].date = forecastObj.value("ymd").toString();              //日期
        day[i+1].weatherType = forecastObj.value("type").toString();      //天气类型
        //空气指数
        day[i+1].airQuality =forecastObj.value("aqi").toDouble();         //空气质量
        
        
        QString highT;      //最高温
        highT = forecastObj.value("high").toString().split(" ").at(1);      //空格分割,取分割后第二个数据,1是第二个,0是第一个
        day[i+1].highTem = highT.left(highT.length() - 1).toInt();          //把℃减掉,只剩数字
        QString lowS;       //最低温
        lowS = forecastObj.value("low").toString().split(" ").at(1);
        day[i+1].lowTem = lowS.left(lowS.length() - 1).toInt();
        
        //风的类型,风力
        day[i+1].windType = forecastObj.value("fx").toString();           //风的类型
        day[i+1].windPower = forecastObj.value("fl").toString();          //风力
        
        //4、解析今天的数据
        today.Temperature =objData.value("wendu").toInt();                 //温度
        
        today.ganMao =objData.value("ganmao").toString();                  //感冒指数
        
        today.Humidity = objData.value("shidu").toString();                //湿度
        today.PM25 = objData.value("pm25").toDouble();                        //PM2.5
        today.airQuality = objData.value("quality").toString();            //空气质量
        
        //forecast里面也有今天的数据
        today.weatherType = day[1].weatherType;                            //天气类型
        today.highTem = day[1].highTem;                                    //最高温
        today.lowTem = day[1].lowTem;                                      //最低温
        
        today.windType = day[1].windType;                                  //风的类型
        today.windPower = day[1].windPower;                                //风力
        
    }  
}

2、.h文件和.cpp文件

2.1 mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenu>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include "weatherData.h"


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void mousePressEvent(QMouseEvent *event) override;      //重写鼠标点击事件函数
    void mouseMoveEvent(QMouseEvent *event) override;       //重写鼠标移动事件函数

    void getWeatherInfo(QString citycode);                  //获取天气数据

    void parseJson(QByteArray& byteArray);                  //解析JSON数据

private slots:
    void on_pushButton_quit_clicked();          //关闭UI界面
    void onQuitActTriggered();                  //菜单被点击后的处理

public slots:
    void readHttpReply(QNetworkReply *reply);                       //新建一个网络请求获取的槽函数

private:
    Ui::MainWindow *ui;
    QMenu *quitMenu;                            //创建一个菜单指针
    QAction *quitAct;                           //定义一个动作
    QPoint moffset;                             //窗口移动时,鼠标与窗口左上角的偏移值

    QNetworkAccessManager *NetAccessManger;        //声明一个网络请求对象

    bool closePOPWindow();                      //关闭窗口的弹窗

    Today today;                                //定义一个今天天气数据对象
    Day day[7];                                 //定义未来几天天气数据对象
};
#endif // MAINWINDOW_H

2.2weatherData.h文件

#ifndef WEATHERDATA_H
#define WEATHERDATA_H
#include <QString>
//今天的数据类
class Today{
public:
    Today()
    {
        city ="广州";     //城市
        date ="2025-1-10";  //日期


        weatherType ="多云";     //天气类型
        highTem = 30;           //最高温
        lowTem = 18;            //最低温

        ganMao ="感冒指数";      //感冒指数

        Temperature = 0;       //温度
        Humidity = "0%";       //湿度
        PM25 = 0;              //PM2.5
        windType ="南风";       //风的类型
        windPower ="2级";       //风力
        airQuality ="无数据";    //空气质量
    }

    QString city;
    QString date;

    int Temperature;
    QString weatherType;

    int highTem;
    int lowTem;

    QString ganMao;

    QString Humidity;
    int PM25;
    QString windType;
    QString windPower;
    QString airQuality;

};

//未来几天的数据类
class Day{
public:
    Day()
    {
        week ="周五";             //星期
        date ="2023-7-29";       //日期

        weatherType ="多云";      //天气类型

        airQuality = 0; //空气指数,优        //空气质量

        highTem = 0;              //最高温
        lowTem = 0;               //最低温

        windType ="南风";          //风的类型
        windPower ="2级";         //风力
    }

    QString week;
    QString date;

    QString weatherType;

    int airQuality;

    int highTem;
    int lowTem;

    QString windType;
    QString windPower;
};
#endif // WEATHERDATA_H

2.3 .cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QMouseEvent>
#include "weatherData.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowFlag(Qt::FramelessWindowHint);
    //    this->setLayout(ui->gridLayoutGlobal);      //让界面随着窗口变幻大小

    quitMenu = new QMenu(this);         //创建一个QMenu对象
    quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this);     //定义一个退出动作
    quitMenu->addAction(quitAct);       //添加动作

    //    connect(quitMenu,&QMenu::triggered,this,[=]{
    //        this->close();
    //    });         //连接信号与槽

    connect(quitMenu,&QMenu::triggered,this,&MainWindow::onQuitActTriggered);   //连接菜单被触发的信号与槽

    NetAccessManger = new QNetworkAccessManager(this);          //实例化一个网络请求对象

    connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply);  //连接网络请求获取的信号与槽

    //101010100是北京的城市编码
    getWeatherInfo("101010100");

}

MainWindow::~MainWindow()
{
    delete ui;
}

//鼠标点击
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    //如果右键被按下
    if(event->button() == Qt::RightButton)
    {
        quitMenu->exec(QCursor::pos());       //在当前鼠标位置显示菜单
    }

    //当前鼠标位置 event->globalPos()
    //当前窗口位置 this->pos()
    if(event->button() == Qt::LeftButton)
    {
        moffset = event->globalPos() - this->pos();
    }
}

//鼠标移动
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - moffset);    //移动窗口
}


//弹窗
bool MainWindow::closePOPWindow()
{
    // 创建一个消息框询问用户是否真的要退出
    QMessageBox mes;
    mes.setWindowTitle("关闭窗口");
    //  mes.setWindowFlags(Qt::Drawer);       //把标题栏去掉
    mes.setIcon(QMessageBox::Warning);    //设置一个警告图片
    mes.setText("是否关闭窗口?");          //弹窗文本

    mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);     //设置两个按钮
    mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标
    mes.setButtonText(QMessageBox::Ok, tr("确定"));               //ok改为确认
    mes.setButtonText(QMessageBox::Cancel, tr("取消"));           //Cancel改为取消

    // 显示消息框并等待用户交互
    int result = mes.exec();

    // 根据用户的选择执行相应的操作
    if (result == QMessageBox::Ok) {
        // 用户选择了确定,关闭主窗口
        this->close();
        return true;
    }
    // 用户选择了取消,不关闭主窗口
    else
    {
        return false;     // 窗口关闭操作失败
    }
}

//右上角退出
void MainWindow::on_pushButton_quit_clicked()
{
    closePOPWindow();
}

//鼠标右键退出
void MainWindow::onQuitActTriggered()
{
    closePOPWindow();
}


//获取天气数据
void MainWindow::getWeatherInfo(QString citycode)
{
    QUrl url("http://t.weather.itboy.net/api/weather/city/" + citycode);     //天气数据接口和城市编码
    NetAccessManger->get(QNetworkRequest(url));                    //发送GET请求,获取数据

}

//解析JSON格式天气数据
void MainWindow::parseJson(QByteArray &byteArray)
{
    //错误
    QJsonParseError err;        //创建一个错误对象
    QJsonDocument doc = QJsonDocument::fromJson(byteArray, &err);   //将JSON格式解析为QJsonDocument对象
    //如果错误
    if(err.error != QJsonParseError::NoError)
    {
        return;    //返回
    }

    QJsonObject rootObj = doc.object();     //创建一个QJsonObject对象返回文档
    //    qDebug() << rootObj.value("message").toString();

    //1.解析城市和日期
    today.city = rootObj.value("cityInfo").toObject().value("city").toString();     //城市
    today.date = rootObj.value("date").toString();                                  //日期

    //2.解析昨天yesterday数据
    QJsonObject objData = rootObj.value("data").toObject();         //获取data对象

    QJsonObject objYesterday = objData.value("yesterday").toObject();          //昨天
    day[0].week = objYesterday.value("week").toString();                       //星期
    day[0].date = objYesterday.value("date").toString();                       //日期

    day[0].weatherType = objYesterday.value("type").toString();                      //天气类型

    QString highT;          //最高温
    highT = objYesterday.value("high").toString().split(" ").at(1); //空格分割,取分割后第二个数据,1是第二个,0是第一个
    day[0].highTem = highT.left(highT.length() - 1).toInt(); //把℃减掉,只剩数字
    QString lowT;           //最低温
    lowT = objYesterday.value("low").toString().split(" ").at(1);
    day[0].lowTem = lowT.left(lowT.length() - 1).toInt();

    //风的类型,风力
    day[0].windType = objYesterday.value("fx").toString();      //风的类型
    day[0].windPower = objYesterday.value("fl").toString();     //风力

    //空气指数
    day[0].airQuality =objYesterday.value("aqi").toDouble();    //空气质量

    //3.解析未来几天的天气数据
    QJsonArray forecastArray = objData.value("forecast").toArray();        //获取forecast数组
    //遍历未来几天天气数据
    for(int i=0 ; i<6 ; i++)
    {
        QJsonObject forecastObj = forecastArray[i].toObject();             //获取JSON对象

        day[i+1].week = forecastObj.value("week").toString();             //星期
        day[i+1].date = forecastObj.value("ymd").toString();              //日期
        day[i+1].weatherType = forecastObj.value("type").toString();      //天气类型
        //空气指数
        day[i+1].airQuality =forecastObj.value("aqi").toDouble();         //空气质量


        QString highT;      //最高温
        highT = forecastObj.value("high").toString().split(" ").at(1);      //空格分割,取分割后第二个数据,1是第二个,0是第一个
        day[i+1].highTem = highT.left(highT.length() - 1).toInt();          //把℃减掉,只剩数字
        QString lowS;       //最低温
        lowS = forecastObj.value("low").toString().split(" ").at(1);
        day[i+1].lowTem = lowS.left(lowS.length() - 1).toInt();

        //风的类型,风力
        day[i+1].windType = forecastObj.value("fx").toString();           //风的类型
        day[i+1].windPower = forecastObj.value("fl").toString();          //风力

        //4、解析今天的数据
        today.Temperature =objData.value("wendu").toInt();                 //温度

        today.ganMao =objData.value("ganmao").toString();                  //感冒指数

        today.Humidity = objData.value("shidu").toString();                //湿度
        today.PM25 = objData.value("pm25").toDouble();                        //PM2.5
        today.airQuality = objData.value("quality").toString();            //空气质量

        //forecast里面也有今天的数据
        today.weatherType = day[1].weatherType;                            //天气类型
        today.highTem = day[1].highTem;                                    //最高温
        today.lowTem = day[1].lowTem;                                      //最低温

        today.windType = day[1].windType;                                  //风的类型
        today.windPower = day[1].windPower;                                //风力

    }
}

//网络请求获取
void MainWindow::readHttpReply(QNetworkReply *reply)
{
    int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();   //状态码

    //请求错误
    if(reply->error() != QNetworkReply::NoError || status_code != 200)
    {
        qDebug() << reply->errorString().toLatin1().data();     //打印错误信息
        QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);      //弹出警告信息框
    }
    //请求成功
    else
    {
        QByteArray byteArray = reply->readAll();        //读取服务器数据
        qDebug() << "read all:"<< byteArray.data();     //打印接收到的数据
        parseJson(byteArray);                           //解析JSON数据
    }
    reply->deleteLater();       //释放对象
}

获取天气数据完成!

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

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

相关文章

SQL SERVER 2016 创建用户。

一、在实例中创建用户 二、在数据库中创建用户分配表格权限. 三、也可以在表格属性中分配用户权限 四、搜索对象中可以选择表、视图等等内容.

汽车信息安全 -- S32K1如何更新BOOT_MAC

目录 1.安全启动模式回顾 2.为什么要讨论BOOT_MAC 3.S32K1如何更新? 1.安全启动模式回顾 之前提到过,S32K1系列提供了Crypto Service Engine硬件加密模块(简称CSEc),大家可以通过该芯片系统寄存器SDID.FEATURES(System Device Identification Register)来判断自己的片子…

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构&#xff0c;然后再介绍世面上常见的产品 我们在大型的复杂的系统下&#xff0c;会有大量的跑批&#xff0c;定时任务的功能&#xff0c;如果在独立的子项目中单独去处理这些任务&#xff0c;随着业务的复杂度的提高…

智慧城市应急指挥中心系统平台建设方案

建设背景与目标 智慧城市应急指挥中心系统平台的建设&#xff0c;源于对城市管理精细化、智能化的迫切需求。平台旨在通过整合各方资源&#xff0c;实现应急事件的快速响应与高效处置&#xff0c;提升城市安全管理水平。 前端设计与信息采集 前端设计注重立体化、全方位信息…

Playwright实战:Locators(定位器)指南

Locators Locators是Playwright自动等待和重试能力的核心部分。简而言之&#xff0c;Locators代表了一种随时在页面上查找元素的方法。 快速指南 这些是推荐的内置定位器。 page.getbyrole()通过显式和隐式可访问性属性进行定位。page.get_by_text()用于按文本内容定位。pa…

HTTP 核心概念

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

centos7.6 安装nginx 1.21.3与配置ssl

1 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2 下载Nginx wget http://nginx.org/download/nginx-1.21.3.tar.gz3 安装目录 mkdir -p /data/apps/nginx4 安装 4.1 创建用户 创建用户nginx使用的nginx用户。 #添加www组 # groupa…

Homestyler 和 Tripo AI 如何利用人工智能驱动的 3D 建模改变定制室内设计

让设计梦想照进现实 在Homestyler,我们致力于为每一个梦想设计师提供灵感的源泉,而非挫折。无论是初学者打造第一套公寓,或是专业设计师展示作品集,我们的直观工具都能让您轻松以惊人的3D形式呈现空间。 挑战:实现定制设计的新纪元 我们知道,将个人物品如传家宝椅子、…

深度学习知识点:LSTM

文章目录 1.应用现状2.发展历史3.基本结构4.LSTM和RNN的差异 1.应用现状 长短期记忆神经网络&#xff08;LSTM&#xff09;是一种特殊的循环神经网络(RNN)。原始的RNN在训练中&#xff0c;随着训练时间的加长以及网络层数的增多&#xff0c;很容易出现梯度爆炸或者梯度消失的问…

ASP.NET Core 中服务生命周期详解:Scoped、Transient 和 Singleton 的业务场景分析

前言 在 ASP.NET Core 中&#xff0c;服务的生命周期直接影响应用的性能和行为。通过依赖注入容器 (Dependency Injection, DI)&#xff0c;我们可以为服务定义其生命周期&#xff1a;Scoped、Transient 和 Singleton。本文将详细阐述这些生命周期的区别及其在实际业务中的应用…

kubeneters-循序渐进Cilium网络(二)

文章目录 概要IP 地址配置接口配置解析结论 概要 接续前一章节&#xff0c;我们还是以这张图继续深入Cilium网络世界 IP 地址配置 通过检查 Kubernetes 集群的当前环境&#xff0c;可以获取实际的 IP 地址和配置信息。这些信息将被补充到之前的网络示意图中&#xff0c;以使…

树莓派设备树编译

上回书讲到&#xff1a; 树莓派 OS 安装 树莓派内核 kernel 编译 今天我们介绍下树莓派设备树如何添加、编译和使用。 设备树初识 设备树&#xff08;Device Tree, DT&#xff09;是 Linux 内核用来描述硬件的一种数据结构。它以一种结构化的方式定义了硬件的配置和属性&a…

微信小程序map组件所有markers展示在视野范围内

注意&#xff1a;使用include-points属性不生效&#xff0c;要通过createMapContext实现 <template><view class"map-box"><map id"map" class"map" :markers"markers" :enable-traffic"true" :enable-poi&…

省市区三级联动(后端)

前提&#xff1a;springboot、mybatis-plus、swagger 数据库&#xff1a; 文章顶部 实体类&#xff1a; City package com.itfly.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.time.Loca…

【Axure高保真原型】环形进度条(开始暂停效果)

今天和大家分享环形进度条&#xff08;开始暂停效果&#xff09;的原型模版&#xff0c;效果包括&#xff1a; 点击开始按钮&#xff0c;可以环形进度条开始读取&#xff0c;中部百分比显示环形的读取进度&#xff1b; 在读取过程中&#xff0c;点击暂停按钮&#xff0c;可以随…

CTFshow—文件包含

Web78-81 Web78 这题是最基础的文件包含&#xff0c;直接?fileflag.php是不行的&#xff0c;不知道为啥&#xff0c;直接用下面我们之前在命令执行讲过的payload即可。 ?filephp://filter/readconvert.base64-encode/resourceflag.php Web79 这题是过滤了php&#xff0c;…

Jenkins pipeline 发送邮件及包含附件

Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN &#xff08;保存TOKEN, 后面Jenkins会用到&#xff09; Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …

【微服务】8、分布式事务 ( XA 和 AT )

文章目录 利用Seata解决分布式事务问题&#xff08;XA模式&#xff09;AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…

Java解析Excel表格

Java解析Excel表格 <!-- Excel 表格解析 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version></dependency>简单使用 // 创建一个读取监听器 ReadListener<E…

Bytebase 3.1.2 - 在 SQL 编辑器中为表、列和 PG 的视图注释显示鼠标悬浮提示

&#x1f680; 新功能 在 SQL 编辑器中为表、列和 PostgreSQL 的视图注释显示鼠标悬浮提示。 IM, Webhook 集成支持 Lark。展示 Redshift 表或视图的定义。 &#x1f514; API 重大变更 弃用脱敏策略 API /v1/{instance}/{database}/policies/masking&#xff0c;改为调用 /v…