Qt广告机客户端(下位机)
目录
- 功能
- 结构
- adClient.pro
- main.cpp
- adclient.h 客户端
- adclient.cpp 客户端
- addate.h 时间处理
- addate.cpp 时间处理
- adsocket.h 客户端Socket处理
- adsocket.cpp 客户端Socket处理
- weather.h 天气信息处理
- weather.cpp 天气信息处理
- rollmassege.h 滚动信息处理
- rollmassege.cpp 滚动信息处理
- 效果
功能
- 连接服务器(上位机)
- 广告图片播放模块
- 日期显示模块
- 天气显示模块
- 信息提示模块
结构
adClient.pro
QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11TARGET = adClient
TEMPLATE = appSOURCES += main.cpp\adclient.cpp \addate.cpp \adsocket.cpp \weather.cpp \rollmassege.cppHEADERS += adclient.h \addate.h \adsocket.h \tcp_MSG.h \weather.h \rollmassege.hFORMS += adclient.uiRESOURCES += \res.qrc
main.cpp
#include "adclient.h"
#include <QApplication>
#include <QDebug>
#include <QDir>
int main(int argc, char *argv[])
{QApplication a(argc, argv);// 判断当前运行环境是否为Linux或Windows。
#ifdef Q_OS_LINUXqDebug() << "Current OS is Linux";
#elif defined(Q_OS_WIN)qDebug() << "Current OS is Windows";
#elseqDebug() << "Unknown OS";
#endifQString folderName = "pic";//QString folderPath = QDir::currentPath() + "/" + folderName;QString folderPath = QApplication::applicationDirPath() + "/" + folderName;QDir folder(folderPath);if (!folder.exists()){bool success = folder.mkpath("."); // 创建文件夹if (success)qDebug() << "文件夹创建成功";elseqDebug() << "文件夹创建失败";}elseqDebug() << "文件夹已存在";QDir::setCurrent(folderPath);// 设置文件生成路径AdClient w;w.show();return a.exec();
}
adclient.h 客户端
#ifndef ADCLIENT_H
#define ADCLIENT_H#include <QMainWindow>
#include "addate.h"
#include "adsocket.h"
#include "weather.h"
#include "rollmassege.h"
#include <QLabel>
#include <QProgressDialog>
#include "stdlib.h"
#include <QThread>
#include <QTimer>
#include <QFile>
#include <QMessageBox>
#include <QNetworkInterface>
#include <QTcpSocket>
#include <QHostAddress>
#include <QAbstractSocket>
#include <QLineEdit>
#include <QPushButton>namespace Ui {
class AdClient;
}class AdClient : public QMainWindow
{Q_OBJECTpublic:explicit AdClient(QWidget *parent = 0);~AdClient();void saveFile();// 保存文件void InitStatusBar();// 初始化底部状态栏QString GetLocalIP();// 获取本地IPpublic slots:void showImage(QImage);// 图片显示void showProgressBar(int currentProgress,int finish);//进度条显示void autoPlayTimeOut();//自动播放void GUI_WarningMsg(QString title,QString text,QString buttons,QString defaultButton);//设置警报void connectToServer();// 链接到服务器
private:Ui::AdClient *ui;AdDate *date;AdSocket *socket;Weather *weater;RollMassege *rollmsg;QProgressDialog *progress;// 创建进度条QTimer autoPlayTimer;int index;QLabel *mLocalIP;QLabel *serverIP_lb;QLineEdit *serverIP;QLabel *serverPort_lb;QLineEdit *serverPort;QPushButton *connectTcp;};#endif // ADCLIENT_H
adclient.cpp 客户端
#include "adclient.h"
#include "ui_adclient.h"
#include <QDebug>QMap<QString,QImage> qMapPicturePath;// 图片路径//QTcpSocket 的默认缓存区大小是 64KB(65536字节)
AdClient::AdClient(QWidget *parent) :QMainWindow(parent),ui(new Ui::AdClient)
{ui->setupUi(this);this->setWindowIcon(QIcon(":/client.jpg"));date = new AdDate(ui->date_lb);//时间socket = new AdSocket;// TCP客户端weater = new Weather(ui->weather_lb);// 接收天气信息绘制rollmsg = new RollMassege(ui->msg_lb, ui->msg_lb);// 滚动信息connect(socket, SIGNAL(sig_showWeather(QString,QString,QString)), weater, SLOT(showWeather(QString,QString,QString)));connect(socket, SIGNAL(sig_showTxt(QString)), rollmsg, SLOT(showTxt(QString)));connect(socket, SIGNAL(sig_showImage(QImage)), this, SLOT(showImage(QImage)));connect(socket, SIGNAL(sig_showProgressBar(int,int)), this, SLOT(showProgressBar(int,int)),Qt::QueuedConnection);connect(socket, SIGNAL(GUI_WarningSignal(QString,QString,QString,QString)), this, SLOT(GUI_WarningMsg(QString,QString,QString,QString)));date->start();//更新时间progress = nullptr;autoPlayTimer.stop();connect(&autoPlayTimer, SIGNAL(timeout()), this, SLOT(autoPlayTimeOut()));InitStatusBar();// 初始化底部状态栏
}AdClient::~AdClient()
{delete socket;delete ui;
}// 保存文件
void AdClient::saveFile()
{QString fileName=qMapPicturePath.lastKey();qDebug()<<"lastKey:"<<fileName;QImage image=qMapPicturePath.last();image.save(fileName);
}// 初始化底部状态栏
void AdClient::InitStatusBar()
{mLocalIP=new QLabel(this);mLocalIP->setMinimumWidth(230);QString ip = GetLocalIP();// mLocalIP->setText("本地IP:"+ip);mLocalIP->setText("本地IP:"+tr("<font color=\"red\">%1</font>").arg(ip));serverIP_lb=new QLabel(this);serverIP_lb->setMinimumWidth(100);serverIP_lb->setText("服务器IP:");serverIP=new QLineEdit(this);serverIP->setMinimumWidth(200);serverIP->setInputMask("000.000.000.000");serverPort_lb=new QLabel(this);serverPort_lb->setMinimumWidth(60);serverPort_lb->setText("Port:");serverPort=new QLineEdit(this);serverPort->setMinimumWidth(60);serverPort->setPlaceholderText("8888");connectTcp=new QPushButton("链接",this);connectTcp->setMinimumWidth(100);ui->statusBar->addWidget(mLocalIP);ui->statusBar->addWidget(serverIP_lb);ui->statusBar->addWidget(serverIP);ui->statusBar->addWidget(serverPort_lb);ui->statusBar->addWidget(serverPort);ui->statusBar->addWidget(connectTcp);connect(connectTcp, SIGNAL(clicked()), this, SLOT(connectToServer()));
}// 获取本地IP
QString AdClient::GetLocalIP()
{QList<QHostAddress> list=QNetworkInterface::allAddresses();foreach(QHostAddress address,list){if(address.protocol()==QAbstractSocket::IPv4Protocol){qDebug()<<address.toString();return address.toString();}}return "";
}// 图片显示
void AdClient::showImage(QImage image)
{qDebug()<<"显示图片"<<__LINE__;QPixmap pixmap=QPixmap::fromImage(image);// 内容是否自动缩放,参数true自动缩放ui->video_lb->setScaledContents(true);//显示图片的全部// 将图片缩放到指定大小,参数ui->label->size()表示缩放的大小,Qt::KeepAspectRatio表示保持图片的宽高比,Qt::SmoothTransformation表示使用平滑缩放算法ui->video_lb->setPixmap(pixmap.scaled(ui->video_lb->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));qDebug()<<"图片数量:"<<qMapPicturePath.count();qDebug()<<"定时器状态:"<<autoPlayTimer.isActive();if(qMapPicturePath.count()>=2){if(!autoPlayTimer.isActive()){// 两张以上图片开启播放autoPlayTimer.start(5000);index=0;}}else{autoPlayTimer.stop();}if(qMapPicturePath.count()>=1){// 功能没问题,调试注释,避免多次保存//saveFile();// 保存文件}
}//进度条显示
void AdClient::showProgressBar(int currentProgress, int finish)
{qDebug()<<"进度条显示"<<__LINE__;if (!progress){//创建进度条progress = new QProgressDialog("接收中....", "取消", 0, 100, this);progress->setWindowModality(Qt::WindowModal);progress->setFixedSize(this->width()*0.3,this->height()*0.3);progress->setVisible(true);}//usleep(500);//在Windows环境下已被弃用QThread::msleep(50);//休眠50毫秒//更新进度条progress->setValue(currentProgress * 100 / finish);//如果任务已经完成,隐藏进度条if (currentProgress == finish){qDebug()<<"进度条显示完成"<<__LINE__;progress->hide();delete progress;progress = nullptr;}
}//自动播放
void AdClient::autoPlayTimeOut()
{QList<QString> keyList = qMapPicturePath.keys();//存放的就是QMap的key值if(index>=qMapPicturePath.count())// 删除广告时有可能 >index=0;QImage image=qMapPicturePath.value(keyList.at(index));qDebug()<<"自动播放:"<<keyList.at(index);showImage(image);index++;
}
//设置警报
void AdClient::GUI_WarningMsg(QString title, QString text, QString buttons, QString defaultButton)
{Q_UNUSED(buttons)//忽略编译器发出的警告,表明变量event未使用Q_UNUSED(defaultButton)QMessageBox *box=new QMessageBox(QMessageBox::Warning,title,text,QMessageBox::Cancel,this);QTimer::singleShot(5000,this,[=](){if(!box->isHidden()&&box->isVisible()){box->accept();}});// 5s后必执行box->exec();return;
}// 链接到服务器
void AdClient::connectToServer()
{if(serverIP->text().isEmpty()||serverPort->text().isEmpty()){QMessageBox::warning(this,"提示","请输入IP或Port");return;}socket->id=GetLocalIP();socket->address=serverIP->text();qDebug()<<"服务器IP:"<<socket->address;socket->port=serverPort->text().toInt();qDebug()<<"服务器Port:"<<socket->port;qDebug()<<"是否已经连接:"<<socket->isValid();if(socket->isValid())// 如果套接字有效并且可以使用,则返回true;否则返回false。{socket->disconnectFromHost();// 与服务器断开连接// 无需再手动连接,只要更新IP和Port就行,AdSocket::conAgain会重新发起连接.}else{socket->connectToHost(QHostAddress(socket->address), socket->port);}qDebug()<<"是否已经连接:"<<socket->isValid();
}
addate.h 时间处理
#ifndef ADDATE_H
#define ADDATE_H#include <QTime>
#include <QDate>
#include <QLabel>
#include <QTimer>class AdDate : public QObject
{Q_OBJECT
public:AdDate(QLabel *_mlabel, QObject *parent = 0);~AdDate();void start();// 定时器开启
public slots:void updateTime();// 定时器1s超时执行一次
private:QLabel *mlabel;QTimer *mtimer;
};#endif // ADDATE_H
addate.cpp 时间处理
#include "addate.h"AdDate::AdDate(QLabel *_mlabel, QObject *parent):QObject(parent)
{mlabel = _mlabel;mtimer = new QTimer;connect(mtimer, SIGNAL(timeout()), this, SLOT(updateTime()));
}AdDate::~AdDate()
{delete mtimer;
}void AdDate::start()
{mtimer->start(1000);
}void AdDate::updateTime()
{QString time = QTime::currentTime().toString("hh:mm:ss")+"\n"+QDate::currentDate().toString("yy/MM/dd ddd");mlabel->setText(time);
}
adsocket.h 客户端Socket处理
#ifndef ADSOCKET_H
#define ADSOCKET_H#include <QTcpSocket>
#include <QHostAddress>
#include <QAbstractSocket>
#include <QAbstractSocket>
#include <QImage>
#include <QLabel>
#include <QBuffer>
#include <QTime>
#include "string.h"
#include "tcp_MSG.h"class AdSocket : public QTcpSocket
{Q_OBJECT
public:explicit AdSocket(QObject *parent = 0);~AdSocket();QString id;QString address;int port;int readMsgType;signals:void sig_showWeather(QString city,QString area,QString wt);// 发送天气信息void sig_showTxt(QString tcp_Txt);// 发送文字信息void sig_showImage(QImage tcp_image);// 发送文字信息void sig_showProgressBar(int currentProgress, int finish);// 发送进度条信息void GUI_WarningSignal(QString title,QString text,QString buttons,QString defaultButton);//设置警报public slots:void readMsg();// 接收信息void conSuc(); // 成功建立连接void conAgain();// 重新连接void conAgain(QAbstractSocket::SocketError);// 重新连接private:int needFileSize;int currentReceiveSize;QByteArray currentReceiveByte;int milsec;QString fileName;
};#endif // ADSOCKET_H
adsocket.cpp 客户端Socket处理
#include "adsocket.h"
#include <QDebug>extern QMap<QString,QImage> qMapPicturePath;// 图片路径// QTcpSocket会自动处理大小端问题
AdSocket::AdSocket(QObject *parent) :QTcpSocket(parent)
{//注册tcp_MSG类型qRegisterMetaType<tcp_MSG>("tcp_MSG");id = "0011";/* 每当有新的输入数据时,就会发出这个信号。请记住,新传入的数据只报告一次;如果您不读取所有数据,这个类会缓冲数据,您可以稍后读取它,但是除非新数据到达,否则不会发出信号。*/connect(this, SIGNAL(readyRead()),this, SLOT(readMsg()));//该信号在调用connectToHost()并成功建立连接之后发出。connect(this, SIGNAL(connected()),this, SLOT(conSuc()));// 该信号在套接字断开连接时发出connect(this, SIGNAL(disconnected()),this, SLOT(conAgain()));address="127.0.0.1";port=8888;//connectToHost(QHostAddress(address), port);// 默认连接127.0.0.1 8888//该信号在错误发生后发出。socketError参数描述发生错误的类型connect(this, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(conAgain(QAbstractSocket::SocketError)));readMsgType=MsgType::Init;milsec=0;
}AdSocket::~AdSocket()
{}// 接收信息
void AdSocket::readMsg()
{//读取缓冲区数据QByteArray buffer = readAll();qDebug()<<"进来了"<<__LINE__;if(readMsgType==MsgType::Init){tcp_MSG *msg=(tcp_MSG *)buffer.data(); //强转为结构体,需要用结构体指针接收qDebug()<<"进来了"<<__LINE__;qDebug()<<"类型"<<msg->type;switch (msg->type){case WEATHER://天气{QString city=msg->city;QString area=msg->area;QString weather=msg->weather;//weather="\t\t"+city+"\t"+area+"\n"+weather;emit sig_showWeather(city,area,weather);// 发送天气信息break;}case MASSEGE:// 留言{QString tcp_Txt=msg->txt;qDebug()<<"文字信息:"<<tcp_Txt;emit sig_showTxt(tcp_Txt);// 发送文字信息break;}case VIDEO:// 视频qDebug()<<"发送视频信息:";break;case AD_add://添加广告{qDebug()<<"添加广告"<<__LINE__;qDebug()<<"文件名"<< QString(msg->fileName);qDebug()<<"编号"<< msg->index;qDebug()<<"总数"<< msg->allAd_Num;needFileSize=msg->fileSize;currentReceiveSize=0;currentReceiveByte.clear();QByteArray sendTcpData;//使用字节数组,将结构体转为字符数组,发送的是字符数组(数据在传输过程中都是byte类型的)//直接sizeof(senddata)内存会变小,设置了对齐方式解决sendTcpData.resize(sizeof(tcp_backMSG));tcp_backMSG backMsg={};strcpy(backMsg.id,id.toUtf8().data());backMsg.state=1;backMsg.type=MsgType::Write_back;//将封装好的结构体转为QByteArray数组,因为传输都是Byte类型memcpy(sendTcpData.data(),&backMsg,sizeof(tcp_backMSG));this->write(sendTcpData);// 回复fileName.clear();fileName=QString(msg->fileName);readMsgType=MsgType::AD_add;break;}case AD_delete://删除广告{qDebug()<<"删除广告"<<__LINE__;qDebug()<<"文件名"<< QString(msg->fileName);int success= qMapPicturePath.remove(QString(msg->fileName));if(success){if(qMapPicturePath.count()>=1){// 有图片emit sig_showImage(qMapPicturePath.first());}else{// 没有图片QImage image(100, 100, QImage::Format_RGBA8888);image.fill(QColor(0, 0, 0, 0));// 纯透明图片emit sig_showImage(image);}emit GUI_WarningSignal("提示","删除广告成功",NULL,NULL);}else{emit GUI_WarningSignal("提示","删除广告失败",NULL,NULL);}break;}default:qDebug()<<"";break;}}else if(readMsgType==MsgType::AD_add){qDebug()<<"添加广告"<<__LINE__;qDebug()<<"需要接收大小:"<<needFileSize;// 记录开始时间QTime startTime = QTime::currentTime();currentReceiveSize+=buffer.size();currentReceiveByte+=buffer;qDebug()<<"当前接收大小:"<<currentReceiveSize;emit sig_showProgressBar(currentReceiveSize,needFileSize);// 记录结束时间QTime endTime = QTime::currentTime();// 计算运行时间milsec += startTime.msecsTo(endTime);if(needFileSize==currentReceiveSize){qDebug()<<"图片接收完成";startTime = QTime::currentTime();QByteArray Ret_bytearray = QByteArray::fromBase64(currentReceiveByte);QBuffer buffer(&Ret_bytearray);buffer.open(QIODevice::WriteOnly);QPixmap imageresult;imageresult.loadFromData(Ret_bytearray);qMapPicturePath.insert(fileName,imageresult.toImage());// 先插入键值emit sig_showImage(imageresult.toImage());readMsgType=MsgType::Init;endTime = QTime::currentTime();milsec += startTime.msecsTo(endTime);qDebug()<<"接收消耗时间"<<milsec<<"毫秒";}}
}
// 成功建立连接
void AdSocket::conSuc()
{QByteArray sendTcpData;//使用字节数组,将结构体转为字符数组,发送的是字符数组(数据在传输过程中都是byte类型的)//直接sizeof(senddata)内存会变小,设置了对齐方式解决sendTcpData.resize(sizeof(tcp_backMSG));tcp_backMSG msg={};strcpy(msg.id,id.toUtf8().data());msg.state=0;msg.type=MsgType::Init;//将封装好的结构体转为QByteArray数组,因为传输都是Byte类型memcpy(sendTcpData.data(),&msg,sizeof(tcp_backMSG));this->write(sendTcpData);qDebug()<<"connect success";
}// 重新连接
void AdSocket::conAgain()
{qDebug()<<"套接字断开连接时重新连接";abort();// 终止当前连接并重置套接字connectToHost(QHostAddress(address), port);
}
// 重新连接
void AdSocket::conAgain(QAbstractSocket::SocketError error)
{qDebug()<<"连接失败:"<<error;readMsgType=MsgType::Init;abort();// 终止当前连接并重置套接字if(error==QAbstractSocket::ConnectionRefusedError){connectToHost(QHostAddress(address), port);}
}
weather.h 天气信息处理
#ifndef WEATHER_H
#define WEATHER_H#include <QObject>
#include <QLabel>
#include <QDebug>
class Weather : public QObject
{Q_OBJECT
public:explicit Weather( QLabel *_label,QObject *parent = 0);signals:public slots:void showWeather(QString city,QString area,QString weather);private:QLabel *label;QString _city;QString _area;
};#endif // WEATHER_H
weather.cpp 天气信息处理
#include "weather.h"Weather::Weather( QLabel *_label, QObject *parent) :QObject(parent)
{label = _label;
}void Weather::showWeather(QString city,QString area,QString weather)
{_city=city;qDebug()<<"城市:"<<_city;_area=area;qDebug()<<"地区:"<<_area;weather="\t\t"+_city+"\t"+_area+"\n\t"+weather;label->setText(weather);
}
rollmassege.h 滚动信息处理
#ifndef ROLLMASSEGE_H
#define ROLLMASSEGE_H#include <QLabel>
#include <QEvent>
#include <QTimer>
#include <QRect>
#include <QPainter>
#include <QFont>class RollMassege : public QLabel
{Q_OBJECT
public:explicit RollMassege(QWidget *parent = 0);explicit RollMassege(QLabel *_label, QWidget *parent = 0);void paintEvent(QPaintEvent *event);
signals:public slots:void updateMsg();void showTxt(QString tcp_Txt);
private:QString txt;QRect rect;int offset;//偏移量QTimer *timer;
};#endif // ROLLMASSEGE_H
rollmassege.cpp 滚动信息处理
#include "rollmassege.h"
#include <QDebug>RollMassege::RollMassege(QWidget *parent) :QLabel(parent)
{
}RollMassege::RollMassege(QLabel *_label, QWidget *parent) :QLabel(parent)
{rect = _label->geometry();rect.setWidth(798);rect.setHeight(80);setGeometry(rect);show();qDebug()<<rect.width()<<" "<<rect.height();offset = rect.width();//偏移量txt = "暂无信息";timer = new QTimer;connect(timer, SIGNAL(timeout()), this, SLOT(updateMsg()));timer->start(50);
}
// 绘画事件
void RollMassege::paintEvent(QPaintEvent *event)
{Q_UNUSED(event); //忽略编译器发出的警告,表明变量event未使用QPainter painter(this);QFont font;font.setPointSize(16);painter.setFont(font);painter.drawText(rect.x()+offset, rect.y()+30, txt);// 绘制文字,x+偏移量
}void RollMassege::updateMsg()
{offset--;if(offset<0) offset = rect.width();update();// 刷新,触发绘画事件paintEvent
}void RollMassege::showTxt(QString tcp_Txt)
{txt =tcp_Txt;update();
}
效果
相关文章:

Qt广告机客户端(下位机)
目录功能结构adClient.promain.cppadclient.h 客户端adclient.cpp 客户端addate.h 时间处理addate.cpp 时间处理adsocket.h 客户端Socket处理adsocket.cpp 客户端Socket处理weather.h 天气信息处理weather.cpp 天气信息处理rollmassege.h 滚动信息处理rollmassege.cpp 滚动信息…...

JavaScript新手学习手册-基础代码(二)
与上篇博客相接 一:函数: 案例:通过函数实现绝对值的输出 方法一: function absoluate(x){if(x>0){return x;}else{ return -x;}} 在控制台调用函数 方法二: var demo1 function(x){if(x>0){return x;}els…...

wireshark 抓包使用记录
文章目录前言wireshark 抓包使用记录一、wireshark的基础使用二、wireshark的常用功能1、开始混杂模式2、过滤器操作2.1、抓包过滤器2.2、显示过滤器3、时间格式显示4、统计流量图5、标记显示6、导出数据包7、增加、隐藏、删除显示列前言 如果您觉得有用的话,记得给…...
pd dataframe 读取处理 有合并单元格的excel方式
from pathlib import Path import openpyxl 拆分所有的合并单元格,并赋予合并之前的值。 由于openpyxl并没有提供拆分并填充的方法,所以使用该方法进行完成 def unmerge_and_fill_cells(worksheet): all_merged_cell_ranges list( worksheet.merged_…...

七,iperf3源代码分析:状态机及状态转换过程--->运行正向TCP单向测试时的服务端代码
本文目录一、测试用命令二、iperf3状态机中各个状态解析三、iperf3状态机迁移分析K-初始化测试对象(NA--->初始化状态):A-服务器端测试对象开始运行(初始化状态--->IPERF_START状态):B-建立控制连接(初始化状态-…...

【网络篇】----- 传输层协议 之 UDP(协议格式,协议特性和编程影响三方面详细分析)
文章目录 前言1、UDP协议2、协议格式 2.1、协议格式模型2.2、字段分析3.协议特性4.编程影响总结前言 1、UDP协议 UDP协议,又名数据报传输协议,是传输层协议之一!!! 在TCP/IP五层模型中,在传输层中ÿ…...

【基于STM32的多功能台灯控制】
基于STM32的多功能台灯控制 在之前一篇博文中已出过智能台灯相关的介绍,在这里对之前的模块以及功能上进行了优化和功能上的改进,需源码或实物可私【创作不易-拒绝白嫖】 功能说明 1、按键模式多功能台灯在设计上使用了4个按键分别做为 按键1模式的切换…...
Mac 编译x264源码No working C compiler found 错误
在mac上编译x264源码时,报错No working C compiler found 。网上找了一圈方案也无法解决 只能硬着头皮看configure这个脚本,通过一步一步抽丝拨茧终于是在mac上可以编译了。 这里只当记录一下,为后续同学遇到同样问题提供一个辅助解决方案。…...

如何有效地降低软件开发风险?
1、科学分析风险 高风险自动预警 一般对风险进行科学分析,主要从3个维度进行划分:影响的严重性、发生的可能性、产生的影响性。 根据风险对项目的影响程度,从3个维度将其划分5个等级:很低、比较低、中等、比较高、很高。这样我们能…...
【python】剑指offer代码大集合2
本文是【python】剑指offer代码大集合的姊妹篇,用于完善标识todo的代码! 刷题网站:https://leetcode.cn/problem-list/xb9nqhhg/ 剑指 Offer 14- I. 剪绳子 https://leetcode.cn/problems/jian-sheng-zi-lcof/ todo 剑指 Offer 14- II. 剪绳子 II https://leetcode.cn/pr…...

经纬恒润再传佳讯,斩获大奖
阳春二月,经纬恒润屡传佳讯,凭借产品、研发等多方面的出色表现,再次斩获东风柳汽“优秀供应商”和广汽传祺“科技创新奖”,以实力印证良好口碑,不忘初心,载誉而行! 东风柳汽:优秀供…...

说说转义字符 “\”
转义字符-escape character character 表示字符,包含两层含义, 1.字母 2.符号 转义: 改变含义 字符: 字母、符号 转义字符: 把 字母、符号 的含义改变了注意:这里有 2 个常常被忽视、忽略、轻视的转义规则&…...

2023高质量设计竞赛汇总,想证明自己实力的快来
对于设计师来说,参加设计比赛不仅能够提升自己的设计能力,也是一条证明实力最好的捷径。小编也收集整理了不少近期设计大赛,分别标注了截止日期和官网等,宝子们记得码住收藏,赶紧SHOW起来!优酷X站酷 一千零…...
MongoDB与MySQL有区别吗?用一个表格跟你说明
MongoDB MySQL 数据库模型 非关系型 关系型 存储方式 虚拟内存持久化 不同引擎有不同存储方式 查询语句 独特MongoDB查询方式 传统SQL语句 架构特点 可通过副本集和分片实现高可用 常见有单点、M-S、MHA、MMM、Cluster等架构方式 数据处理方式 基于内存…...

ElasticSearch - 分布式文档索引、搜索、更新和删除文档的过程
文章目录1. 分布式文档存储1. 路由一个文档到一个分片中2. 主分片和副本分片如何交互3. 新建、索引和删除文档4. 取回一个文档5. 局部更新文档2. ElasticSearch相关问题1. 路由计算方式?2. 分片控制3. 分布式文档写入(索引)的过程?4. 分布式文档搜索的过…...

Python之re库用法细讲
文章目录前言一、使用 re 模块的前期准备工作二、使用 re 模块匹配字符串1. 使用 match() 方法进行匹配2. 使用 search() 方法进行匹配3. 使用 findall() 方法进行匹配三、使用 re 模块替换字符串四、使用 re 模块分割字符串总结前言 在之前的博客中我们学习了【正则表达式】的…...

MATLAB | 如何绘制github同款日历热力图
应粉丝要求,出一个类似于github热图的日历热力图,大概长这样: 依旧工具函数放在文末,如有bug请反馈并去gitee下载更新版。 使用教程 使用方式有以下几种会慢慢讲到: heatmapDT(Year,T,V)heatmapDT(Year,T,V,MonLim)h…...
认识适配器模式
适配器模式 一、定义 在不修改原来代码的情况下,适配器模式使接口不兼容的那些类可以一起工作。 二、适配器结构 1、Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或者接口,也可以…...

JavaSe第6次笔记
1.不建议使用c语言的数组的表示方法。 2.二维数组表示方法 3.数组整体初始化时,只能在定义时初始化。 int[] array; array new int[]{1, 2}; 4. boolean类型数组,默认值是false,String类型数组,默认是null,其它是…...
单例设计模式
介绍 单例模式是一种创建型设计模式,其主要特点包括: 只有一个实例:单例模式确保系统中只有一个实例对象存在,所有对该对象的访问都是对同一个对象的引用全局访问:单例模式可以全局访问该实例对象,避免了多个对象之间的冲突和竞争延迟初始化:单例模式通常使用延迟初始化技术,…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...