7.8 QMap

Qt 中,如果你想要将 JSON 数据解析到一个 QMap 中,你可以遍历 JSON 对象的所有键值对,并将它们添加到 QMap 里。这个方法特别适合于当你的 JSON 对象是一个简单的键值对集合时。以下是一个如何实现这一点的示例。
示例:将 JSON 数据解析到 QMap
假设你有以下 JSON 数据:
json
{
        "name" : "John Doe" ,
        "age" : "30" ,
        "email" : "john.doe@example.com"
}
以下是如何将这些数据解析到 QMap<QString, QString> 中的步骤:
#include <QJsonDocument>
#include <QJsonObject>
#include <QMap>
#include <QDebug>
void parseJsonToMap() {
// JSON字符串
QString jsonString = R"(
{
        "name": "John Doe",
        "age": "30",
        "email": "john.doe@example.com"
}
)";
// 将JSON字符串转换为QJsonDocument
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
// 准备一个QMap来存储解析的数据
QMap<QString, QString> dataMap;
// 解析JSON对象并填充QMap
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
        QJsonObject jsonObj = jsonDoc.object();
        for (auto key : jsonObj.keys()) {
                dataMap[key] = jsonObj.value(key).toString();
        }
} else {
        qDebug() << "Invalid JSON...";
}
// 打印QMap内容
for (auto key : dataMap.keys()) {
        qDebug() << key << ":" << dataMap[key];
        }
}
int main() {
        parseJsonToMap();
        return 0;
}
1. JSON 字符串创建 QJsonDocument :使用 QJsonDocument::fromJson 来解析 JSON 字符串。
2. 创建 QMap :定义一个 QMap<QString, QString> 来存储键值对。
3. 遍历 JSON 对象 :使用 keys() 方法获取所有键,然后遍历这些键,将对应的值添加到 QMap 中。
4. 打印 QMap 内容 :遍历 QMap 并打印键值对。
这个示例展示了如何将 JSON 对象的键值对解析到 QMap 中。这种方法适用于键值对类型的简单 JSON 对象。对于更复杂的JSON 结构,可能需要更详细的解析逻辑
#include "widget.h"
#include "ui_widget.h"
 
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QMessageBox>
#include <QJsonDocument>
#include <QByteArray>
#include <QFile>
#include <QJsonObject>
#include <QJsonArray>
#include <QPainter>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    //窗体无状态栏
    //setWindowFlag(Qt::FramelessWindowHint);
 
    //界面跟随
    this->setLayout(ui->verticalLayout);
 
    //QMenu菜单组件
    menuQuit = new QMenu(this);
    //设置菜单项文字颜色
    menuQuit->setStyleSheet("QMenu::item{color : red}");
    //用户点击菜单项并点击后回调函数,推出程序
    connect(menuQuit,&QMenu::triggered,[=](){
        this->close();
    });
 
    //由QNetworkAccessManager发起get请求
    mannager = new  QNetworkAccessManager(this);
    //QNetworkReply * get(const QNetworkRequest &request)  QNetworkRequest(const QUrl &url = QUrl())
    //strurl = "http://gfeljm.tianqiapi.com/api?unescape=1&version=v63&appid=76269866&appsecret=VRtxb7NZ";
    strurl = "http://gfeljm.tianqiapi.com/api?unescape=1&version=v9&appid=76269866&appsecret=VRtxb7NZ";
    QUrl urlNetId(strurl);
    //指定请求url地址
    QNetworkRequest request(urlNetId);
    reply = mannager->get(request);
    //QNetworkRequest网络请求后进行数据读取
    connect(mannager,&QNetworkAccessManager::finished,this,&Widget::readHTTPSerial);
 
    mWeekList << ui->label_day0 << ui->label_day1
              << ui->label_day2 << ui->label_day3
              << ui->label_day4 << ui->label_day5;
 
    mDateList << ui->label_date0 << ui->label_date1
              << ui->label_date2 << ui->label_date3
              << ui->label_date4 << ui->label_date5;
 
    mIconList <<ui->label_weaIcon0 <<ui->label_weaIcon1
             <<ui->label_weaIcon2 <<ui->label_weaIcon3
            <<ui->label_weaIcon4 <<ui->label_weaIcon5;
 
    mWeaTypeList << ui->label_weaType0 << ui->label_weaType1
                 << ui->label_weaType2 << ui->label_weaType3
                 << ui->label_weaType4 << ui->label_weaType5;
 
    mAirqList << ui->label_Airq0 << ui->label_Airq1
              << ui->label_Airq2 << ui->label_Airq3
              << ui->label_Airq4 << ui->label_Airq5;
 
    mFxList << ui->label_Fx0 << ui->label_Fx1
            << ui->label_Fx2 << ui->label_Fx3
            << ui->label_Fx4 << ui->label_Fx5;
 
    mFlList << ui->label_Fl0 << ui->label_Fl1
            << ui->label_Fl2 << ui->label_Fl3
            << ui->label_Fl4 << ui->label_Fl5;
 
    //根据天气,设置icon的路径
    mTypeMap.insert("暴雪",":/res/type/BaoXue.png");
    mTypeMap.insert("暴雨",":/res/type/BaoYu. png");
    mTypeMap.insert("暴雨到大暴雨",":/res/type/BaoYuDaoDaBaoYu.png");
    mTypeMap.insert("大暴雨",":/res/type/DaBaoYu.png");
    mTypeMap.insert("大暴雨到特大暴雨",":/res/type/DaBaoYuDaoTeDaBaoYu.png");
    mTypeMap.insert("大到暴雪",":/res/type/DaDaoBaoXue.png");
    mTypeMap.insert("大雪",":/res/type/DaXue.png");
    mTypeMap.insert("大雨",":/res/type/DaYu.png");
    mTypeMap.insert("冻雨",":/res/type/DongYu.png");
    mTypeMap.insert("多云",":/res/type/DuoYun.png");
    mTypeMap.insert("浮沉",":/res/type/FuChen.png");
    mTypeMap.insert("雷阵雨",":/res/type/LeiZhenYu.png");
    mTypeMap.insert("雷阵雨伴有冰雹",":/res/type/LeiZhenYuBanYouBingBao.png");
    mTypeMap.insert("霾",":/res/type/Mai.png");
    mTypeMap.insert("强沙尘暴",":/res/type/QiangShaChenBao.png");
    mTypeMap.insert("晴",":/res/type/Qing.png");
    mTypeMap.insert("沙尘暴",":/res/type/ShaChenBao.png");
    mTypeMap.insert("特大暴雨",":/res/type/TeDaBaoYu.png");
    mTypeMap.insert("undefined",":/res/type/undefined.png");
    mTypeMap.insert("雾",":/res/type/Wu.png");
    mTypeMap.insert("小到中雪",":/res/type/XiaoDaoZhongXue.png");
    mTypeMap.insert("小到中雨",":/res/type/XiaoDaoZhongYu.png");
    mTypeMap.insert("小雪",":/res/type/XiaoXue.png");
    mTypeMap.insert("小雨",":/res/type/XiaoYu.png");
    mTypeMap.insert("雪",":/res/type/Xue.png");
    mTypeMap.insert("扬沙",":/res/type/YangSha.png");
    mTypeMap.insert("阴",":/res/type/Yin.png");
    mTypeMap.insert("雨",":/res/type/Yu.png");
    mTypeMap.insert("雨夹雪",":/res/type/YuJiaXue.png");
    mTypeMap.insert("阵雪",":/res/type/ZhenXue.png");
    mTypeMap.insert("阵雨",":/res/type/ZhenYu.png");
    mTypeMap.insert("中到大雪",":/res/type/ZhongDaoDaXue.png");
    mTypeMap.insert("中到大雨",":/res/type/ZhongDaoDaYu.png");
    mTypeMap.insert("中雪",":/res/type/ZhongXue.png");
    mTypeMap.insert("中雨",":/res/type/ZhongYu.png");
 
    ui->widget_07->installEventFilter(this);
    ui->widget_08->installEventFilter(this);
}
 
Widget::~Widget()
{
    delete ui;
}
 
/* 解析当天天气的Json文件 */
//void Widget::PaserWeatherFromJson(QByteArray rawData)
//{
//    //获取天气,QByteArray转为QJsonDocument
//    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
//    //文本不为空且是键值表,QJsonDocument转为QJsonObject
//    if(!jsonDoc.isNull() && jsonDoc.isObject()){
//        QJsonObject jsonObj = jsonDoc.object();
//        //日期
//        ui->label_date0102->setText(jsonObj["date"].toString() +
//                "  " + jsonObj["week"].toString());
//        //城市
//        ui->label_city02->setText(jsonObj["city"].toString());
//        //温度
//        ui->label_temp02->setText(jsonObj["tem"].toString() + "℃");
//        //天气
//        ui->label_weather02->setText(jsonObj["wea"].toString());
//        //天气图标
//        ui->label_icon02->setPixmap(mTypeMap[jsonObj["wea"].toString()]);
//        //温度范围
//        ui->label_weatherdata02->setText(jsonObj["tem2"].toString() +
//                "~" + jsonObj["tem1"].toString() + "℃");
//        //感冒指数
//        ui->label_text0301->setText(jsonObj["air_tips"].toString());
//        //风向
//        ui->label_FX->setText(jsonObj["win"].toString());
//        //风速
//        ui->label_FXdata->setText(jsonObj["win_speed"].toString());
//        //湿度
//        ui->label_SDdata->setText(jsonObj["humidity"].toString());
//        //PM值
//        ui->label_PMdata->setText(jsonObj["air_pm25"].toString());
//        //空气质量
//        ui->label_airQdata->setText(jsonObj["air_level"].toString());
//    }
//}
 
/* 解析7天天气的Json文件 */
void Widget::PaserWeatherFromJsonNew(QByteArray rawData)
{
    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
    if(!jsonDoc.isNull() && jsonDoc.isObject()){
        QJsonObject jsonRoot = jsonDoc.object();
        days[0].mCity = jsonRoot["city"].toString();
        days[0].mPM25 = jsonRoot["aqi"].toObject()["pm25"].toString();
        qDebug() << days[0].mPM25;
 
        if(jsonRoot.contains("data") && jsonRoot["data"].isArray()){
            QJsonArray dataArray = jsonRoot["data"].toArray();
            for (int i = 0; i < dataArray.size(); i++) {
                QJsonObject jsonObj = dataArray[i].toObject();
                days[i].mDate = jsonObj["date"].toString();
                days[i].mWeek = jsonObj["week"].toString();
                days[i].mTem = jsonObj["tem"].toString();
                days[i].mWea = jsonObj["wea"].toString();
                days[i].mTemLow = jsonObj["tem2"].toString();
                days[i].mTemHigh = jsonObj["tem1"].toString();
                days[i].mTips = jsonObj["air_tips"].toString();
                days[i].mFx = jsonObj["win"].toArray()[0].toString();
                days[i].mFl = jsonObj["win_speed"].toString();
                days[i].mHumidity = jsonObj["humidity"].toString();
                days[i].mAirq = jsonObj["air_level"].toString();
            }
        }
    }
    updateUI();
}
 
void Widget::updateUI()
{
    QPixmap pixmap;
 
    //日期
    ui->label_date0102->setText(days[0].mDate + days[0].mWeek);
    //城市
    ui->label_city02->setText(days[0].mCity);
    //温度
    ui->label_temp02->setText(days[0].mTem + "℃");
    //天气
    ui->label_weather02->setText(days[0].mWea);
    //天气图标
    ui->label_icon02->setPixmap(mTypeMap[days[0].mWea]);
    //温度范围
    ui->label_weatherdata02->setText(days[0].mTemLow +
            " ~ " + days[0].mTemHigh + "℃");
    //感冒指数
    ui->label_text0301->setText(days[0].mTips);
    //风向
    ui->label_FX->setText(days[0].mFx);
    //风速
    ui->label_FXdata->setText(days[0].mFl);
    //湿度
    ui->label_SDdata->setText(days[0].mHumidity);
    //PM值
    ui->label_PMdata->setText(days[0].mPM25);
    //空气质量
    ui->label_airQdata->setText(days[0].mAirq);
 
    //遍历ui界面的label
    for (int i = 0; i < 6; i++) {
        //设置日期
        mWeekList[i]->setText(days[i].mWeek);
        mWeekList[0]->setText("今天");
        mWeekList[1]->setText("明天");
        mWeekList[2]->setText("后天");
 
        //设置日期
        QStringList dayList = days[i].mDate.split("-");
        //只显示月日,不显示年,用-分隔开
        mDateList[i]->setText(dayList.at(1)+"-"+dayList.at(2));
 
        //设置图像
        int indexpixMAp = days[i].mWea.indexOf("转");
        //显示转的左边相符天气的图片
        if(indexpixMAp != -1){
            pixmap = mTypeMap[days[i].mWea.left(indexpixMAp)];
        }
        else {
            pixmap = mTypeMap[days[i].mWea];
        }
        //设置图片的样式scaled
        pixmap = pixmap.scaled(mIconList[i]->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
        //设置图片的宽度与高度
        mIconList[i]->setMaximumWidth(ui->widget_05->width()/6.5);
        mIconList[i]->setMaximumHeight(50);
        mIconList[i]->setPixmap(pixmap);
 
        //设置天气类型
        mWeaTypeList[i]->setText(days[i].mWea);
 
        //设置天气质量
        QString daysAirq = days[i].mAirq;
        mAirqList[i]->setText(daysAirq);
        if(daysAirq == "优"){
            //设置背景
              mAirqList[i]->setStyleSheet("background-color: rgb(86, 223, 48);color: rgb(255, 255, 255);border-radius:7px;");
        }
        if(daysAirq == "良"){
              mAirqList[i]->setStyleSheet("background-color: rgb(255, 184, 70);color: rgb(255, 255, 255);border-radius:7px;");
        }
        if(daysAirq == "轻度"){
              mAirqList[i]->setStyleSheet("background-color: rgb(245, 223, 48);color: rgb(255, 255, 255);border-radius:7px;");
        }
        if(daysAirq == "中度"){
              mAirqList[i]->setStyleSheet("background-color: rgb(245, 82, 84);color: rgb(255, 255, 255);border-radius:7px;");
        }
        if(daysAirq == "中度"){
              mAirqList[i]->setStyleSheet("background-color: rgb(255, 0, 0);color: rgb(255, 255, 255);border-radius:7px;");
        }
 
        //设置风向
        mFxList[i]->setText(days[i].mFx);
 
        //设置风力
        int indexFl = days[i].mFl.indexOf("转");
        //显示转的左边相符天气的风力
        if(indexFl != -1){
            mFlList[i]->setText(days[i].mFl.left(indexFl));
        }
        else {
            mFlList[i]->setText(days[i].mFl);
        }
    }
 
    //更新显示
    update();
}
 
 
 
/* 获取天气的Json文件 */
void Widget::readHTTPSerial(QNetworkReply *reply)
{
    //http协议的状态码
    int state_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    //无错误却状态码等于200,获取天气的数据
    if(reply->error() == QNetworkReply::NoError && state_code == 200){
        //大多数服务器返回的字符编码格式是utf-8
        QByteArray data = reply->readAll();
        //PaserWeatherFromJson(data);
        PaserWeatherFromJsonNew(data);
        //调试
        //qDebug() << QString::fromUtf8( data);
    }
    else {
        //生成一个提示窗口
        QMessageBox msgBox;
        msgBox.setWindowTitle("错误");
        msgBox.setText("网络连接错误");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.exec();
        //调试
        reply->errorString();
    }
}
 
/* 鼠标按下触发事件 */
void Widget::mousePressEvent(QMouseEvent *event)
{
    //鼠标右键按下
    if(event->button() == Qt::RightButton){
        //qDebug() << "Rigght button clicked!";
        //显示推出窗口
        menuQuit->addAction(QIcon(":/res/close.png"),"退出");
        //窗口出现在鼠标的位置
        menuQuit->exec(QCursor::pos());
    }
 
    //鼠标左键按下
    if(event->button() == Qt::LeftButton){
        //qDebug() << "Left button clicked!";
        //获取鼠标的位置,界面左上角的位置
        //qDebug() << event->globalPos() << this->pos();
        //偏移量:鼠标位置与界面左上角的位置的差
        mOffset = event->globalPos() - this->pos();
    }
}
 
/* 鼠标拖动移动界面 */
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    //减去偏移量会更湿滑,不然鼠标会跑到界面左上角的位置
    this->move(event->globalPos() - mOffset);
}
 
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->widget_07 && event->type() == QEvent::Paint){
        drawTempHigh();
    }
 
    if(watched == ui->widget_08 && event->type() == QEvent::Paint){
        drawTempLow();
    }
    return QWidget::eventFilter(watched,event);
}
 
void Widget::drawTempHigh()
{
    QPainter painter(ui->widget_07);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setBrush(QBrush(QColor(255, 126, 52)));
    painter.setPen(QColor(255, 126, 52));
 
    int t_ave;
    int sum = 0;
    int offset = 0;
    int middle = ui->widget_07->height()/2;
    for (int i = 0; i < 6; i++) {
         sum += days[i].mTemHigh.toUInt();
    }
    t_ave = sum / 6;
 
    //定义出6个点
    QPoint points[6];
    for (int i = 0; i < 6; i++) {
        points[i].setX(mAirqList[i]->x() + mAirqList[i]->width()/2);
        offset = (days[i].mTemHigh.toInt() - t_ave)*3;
        points[i].setY(middle - offset);
        //画点
        painter.drawEllipse(QPoint(points[i]),3,3);
        //画实际温度
        painter.drawText(points[i].x()-5,points[i].y()+25,days[i].mTemHigh + "°");
    }
 
    //画5根线
    for (int i = 0; i < 5; i++) {
        painter.drawLine(points[i],points[i+1]);
    }
}
 
void Widget::drawTempLow()
{
    QPainter painter(ui->widget_08);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setBrush(QBrush(QColor(53, 168, 193)));
    painter.setPen(QColor(53, 168, 193));
 
    int t_ave;
    int sum = 0;
    int offset = 0;
    int middle = ui->widget_08->height()/2;
    for (int i = 0; i < 6; i++) {
         sum += days[i].mTemLow.toUInt();
    }
    t_ave = sum / 6;
 
    //定义出6个点
    QPoint points[6];
    for (int i = 0; i < 6; i++) {
        points[i].setX(mAirqList[i]->x() + mAirqList[i]->width()/2);
        offset = (days[i].mTemLow.toInt() - t_ave)*3;
        points[i].setY(middle - offset);
        //画点
        painter.drawEllipse(QPoint(points[i]),3,3);
        //画实际温度
        painter.drawText(points[i].x()-5,points[i].y()+25,days[i].mTemLow + "°");
    }
 
    //画5根线
    for (int i = 0; i < 5; i++) {
        painter.drawLine(points[i],points[i+1]);
    }
}
 
/*
解析:/citycode.json文件的cityid与cityname,获取不同城市的天气
QString getCityCodeFromName(QString name)
{
    //打开文件,获取城市的名字,id
    QFile file(":/citycode.json");
    file.open(QIODevice::ReadOnly);
    QByteArray rawData = file.readAll();
    file.close();
    //把文件QByteArray转成QJsonDocument
    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
    //判断是不是数组,QJsonDocument转为QJsonArray
    if(jsonDoc.isArray()){
        QJsonArray citys = jsonDoc.array();
        //遍寻数组,用QJsonValue遍寻
        for(QJsonValue value:citys){
            //判断数组是不是QJsonObject,将QJsonArray转为QJsonObject
            if(value.isObject()){
                QJsonObject cityName = value.toObject();
                //获取城市名字
                QString cityname = cityName["city_name"].toString();
                //判断该城市名是否与文本一致,是返回城市id
                if(cityname == name){
                    return cityName["city_code"].toString();
                }
            }
        }
        //遍寻未找到该城市,返回空字符
        return "";
    }
}
*/
 
/* 按键触发 */
void Widget::on_pushButton_clicked()
{
    //读取文本的城市名称
    QString cityName = ui->lineEdit_ReaserchCity->text();
    //返回的值城市id
    QString cityCode = citycodeutils.getCityCodeFromName(cityName);
    //如果有返回值,重新获取该地区的天气
    if(cityCode != NULL){
        strurl += "&cityid=" + cityCode;
        mannager->get(QNetworkRequest(QUrl(strurl)));
    }
    //如果返回空字符,显示一个错误提示
    else{
        QMessageBox msgBox;
        msgBox.setWindowTitle("错误");
        msgBox.setText("请输入正确的城市名称");
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.exec();
    }
}
 
 
/* 回车确认按键 */
void Widget::on_lineEdit_ReaserchCity_returnPressed()
{
    on_pushButton_clicked();
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统笔记(关于进程引入和状态的切换)

1.前言 今天下午结束了英语的四六级考试&#xff0c;终于是结束了&#xff0c;最近的这个考试太密集&#xff0c;周四的专业基础课考试&#xff0c;周五的这个线性代数的考试和这个周六的英语四六级考试&#xff0c;吧我都要烤焦了&#xff0c;最近也是疲于应对这个考试&#…

M1芯片macOS安装Xinference部署大模型

如果你看的是官方手册&#xff1a;安装 — Xinference 千万不要直接运行&#xff1a; pip install "xinference[all]" 会遇到几个问题&#xff1a; 1&#xff09;Python版本如果太新可能安装失败 2&#xff09;全量安装会失败 3&#xff09;未科学上网可能会time…

【ONNX量化实战】使用ONNX Runtime进行静态量化

目录 什么是量化量化实现的原理实战准备数据执行量化 验证量化结语 什么是量化 量化是一种常见的深度学习技术&#xff0c;其目的在于将原始的深度神经网络权重从高位原始位数被动态缩放至低位目标尾数。例如从FP32&#xff08;32位浮点&#xff09;量化值INT8&#xff08;8位…

【量子计算】格罗弗算法

文章目录 &#x1f50d; 一、算法原理与工作机制⚡ 二、性能优势&#xff1a;二次加速的体现&#x1f310; 三、应用场景⚠️ 四、局限性与挑战&#x1f52e; 五、未来展望&#x1f48e; 总结 格罗弗算法&#xff08;Grover’s algorithm&#xff09;是量子计算领域的核心算法之…

C++ 互斥量

在 C 中&#xff0c;互斥量&#xff08;std::mutex&#xff09;是一种用于多线程编程中保护共享资源的机制&#xff0c;防止多个线程同时访问某个资源&#xff0c;从而避免数据竞争&#xff08;data race&#xff09;和不一致的问题。 &#x1f512; 一、基础用法&#xff1a;s…

CSS Content符号编码大全

资源宝整理分享&#xff1a;​https://www.httple.net​ 前端开发中常用的特殊符号查询工具&#xff0c;包含Unicode编码和HTML实体编码&#xff0c;方便开发者快速查找和使用各种符号。支持基本形状、箭头、数学符号、货币符号等多种分类。 前端最常用符号 图标形状十进制十…

RPC常见问题回答

项目流程和架构设计 1.服务端的功能&#xff1a; 1.提供rpc调用对应的函数 2.完成服务注册 服务发现 上线/下线通知 3.提供主题的操作 (创建/删除/订阅/取消订阅) 消息的发布 2.服务的模块划分 1.网络通信模块 net 底层套用的moude库 2.应用层通信协议模块 1.序列化 反序列化数…

【JavaEE】(3) 多线程2

一、常见的锁策略 1、乐观锁和悲观锁 悲观锁&#xff1a;预测锁冲突的概率较高。在锁中加阻塞操作。乐观锁&#xff1a;预测锁冲突的概率较低。使用忙等/版本号等&#xff0c;不产生阻塞。 2、轻量级锁和重量级锁 重量级锁&#xff1a;加锁的开销较大&#xff0c;线程等待锁…

创客匠人服务体系解析:知识 IP 变现的全链路赋能模型

在知识服务行业深度转型期&#xff0c;创客匠人通过 “工具 陪跑 圈层” 的三维服务体系&#xff0c;构建了从 IP 定位到商业变现的完整赋能链条。这套经过 5 万 知识博主验证的模型&#xff0c;不仅解决了 “内容生产 - 流量获取 - 用户转化” 的实操难题&#xff0c;更推动…

国产ARM/RISCV与OpenHarmony物联网项目(六)SF1节点开发

一、终端节点功能设计 1. 功能说明 终端节点设计的是基于鸿蒙操作系统的 TCP 服务器程序&#xff0c;用于监测空气质量并提供远程控制功能。与之前的光照监测程序相比&#xff0c;这个程序使用 E53_SF1 模块&#xff08;烟雾 / 气体传感器&#xff09;&#xff0c;主要功能包…

Plotly图表全面使用指南 -- Displaying Figures in Python

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 在 Python 中显示图形 使用 Plotly 的 Python 图形库显示图形。 显示图形 Plotly的Python图形库plotly.py提供了多种显示图形的选项和方法…

getx用法详细解析以及注意事项

源码地址 在 Flutter 中&#xff0c;Get 是来自 get 包的一个轻量级、功能强大的状态管理与路由框架&#xff0c;常用于&#xff1a; 状态管理路由管理依赖注入&#xff08;DI&#xff09;Snackbar / Dialog / BottomSheet 管理本地化&#xff08;多语言&#xff09; 下面是 …

深度学习:人工神经网络基础概念

本文目录&#xff1a; 一、什么是神经网络二、如何构建神经网络三、神经网络内部状态值和激活值 一、什么是神经网络 人工神经网络&#xff08;Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c;是一种模仿…

Unity2D 街机风太空射击游戏 学习记录 #12环射道具的引入

概述 这是一款基于Unity引擎开发的2D街机风太空射击游戏&#xff0c;笔者并不是游戏开发人&#xff0c;作者是siki学院的凉鞋老师。 笔者只是学习项目&#xff0c;记录学习&#xff0c;同时也想帮助他人更好的学习这个项目 作者会记录学习这一期用到的知识&#xff0c;和一些…

网站如何启用HTTPS访问?本地内网部署的https网站怎么在外网打开?

在互联网的世界里&#xff0c;数据安全已经成为了每个网站和用户都不得不面对的问题。近期&#xff0c;网络信息泄露事件频发&#xff0c;让越来越多的网站开始重视起用户数据的安全性&#xff0c;因此启用HTTPS访问成为了一个热门话题。作为一名网络安全专家&#xff0c;我希望…

计算机网络-----详解网络原理TCP/IP(上)

文章目录 &#x1f4d5;1. UDP协议✏️1.1 UDP的特点✏️1.2 基于UDP的应用层协议 &#x1f4d5;2. TCP协议✏️2.1 TCP协议段格式✏️2.2 TCP协议特点之确认应答✏️2.3 TCP协议特点之超时重传✏️2.4 TCP协议特点之连接管理✏️2.5 TCP协议特点之滑动窗口✏️2.6 TCP协议特点…

Lora训练

一种大模型高效训练方式&#xff08;PEFT&#xff09; 目标&#xff1a; 训练有限的ΔW&#xff08;权重更新矩阵&#xff09; ΔW为低秩矩阵→ΔWAB&#xff08;其中A的大小为dr, B的大小为rk&#xff0c;且r<<min(d,k)&#xff09;→ 原本要更新的dk参数量大幅度缩减…

蓝牙 5.0 新特性全解析:传输距离与速度提升的底层逻辑(面试宝典版)

蓝牙技术自 1994 年诞生以来,已经经历了多次重大升级。作为当前主流的无线通信标准之一,蓝牙 5.0 在 2016 年发布后,凭借其显著的性能提升成为了物联网(IoT)、智能家居、可穿戴设备等领域的核心技术。本文将深入解析蓝牙 5.0 在传输距离和速度上的底层技术逻辑,并结合面试…

Minio使用https自签证书

自签证书参考&#xff1a;window和ubuntu自签证书_windows 自签证书-CSDN博客 // certFilePath: 直接放在 resources 目录下 或者可以自定实现读取逻辑 // 读取的是 .crt 证书文件public static OkHttpClient createTrustingOkHttpClient(String certFilePath) throws Excep…

汽车前纵梁焊接总成与冲压件的高效自动化三维检测方案

汽车主体结构件上存在很多安装位&#xff0c;为保证汽车装配时的准确性&#xff0c;主体结构件需要进行全方位的尺寸和孔位置精度检测&#xff0c;以确保装配线的主体结构件质量合格。 前纵梁焊接总成是车身框架的核心承载部件&#xff0c;焊接总成由多片钣金冲压件焊接组成&a…