当前位置: 首页 > news >正文

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.界面实现效果 以下是具体的项目需要用到的效果展示&#xff0c;用于验证字母。 2.简介 自定义CaptchaMovableLabel&#xff0c;继承自QLabel类&#xff1a; 中间的4个字母&#xff0c;就是CaptchaMovableLabel类来实例化的对象。 主要功能如下&#xff1a; 1.显示字母&am…...

集合框架12:Set集合概述、Set接口使用

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

如何打开荣耀手机的调试模式?

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

Meta新模型Dualformer:融合快慢思维,推理能力媲美人脑

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

CDGA|数据治理:如何让传统行业实现数据智能

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

Spring源码5.2.9 编译踩坑

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

【前端】如何制作一个自己的网页(5)

上节课我们学习了以下知识&#xff1a; 1、网页中常见的文本元素&#xff0c;如标题元素与段落元素&#xff1b; 2、两个通用属性id与class&#xff1b; 3、元素的两种类型——块级元素与行内元素。 其实除了文本内容外&#xff0c;网页还可以包含图片、超链接等各类信息&a…...

Unity实战案例全解析 类宝可梦回合制的初级案例 源码分析(加了注释和流程图)

这是一个老教程了&#xff0c;但是对于没有写过回合制的初级程序同学来讲是比较适合的&#xff0c;也可以直接看源码&#xff0c;半小时内可以解决战斗 当然&#xff0c;我也没写过回合制系统所以就到处找&#xff0c;思路明白了就能自己修改了 视频教程 - 油管链接 Turn-Bas…...

AI绘图大模型 Stable Diffusion 使用详解

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

es索引库操作和使用RestHignLevelClient客户端操作es

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

安卓数据共享

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

Gin框架操作指南02:JSON渲染

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

【随手记】MySQL单表访问方法

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

机器学习:情感分析的原理、应用场景及优缺点介绍

一、情感分析算法概述 情感分析是自然语言处理中的一个重要任务&#xff0c;主要用于判断文本中所包含的情感倾向&#xff0c;如正面、负面或中性。 二、基于词典的情感分析算法 原理 词典构建&#xff1a;首先需要构建一个情感词典。这个词典包含了一系列带有情感倾向的词汇…...

基于SSM的医院药品管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

特征融合篇 | YOLOv10 引入动态上采样模块 | 超过了其他上采样器

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

【Linux系列】写入文本到文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【踩坑随笔】Tensorflow-GPU训练踩坑

一个无语的坑&#xff0c;4060单卡训练&#xff0c;8G内存本来就不够&#xff0c;还没开始训练就已经爆内存了&#xff0c;但是居然正常跑完了训练&#xff0c;然后一推理发现结果就是一坨。。。往回翻日志才发现原来中间有异常。 首先解决第一个问题&#xff1a;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 项目中&#xff0c;封装 Axios 并实现加密、重复请求优化、请求取消、页面切换时取消未完成的请求、以及区分上传和下载操作是非常常见的需求。下面将逐一讲解这些需求的实现方式。 1. Axios 的基本封装 首先&#xff0c;我们可以将 Axios 封装到一个服务层中&#xf…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...