QT 实现随机码验证
1.界面实现效果
以下是具体的项目需要用到的效果展示,用于验证字母。
2.简介
自定义CaptchaMovableLabel,继承自QLabel类:
中间的4个字母,就是CaptchaMovableLabel类来实例化的对象。
主要功能如下:
1.显示字母;
2.实现了鼠标移动事件,使字母可拖动;
3.存在定时器,不断改变字母颜色;
4.绘制字母时,可旋转一定角度;
#ifndef CAPTCHAMOVABLELABEL_H
#define CAPTCHAMOVABLELABEL_H#include <QLabel>
#include <QTime>
#include <QPropertyAnimation>
#include <QDebug>
#include <QMouseEvent>
#include <QPainter>
#include <QPainterPath>
#include <QApplication>
#include <QGraphicsDropShadowEffect>
#include <cmath>
#include <QTimer>#define CAPTCHA_REFRESH_DURATION 300 // 刷新的动画时长
#define CAPTCHA_CHAR_ANGLE_MAX 20 // 最大旋转角:20°
#define CAPTCHA_SHADOW_BLUR_MAX 80 // 最大的阴影模糊半径class CaptchaMovableLabel : public QLabel
{Q_OBJECTQ_PROPERTY(int refreshProgress READ getRefreshProgress WRITE setRefreshProgress)Q_PROPERTY(int pressProgress READ getPressProgress WRITE setPressProgress)
public:CaptchaMovableLabel(QWidget* parent);void setAngle(int angle);void setColor(QColor color);void setText(QString ch);void startRefreshAnimation();void setMoveBorder(QRect rect);QString text();protected:void paintEvent(QPaintEvent *) override;void mousePressEvent(QMouseEvent *ev) override;void mouseMoveEvent(QMouseEvent *ev) override;void mouseReleaseEvent(QMouseEvent *ev) override;private:void startPressAnimation(int end);void setRefreshProgress(int g);int getRefreshProgress();inline bool isNoAni();void setPressProgress(int g);int getPressProgress();private slots://设置rgb颜色void slotMovePos();private:QPoint press_pos;bool dragging = false;bool moved = false;QGraphicsDropShadowEffect effect;QString ch;QColor color;int angle = 0;int refreshProgress = 100;QString prevCh;QColor prevColor;int prevAngle = 0;QString prevChar;int pressProgress = 0;bool inited = false;QTimer movingTimer;int moveR, moveG, moveB;
};#endif // CAPTCHAMOVABLELABEL_H#include "captchamovablelabel.h"CaptchaMovableLabel::CaptchaMovableLabel(QWidget *parent) : QLabel(parent)
{effect.setOffset(0, 0);
// effect.setBlurRadius(8);setGraphicsEffect(&effect);movingTimer.setInterval(30);movingTimer.setSingleShot(false);connect(&movingTimer, SIGNAL(timeout()), this, SLOT(slotMovePos()));
}void CaptchaMovableLabel::setAngle(int angle)
{this->prevAngle = this->angle;this->angle = angle;
}void CaptchaMovableLabel::setColor(QColor color)
{this->prevColor = this->color;this->color = color;moveR = qrand() % 5;moveG = qrand() % 5;moveB = qrand() % 5;movingTimer.start();
}void CaptchaMovableLabel::setText(QString text)
{this->prevCh = this->ch;this->ch = text;// 计算合适的高度QFontMetrics fm(this->font());double w = fm.horizontalAdvance(text)+2;double h = fm.height();const double PI = 3.141592;int xieHalf = sqrt(w*w/4+h*h/4); // 斜边的一半double a = atan(w/h) + CAPTCHA_CHAR_ANGLE_MAX * PI / 180; // 最大的倾斜角度int w2 = xieHalf * sin(a) * 2;a = atan(w/h) - CAPTCHA_CHAR_ANGLE_MAX * PI / 180;int h2 = xieHalf * cos(a) * 2;resize(w2, h2);
}void CaptchaMovableLabel::startRefreshAnimation()
{if (!inited) // 第一次,直接显示,取消动画{inited = true;return ;}QPropertyAnimation* ani = new QPropertyAnimation(this, "refreshProgress");ani->setStartValue(0);ani->setEndValue(100);ani->setDuration(qrand() % (CAPTCHA_REFRESH_DURATION / 3) + CAPTCHA_REFRESH_DURATION / 3);ani->start();connect(ani, SIGNAL(finished()), ani, SLOT(deleteLater()));connect(ani, SIGNAL(finished()), &movingTimer, SLOT(start()));
}QString CaptchaMovableLabel::text()
{return ch;
}void CaptchaMovableLabel::paintEvent(QPaintEvent *)
{QPainter painter(this);painter.setFont(this->font());painter.setRenderHint(QPainter::SmoothPixmapTransform);int w2 = width()/2, h2 = height()/2;painter.translate(w2, h2); // 平移到中心,绕中心点旋转if (isNoAni()) // 不在动画中,直接绘制{painter.setPen(color);painter.rotate(angle);painter.drawText(QRect(-w2, -h2, width(), height()), Qt::AlignCenter, ch);return ;}// 动画里面,前后渐变替换double newProp = refreshProgress / 100.0;double oldProp = 1.0 - newProp;double a = prevAngle * oldProp + angle * newProp + 0.5;painter.save();painter.rotate(a);QColor c = prevColor;c.setAlpha(c.alpha() * oldProp); // 旧文字渐渐消失painter.setPen(c);painter.drawText(QRect(-w2,-h2,width(),height()), Qt::AlignCenter, prevCh);c = this->color;c.setAlpha(c.alpha() * newProp); // 新文字渐渐显示painter.setPen(c);painter.drawText(QRect(-w2, -h2, width(), height()), Qt::AlignCenter, ch);painter.restore();
}void CaptchaMovableLabel::mousePressEvent(QMouseEvent *ev)
{if (ev->button() == Qt::LeftButton){// 开始拖拽press_pos = ev->pos();dragging = true;moved = false;this->raise();movingTimer.stop();startPressAnimation(200);return ev->accept();}QLabel::mousePressEvent(ev);
}void CaptchaMovableLabel::mouseMoveEvent(QMouseEvent *ev)
{if (dragging && ev->buttons() & Qt::LeftButton){if (!moved && (ev->pos() - press_pos).manhattanLength() < QApplication::startDragDistance()){return QLabel::mouseMoveEvent(ev); // 还没到这时候}moved = true;move(this->pos() + ev->pos() - press_pos);ev->accept();return ;}QLabel::mouseMoveEvent(ev);
}void CaptchaMovableLabel::mouseReleaseEvent(QMouseEvent *ev)
{if (dragging){// 结束拖拽dragging = false;movingTimer.start();startPressAnimation(0);}if (moved)return ev->accept();QLabel::mouseReleaseEvent(ev);
}void CaptchaMovableLabel::startPressAnimation(int end)
{QPropertyAnimation* ani = new QPropertyAnimation(this, "pressProgress");ani->setStartValue(pressProgress);ani->setEndValue(end);ani->setDuration(CAPTCHA_REFRESH_DURATION << 1);ani->start();connect(ani, SIGNAL(finished()), ani, SLOT(deleteLater()));
}void CaptchaMovableLabel::setRefreshProgress(int g)
{this->refreshProgress = g;update();
}int CaptchaMovableLabel::getRefreshProgress()
{return refreshProgress;
}bool CaptchaMovableLabel::isNoAni()
{return refreshProgress == 100;
}void CaptchaMovableLabel::setPressProgress(int g)
{this->pressProgress = g;double off = g / 100;effect.setBlurRadius(g / 20.0);effect.setOffset(-off, off);
}int CaptchaMovableLabel::getPressProgress()
{return pressProgress;
}void CaptchaMovableLabel::slotMovePos()
{if (refreshProgress < 100)return ;int val = color.red() + moveR;if ( val > 255){val = 255;moveR = - qrand() % 5;}else if (val < 0){val = 0;moveR = - qrand() % 5;}color.setRed(val);val = color.green() + moveG;if ( val > 255){val = 255;moveG = - qrand() % 5;}else if (val < 0){val = 0;moveG = - qrand() % 5;}color.setGreen(val);val = color.blue() + moveB;if ( val > 255){val = 255;moveB = - qrand() % 5;}else if (val < 0){val = 0;moveB = - qrand() % 5;}color.setBlue(val);
}
自定义CaptchaLabel类,此类继承QWidget用于存在上面的4个字母。
主要功能如下:
1.画噪音点,背景上绘制无数个随机颜色的点;
2.画噪音线,这个线条是动态的,随时间更改起渐变颜色,线条位置;
3.鼠标点击,生成随机字母。
#ifndef CAPTCHALABEL_H
#define CAPTCHALABEL_H#include "captchamovablelabel.h"
#include <QTimer>#define CAPTCHAR_COUNT 4 // 验证码字符数量class CaptchaLabel : public QWidget
{Q_OBJECTQ_PROPERTY(int refreshProgress READ getRefreshProgress WRITE setRefreshProgress)
public:CaptchaLabel(QWidget* parent = nullptr);void refresh();bool match(QString input);private:void initView();void initData();void setRefreshProgress(int g);int getRefreshProgress();bool isNoAni();private slots:void moveNoiseLines();protected:void paintEvent(QPaintEvent* ) override;void mouseReleaseEvent(QMouseEvent *event) override;private:CaptchaMovableLabel* charLabels[CAPTCHAR_COUNT]; // Label控件QList<QPoint> noisePoints; // 噪音点QList<QColor> pointColors; // 点的颜色QList<QPointF> lineStarts; // 噪音线起始点QList<QPointF> lineEnds; // 噪音先结束点QList<QPointF> startsV; // 起始点的移动速度(带方向)QList<QPointF> endsV; // 结束点的速度(带方向)QList<QColor> lineColor1s; // 线的渐变色1QList<QColor> lineColor2s; // 线的渐变色2QList<int> lineWidths;QTimer movingTimer;int refreshProgress = 100;QList<QPoint> noisePoints2; // 新的位置int autoRefreshMax = 2; // match错误几次后就自动刷新int matchFailCount = 0; // match错误次数int matchFailAndRefreshCount = 0; // 失败且导致刷新的次数,强行刷新
};#endif // CAPTCHALABEL_H#include "captchalabel.h"CaptchaLabel::CaptchaLabel(QWidget *parent) : QWidget(parent)
{initView();// 这里延迟,等待布局结束QTimer::singleShot(0, [=]{initData();refresh();});
}void CaptchaLabel::initView()
{// 初始化控件for (int i = 0; i < CAPTCHAR_COUNT; i++){charLabels[i] = new CaptchaMovableLabel(this);charLabels[i]->move(0, 0);}// 初始化时钟movingTimer.setInterval(30);movingTimer.setSingleShot(false);movingTimer.start();connect(&movingTimer, SIGNAL(timeout()), this, SLOT(moveNoiseLines()));
}void CaptchaLabel::initData()
{// 初始化噪音线auto getRandomColor = [=]{return QColor(qrand() % 255, qrand() % 255, qrand() % 255);};int w = width(), h = height();int count = 20/*w * h / 400*/;int penW = qMin(w, h) / 15;for (int i = 0; i < count; i++){lineStarts.append(QPointF(qrand() % w, qrand() % h));lineEnds.append(QPointF(qrand() % w, qrand() % h));startsV.append(QPointF((qrand() % 30 - 15) / 10.0, (qrand() % 30 - 15) / 10.0));endsV.append(QPointF((qrand() % 30 - 15) / 10.0, (qrand() % 30 - 15) / 10.0));lineWidths.append(qrand() % penW + 1);lineColor1s.append(getRandomColor());lineColor2s.append(getRandomColor());}
}void CaptchaLabel::setRefreshProgress(int g)
{this->refreshProgress = g;update();
}int CaptchaLabel::getRefreshProgress()
{return refreshProgress;
}bool CaptchaLabel::isNoAni()
{return refreshProgress == 100;
}void CaptchaLabel::moveNoiseLines()
{int w = width(), h = height();double vBase = 100.0; // 大概最快要3秒钟走完for (int i = 0; i < lineStarts.size(); i++){QPointF& pos = lineStarts[i];pos += startsV.at(i);if (pos.x() < 0)startsV[i].setX(qrand() % w / vBase);else if (pos.x() > w)startsV[i].setX(- qrand() % w / vBase);if (pos.y() < 0)startsV[i].setY(qrand() % h / vBase);else if (pos.y() > h)startsV[i].setY(- qrand() % h / vBase);}for (int i = 0; i < lineEnds.size(); i++){QPointF& pos = lineEnds[i];pos += endsV.at(i);if (pos.x() < 0)endsV[i].setX(qrand() % w / vBase);else if (pos.x() > w)endsV[i].setX(- qrand() % w / vBase);if (pos.y() < 0)endsV[i].setY(qrand() % h / vBase);else if (pos.y() > h)endsV[i].setY(- qrand() % h / vBase);}update();
}
void CaptchaLabel::refresh()
{int width = this->width();int height = this->height();// 清空全部内容for (int i = 0; i < CAPTCHAR_COUNT; i++)charLabels[i]->hide();refreshProgress = -1;update();// 获取背景底色QPixmap rend(this->size());render(&rend);QColor bgColor = rend.toImage().pixelColor(width/2, height/2);int br = bgColor.red(), bg = bgColor.green(), bb = bgColor.blue();// 开始随机生成const int border = 10;int leftest = width / border;int topest = height / border;int wid = width - leftest * 2;int hei = height - topest * 2;for (int i = 0; i < CAPTCHAR_COUNT; i++){auto label = charLabels[i];// 随机大小QFont font;font.setPointSize( qrand() % 8 + 22 );label->setFont(font);// 随机旋转label->setAngle( qrand() % (CAPTCHA_CHAR_ANGLE_MAX*2) - CAPTCHA_CHAR_ANGLE_MAX);// 生成随机字符const QString pool = "QWERTYUIOPASDFGHJKLZXCVBNM";QChar rc = pool.at(qrand() % pool.size());// 此时会调整大小,setText必须在setFont之后label->setText(rc);// 生成随机位置(排除边缘)int left = leftest + wid * i / CAPTCHAR_COUNT;int right = leftest + wid * (i+1) / CAPTCHAR_COUNT - label->width();int x = qrand() % qMax(right-left, 1) + left;int y = qrand() % qMax(hei - label->height(), 1) + topest;label->show(); // 之前是hide状态QPropertyAnimation * ani = new QPropertyAnimation(label, "pos");ani->setStartValue(label->pos());ani->setEndValue(QPoint(x, y));ani->setDuration(qrand() % (CAPTCHA_REFRESH_DURATION/2) + CAPTCHA_REFRESH_DURATION/2);ani->setEasingCurve(QEasingCurve::OutQuart);ani->start();connect(ani, SIGNAL(finished()), ani, SLOT(deleteLater()));// 生成随机颜色,且必须和背景颜色有区分度QColor color;while (true){int r = qrand() % 255;int g = qrand() % 255;int b = qrand() % 255;if (abs(r-br) + abs(g-bg) + abs(b-bb) > 383){color = QColor(r, g, b);break;}}label->setColor(color);label->startRefreshAnimation();}// 生成噪音点int count = wid * hei / border; // 点的数量if (noisePoints.size() == 0) // 第一次{for (int i = 0; i < count; i++){int x = qrand() % width;int y = qrand() % height;noisePoints.append(QPoint(x, y / 2));noisePoints2.append(QPoint(x, y));pointColors.append(QColor(qrand() % 255, qrand() % 255, qrand() % 255));}}else{noisePoints = noisePoints2;count = noisePoints.size();noisePoints2.clear();for (int i = 0; i < count; i++){noisePoints2.append(QPoint(qrand() % width, qrand() % height));}}// 生成噪音线QPropertyAnimation* ani = new QPropertyAnimation(this, "refreshProgress");ani->setStartValue(0);ani->setEndValue(100);ani->setDuration(qrand() % (CAPTCHA_REFRESH_DURATION) + CAPTCHA_REFRESH_DURATION);ani->start();connect(ani, SIGNAL(finished()), ani, SLOT(deleteLater()));
}/*** 判断能否匹配*/
bool CaptchaLabel::match(QString input)
{// 根据label的位置排序std::sort(charLabels, charLabels+CAPTCHAR_COUNT, [=](QLabel* a, QLabel* b){if (a->pos().x() == b->pos().x())return a->pos().y() < b->pos().y();return a->pos().x() < b->pos().x();});// 按顺序组合成新的字符串QString captcha;for (int i = 0; i < CAPTCHAR_COUNT; i++)captcha += charLabels[i]->text();// 进行比较if (input.toUpper() == captcha)return true;// 记录失败matchFailCount++;if (matchFailCount >= autoRefreshMax // 达到刷新的次数|| matchFailAndRefreshCount > 2) // 多次错误导致刷新{refresh();matchFailAndRefreshCount++;matchFailCount = 0;}return false;
}void CaptchaLabel::paintEvent(QPaintEvent *)
{QPainter painter(this);if (refreshProgress == -1) // 不画,可能需要获取背景颜色return ;// 画噪音点if (isNoAni()){// 显示随机的点for (int i = 0; i < noisePoints2.size(); i++){painter.setPen(pointColors.at(i));painter.drawPoint(noisePoints2.at(i));}}else{// 动画过程中的点的移动double newProp = refreshProgress / 100.0;double oldProp = 1.0 - newProp;int count = qMin(noisePoints.size(), noisePoints2.size());for (int i = 0; i < count; i++){QPoint pt1 = noisePoints.at(i);QPoint pt2 = noisePoints2.at(i);QPoint pt( pt1.x() * oldProp + pt2.x() * newProp,pt1.y() * oldProp + pt2.y() * newProp );painter.setPen(pointColors.at(i));painter.drawPoint(pt);}}// 画噪音线painter.setRenderHint(QPainter::Antialiasing);for (int i = 0; i < lineStarts.size(); i++){QLinearGradient grad(lineStarts.at(i), lineEnds.at(i));grad.setColorAt(0, lineColor1s.at(i));grad.setColorAt(1, lineColor2s.at(i));painter.setPen(QPen(grad, lineWidths.at(i)));painter.drawLine(lineStarts.at(i), lineEnds.at(i));}
}void CaptchaLabel::mouseReleaseEvent(QMouseEvent *event)
{if (QRect(0,0,width(),height()).contains(event->pos()))refresh();QWidget::mouseReleaseEvent(event);
}
3.使用
新建MainWindow,拖动一个QWidget,提升为CaptchaLabel即可。
相关文章:

QT 实现随机码验证
1.界面实现效果 以下是具体的项目需要用到的效果展示,用于验证字母。 2.简介 自定义CaptchaMovableLabel,继承自QLabel类: 中间的4个字母,就是CaptchaMovableLabel类来实例化的对象。 主要功能如下: 1.显示字母&am…...

集合框架12:Set集合概述、Set接口使用
视频链接:13.24 Set接口使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p24 1、Set集合概述 特点:无序、无下标,元素不可…...

如何打开荣耀手机的调试模式?
问题描述: 最近用荣耀手机进行测试,打开开发者选项,打开USB调试,在选择USB配置时,发现仅有选择USB以太网才可以连接Android Studio,也就是打开ADB调试模式。 但是,打开USB以太网后,…...

Meta新模型Dualformer:融合快慢思维,推理能力媲美人脑
Meta 的 FAIR 团队最近推出了一款名为 Dualformer 的全新 Transformer 模型,该模型模仿人类的双重认知系统,能够无缝整合快速和慢速推理模式,在推理能力和计算效率上取得了显著突破。 人类的思维过程通常被认为是由两种系统控制的:系统1快速…...

CDGA|数据治理:如何让传统行业实现数据智能
在当今这个数字化时代,数据已成为推动各行各业转型升级的关键力量。对于传统行业而言,如何从海量、复杂的数据中挖掘价值,实现“数据智能”,成为了提升竞争力、优化运营效率、创新业务模式的重要途径。本文将探讨数据治理如何助力…...

Spring源码5.2.9 编译踩坑
源码编译踩坑 拉取源码 我这块以5.2.9版本为例 spring-projects/spring-framework at v5.2.9.RELEASE (github.com) 版本分析 确定版本 这块将Gradle升级到了5.6.4 ,我们去官网下载即可 Gradle安装 Gradle | Releases 解压 将其解压到你想存放的文件夹 配置环…...

【前端】如何制作一个自己的网页(5)
上节课我们学习了以下知识: 1、网页中常见的文本元素,如标题元素与段落元素; 2、两个通用属性id与class; 3、元素的两种类型——块级元素与行内元素。 其实除了文本内容外,网页还可以包含图片、超链接等各类信息&a…...

Unity实战案例全解析 类宝可梦回合制的初级案例 源码分析(加了注释和流程图)
这是一个老教程了,但是对于没有写过回合制的初级程序同学来讲是比较适合的,也可以直接看源码,半小时内可以解决战斗 当然,我也没写过回合制系统所以就到处找,思路明白了就能自己修改了 视频教程 - 油管链接 Turn-Bas…...

AI绘图大模型 Stable Diffusion 使用详解
近年来,生成式 AI 技术,特别是 AI 绘图模型的进展令人瞩目。Stable Diffusion 是其中一款开源的大规模图像生成模型,它能够根据文本描述生成高质量的图像,支持从写实风格到卡通、幻想等各种不同的视觉效果。本文将深入介绍如何使用…...

es索引库操作和使用RestHignLevelClient客户端操作es
目录 es索引库操作 mapping映射操作 索引库的CURD操作 1.创建索引库和映射 编辑 2.查询索引库 3.删除索引库 4.修改索引库 5.总结 文档的CURD操作 1.新增文档 2.查询文档 3.删除文档 4.修改文档 全量修改 增量修改 5.总结 RestAPI 使用API例子 需要的数…...

安卓数据共享
在 Android 中,数据共享是指不同应用之间共享数据或同一应用不同组件之间共享数据的机制。SQLite 数据库、内容提供者(Content Provider)、共享偏好(Shared Preferences)和文件存储等方式可以实现数据共享。下面将详细…...

Gin框架操作指南02:JSON渲染
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南&#…...

【随手记】MySQL单表访问方法
在MySQL查询优化器中,单表访问方法(Access Method)指的是查询时数据库如何从一个表中访问所需的数据。不同的访问方法适用于不同的查询场景,主要包括 const、ref、ref_or_null、range、index 和 all。这些方法从效率上依次递减&am…...

机器学习:情感分析的原理、应用场景及优缺点介绍
一、情感分析算法概述 情感分析是自然语言处理中的一个重要任务,主要用于判断文本中所包含的情感倾向,如正面、负面或中性。 二、基于词典的情感分析算法 原理 词典构建:首先需要构建一个情感词典。这个词典包含了一系列带有情感倾向的词汇…...

基于SSM的医院药品管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

特征融合篇 | YOLOv10 引入动态上采样模块 | 超过了其他上采样器
本改进已集成到YOLOv8-Magic 框架 论文名称:《Learning to Upsample by Learning to Sample》 论文地址:https://arxiv.org/abs/2308.15085 代码地址:https://github.com/tiny-smart/dysample 我们提出了 DySample,一种超轻量级且有效的动态上采样器。尽管最近基于内核的…...

【Linux系列】写入文本到文件
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【踩坑随笔】Tensorflow-GPU训练踩坑
一个无语的坑,4060单卡训练,8G内存本来就不够,还没开始训练就已经爆内存了,但是居然正常跑完了训练,然后一推理发现结果就是一坨。。。往回翻日志才发现原来中间有异常。 首先解决第一个问题:Could not lo…...

【云岚到家】-day07-4-实战项目-优惠券活动-项目准备
【云岚到家-即刻体检】-day07-4-实战项目-优惠券活动-活动管理 1 模块需求分析1.1 业务流程1.2 界面原型1.3 业务模块 2 模块设计2.1 数据流2.2 表结构设计2.2.1 优惠券活动表设计2.2.2 优惠券表设计2.2.3 优惠券核销表2.2.4 优惠券退回表 2.3 创建数据库2.4 创建工程 1 模块需…...

axios的使用
在 Vue 项目中,封装 Axios 并实现加密、重复请求优化、请求取消、页面切换时取消未完成的请求、以及区分上传和下载操作是非常常见的需求。下面将逐一讲解这些需求的实现方式。 1. Axios 的基本封装 首先,我们可以将 Axios 封装到一个服务层中…...

Ubuntu 使用命令克隆和恢复SD卡
因为平常我需要做很多张开发板的出货卡,测试卡,那么我需要将备份下来文件,方便后续管理,这里时候需要用到Ubuntu上面的命令来克隆镜像和恢复镜像到SD卡上 先查询自己的SD卡是在sdx,以我的为例子,为sdb 备…...

Java 小游戏《超级马里奥》
文章目录 一、效果展示二、代码编写1. 素材准备2. 创建窗口类3. 创建常量类4. 创建动作类5. 创建关卡类6. 创建障碍物类7. 创建马里奥类8. 编写程序入口 一、效果展示 二、代码编写 1. 素材准备 首先创建一个基本的 java 项目,并将本游戏需要用到的图片素材 image…...

go语言defer详解
什么是defer?为什么需要defer?怎样合理使用defer?defer进阶 defer的底层原理是什么?利用defer原理defer命令的拆解defer语句的参数闭包是什么?defer配合recover后记参考资料 什么是defer? defer是Go语言提供的一种用…...

【C语言】循环中断break
在循环使用过程中,可能遇到某些情况需要终止循环。比如按座位查找一位学生,循环查找,找到时可以直接停止。后续的循环将不再执行。 break;只跳出一层循环 例子中的素数判断,查找到根号n停止:一个合数等于两个数的乘积…...

centos ping能通但是wget超时-解决
问题截图: 域名解析地址为IPV6地址,建议您调整IPV4优先级之后,再尝试访问,请参考Linux系统IPv4/IPv6双栈接入优先使用IPv4设置:移动云帮助中心 实操截图:...

SDIO - DWC MSHC 电压切换和频率切换
背景 我们的sdio访问sd card过去一直跑在低频上,HS50M。前段时间给eMMc添加了HS200模式,eMMc的总线模式定义是这样的: 可以看到1.8V的IO 电压可以支持所有模式,我们过去的芯片,由硬件部门放到evb上,其IO …...

EI-CLIP 深度理解 PPT
系列文章目录 文章目录 系列文章目录 在电子商务产品的跨模态检索中,电子商务图像和电子商务语言都有许多独特的特点。如图所示,一个电子商务产品图片通常只包含一个简单的场景,有一个或两个前景物体和一个普通的背景。同时,电子商…...

leetcode力扣刷题系列——【最小元素和最大元素的最小平均值】
题目 你有一个初始为空的浮点数数组 averages。另给你一个包含 n 个整数的数组 nums,其中 n 为偶数。 你需要重复以下步骤 n / 2 次: 从 nums 中移除 最小 的元素 minElement 和 最大 的元素 maxElement。 将 (minElement maxElement) / 2 加入到 aver…...

【线性回归分析】:基于实验数据的模型构建与可视化
目录 线性回归分析:基于实验数据的模型构建与可视化 1. 数据准备 2. 构建线性回归模型 3. 可视化 数据分析的核心 构建预测模型 应用场景 预测模型中的挑战 结论 线性回归分析:基于实验数据的模型构建与可视化 在数据分析领域,线性…...

CountUp.js 实现数字增长动画 Vue
效果: 官网介绍 1. 安装 npm install --save countup.js2. 基本使用 // template <span ref"number1Ref"></span>// script const number1Ref ref<HTMLElement>() onMounted(() > {new CountUp(number1Ref.value!, 9999999).sta…...