project_serial_port

news2025/2/13 0:13:33

文章目录

  • 效果![在这里插入图片描述](https://img-blog.csdnimg.cn/77ab9856af714b06b69f2ca959dc8ea3.png)
  • 源码
    • widget.cpp
    • widget.h

效果在这里插入图片描述

源码

在这里插入图片描述

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    Init();
    tableWidgetInit();
    listWidgetInit();
}

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

void Widget::Init(void){

    resize(1130,660);
    setWindowTitle("serial_port");
    SendByte=0;ReceByte=0;
    serial = new QSerialPort(this);

    connect(serial,SIGNAL(readyRead()),this,SLOT(serialPort_readyRead()));
    connect(ui->btn_serial_scan,SIGNAL(clicked(bool)),this,SLOT(btn_serial_scan_clicked()));
    connect(ui->btn_serial_send,SIGNAL(clicked(bool)),this,SLOT(btn_serial_send_clicked()));
    connect(ui->btn_serial_open,SIGNAL(clicked(bool)),this,SLOT(btn_serial_open_clicked()));
    connect(ui->btn_tx_clear,SIGNAL(clicked(bool)),this,SLOT(btn_tx_clear_clicked()));
    connect(ui->btn_rx_clear,SIGNAL(clicked(bool)),this,SLOT(btn_rx_clear_clicked()));
    connect(ui->btn_file_save,SIGNAL(clicked(bool)),this,SLOT(btn_file_save_clicked()));
    connect(ui->btn_file_open,SIGNAL(clicked(bool)),this,SLOT(btn_file_open_clicked()));
    connect(ui->btn_counter_clear,SIGNAL(clicked(bool)),this,SLOT(btn_clear_counter_clicked()));

    connect(ui->chk_rx_tx,SIGNAL(clicked(bool)),this,SLOT(chk_rx_tx_clicked()));
    connect(ui->chk_rx_hex,SIGNAL(clicked(bool)),this,SLOT(chk_rx_hex_clicked()));
    connect(ui->chk_tx_tx,SIGNAL(clicked(bool)),this,SLOT(chk_tx_tx_clicked()));
    connect(ui->chk_tx_hex,SIGNAL(clicked(bool)),this,SLOT(chk_tx_hex_clicked()));
    connect(ui->chk_rx_pause,SIGNAL(clicked(bool)),this,SLOT(chk_rx_pause_clicked()));
    connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(on_lineEdit_ending()));

    portTime=0;
    Times = 0;
    lineEditData = 1000;

    timer = new QTimer;
    timer->start(1);
    connect(timer,SIGNAL(timeout()),this,SLOT(timerout_event()));


    ui->cmb_baud->setCurrentIndex(5);
    ui->cmb_databit->setCurrentIndex(3);
    ui->cmb_crcbit->setCurrentIndex(2);
    ui->cmb_stopbit->setCurrentIndex(0);

    ui->lineEdit->setText("1000");
    ui->chk_tx_tx->setCheckState(Qt::Checked);//勾选
    ui->chk_rx_tx->setCheckState(Qt::Checked);//勾选
    ui->btn_serial_send->setEnabled(false);//按钮是灰色的,不响应任何触发事件
    ui->chk_timer->setEnabled(false);//按钮是灰色的,不响应任何触发事件
}

//打开串口
void Widget::btn_serial_open_clicked()
{
    qDebug()<<"open serialport"<<endl;
    if(ui->btn_serial_open->text()==QString("打开串口"))
    {
        //设置串口名
        serial->setPortName(ui->cmb_serail->currentText());
        qDebug()<<ui->cmb_serail->currentText()<<endl;
        //设置波特率
        serial->setBaudRate(ui->cmb_baud->currentText().toInt());
        qDebug()<<ui->cmb_baud->currentText().toInt()<<endl;
        //设置数据位
        switch(ui->cmb_databit->currentText().toInt())
        {
        case 5:serial->setDataBits(QSerialPort::Data5);break;
        case 6:serial->setDataBits(QSerialPort::Data6);break;
        case 7:serial->setDataBits(QSerialPort::Data7);break;
        case 8:serial->setDataBits(QSerialPort::Data8);break;
        default:serial->setDataBits(QSerialPort::UnknownDataBits);break;
        }
        //设置奇偶校验位
        switch(ui->cmb_crcbit->currentIndex())
        {
        case 0:serial->setParity(QSerialPort::EvenParity);break;
        case 1:serial->setParity(QSerialPort::MarkParity);break;
        case 2:serial->setParity(QSerialPort::NoParity);break;
        case 3:serial->setParity(QSerialPort::OddParity);break;
        default:serial->setParity(QSerialPort::UnknownParity);break;
        }
        //设置停止位
        switch (ui->cmb_stopbit->currentIndex())
        {
        case 0:serial->setStopBits(QSerialPort::OneStop);break;
        case 1:serial->setStopBits(QSerialPort::OneAndHalfStop);break;
        case 2:serial->setStopBits(QSerialPort::TwoStop);break;
        default:serial->setStopBits(QSerialPort::UnknownStopBits);break;
        }
        //设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);

        //打开串口
        if(!serial->open(QIODevice::ReadWrite))
        {
            QMessageBox::about(NULL,"提示","无法打开串口");
            return;
        }
        //下拉控件失能
        ui->cmb_serail->setEnabled(false);
        ui->cmb_baud->setEnabled(false);
        ui->cmb_databit->setEnabled(false);
        ui->cmb_crcbit->setEnabled(false);
        ui->cmb_stopbit->setEnabled(false);
        ui->btn_serial_scan->setEnabled(false);

        ui->chk_timer->setEnabled(true);
        ui->btn_serial_open->setText(tr("关闭串口"));
        ui->btn_serial_send->setEnabled(true);
    }
    else
    {
        //关闭串口
        serial->close();
        //下拉按键使能
        ui->cmb_serail->setEnabled(true);
        ui->cmb_baud->setEnabled(true);
        ui->cmb_databit->setEnabled(true);
        ui->cmb_crcbit->setEnabled(true);
        ui->cmb_stopbit->setEnabled(true);
        ui->btn_serial_scan->setEnabled(true);

        ui->chk_timer->setEnabled(false);
        ui->btn_serial_open->setText(tr("打开串口"));
        //发送失能
        ui->btn_serial_send->setEnabled(false);
    }
}


//串口扫描
void Widget::btn_serial_scan_clicked(){
    int i,n;
    qDebug()<<"btn_serial_scan_clicked"<<endl;
     ui->cmb_serail->clear();
     portStringLine.clear();
     foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
         portStringLine +=info.portName();
     n=portStringLine.size();
     for(i=0;i<n;i++)
     {
         serial->setPortName(portStringLine[i]);
         if(!serial->open(QIODevice::ReadWrite))
         {
             portStringLine[i]+="(不可用)";
             QVariant v(0);          //禁用
             ui->cmb_serail->setItemData(1, v, Qt::UserRole - 1);
         }
         else
         {
             QVariant v(1|32);       //可用
             ui->cmb_serail->setItemData(1, v, Qt::UserRole - 1);
         }
         serial->close();
     }
     ui->cmb_serail->addItems(portStringLine);
}

//串口接收
void Widget::serialPort_readyRead()
{
    int i,length;
    QString lasttext;
    if(ui->chk_rx_pause->checkState()!=Qt::Checked)
    {
        lasttext=ui->tx_rev->toPlainText();
        Receivetext = serial->readAll();
        ReceByte+=Receivetext.length();
        ui->label_rx->setText(QString::number(ReceByte));
        if(ui->chk_rx_pause->checkState()==Qt::Checked)
        {
            Receivetext=Receivetext.toLatin1().toHex();     //字符串转十六进制
            length=Receivetext.length();
            for(i=0;i<=length/2;i++)
            {
                Receivetext.insert((2+3*i),' ');            //插入空格字符串
            }
        }
        else
            Receivetext=Receivetext.toLatin1();
        lasttext=lasttext.append(Receivetext);
        ui->tx_rev->setText(lasttext);
    }
}

//定时事件,1ms
void Widget::timerout_event(){
    int t=500;                                                  //扫描串口时间
   Times++;portTime++;
   if(Times>=lineEditData)                                     //定时发送
   {
       if(ui->chk_timer->checkState()==Qt::Checked)
           Widget::btn_serial_send_clicked();
       Times=0;
   }
   if(portTime==t)                                             //定时扫描串口
   {
       QStringList newPortStringList;
       newPortStringList.clear();
       foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
           newPortStringList += info.portName();
       if(newPortStringList.size() != portStringLine.size())
       {
           portStringLine = newPortStringList;
           ui->cmb_serail->clear();
           ui->cmb_serail->addItems(portStringLine);
       }
       portTime=0;
   }
}

//串口发送
void Widget::btn_serial_send_clicked()
{
    QByteArray bytearray;
    Sendtext=ui->tx_send->toPlainText();
    if(ui->chk_tx_wrap->checkState()==Qt::Checked)
        Sendtext += '\n';
    if(ui->chk_tx_hex->checkState()!=Qt::Checked)
        bytearray = Sendtext.toLatin1();
    else
        bytearray = QByteArray::fromHex(Sendtext.toUtf8());     //十六进制转字符串
    serial->write(bytearray);
    //定长发送
    //serial->write((const char *)param_data,16);
    SendByte+=Sendtext.length();
    ui->label_tx->setText(QString::number(SendByte));
    ui->tx_send->moveCursor(QTextCursor::End);
}

//清空计数
void Widget::btn_clear_counter_clicked(){
    qDebug()<<"btn_clear_counter_clicked"<<endl;
    SendByte = 0;
    ReceByte = 0;
    ui->label_tx->setText(QString::number(SendByte));
    ui->label_rx->setText(QString::number(ReceByte));
}

//清空接收区
void Widget::btn_rx_clear_clicked(){
    qDebug()<<"btn_rx_clear_clicked"<<endl;
    ui->tx_rev->clear();
}

//清空发送区
void Widget::btn_tx_clear_clicked(){
     qDebug()<<"btn_tx_clear_clicked"<<endl;
    ui->tx_send->clear();
}

//文本进制接收
void Widget::chk_rx_tx_clicked(){
    ui->chk_rx_tx->setCheckState(Qt::Checked);
    ui->chk_rx_hex->setCheckState(Qt::Unchecked);
    ui->chk_rx_pause->setCheckState(Qt::Unchecked);
}

//hex进制接收
void Widget::chk_rx_hex_clicked(){
    ui->chk_rx_tx->setCheckState(Qt::Unchecked);
    ui->chk_rx_hex->setCheckState(Qt::Checked);
    ui->chk_rx_pause->setCheckState(Qt::Unchecked);
}

//暂停接收
void Widget::chk_rx_pause_clicked()
{
    qDebug()<<"chk_rx_pause_clicked"<<endl;
    ui->chk_rx_tx->setCheckState(Qt::Unchecked);
    ui->chk_rx_hex->setCheckState(Qt::Unchecked);
    ui->chk_rx_pause->setCheckState(Qt::Checked);
}

//文本形式发送
void Widget::chk_tx_tx_clicked(){
    ui->chk_tx_tx->setCheckState(Qt::Checked);
    ui->chk_tx_hex->setCheckState(Qt::Unchecked);
}

//hex进制发送
void Widget::chk_tx_hex_clicked(){
    ui->chk_tx_tx->setCheckState(Qt::Unchecked);
    ui->chk_tx_hex->setCheckState(Qt::Checked);
}

//打开文件
void Widget::btn_file_open_clicked(){
    QString fileName = QFileDialog::getOpenFileName(this);
    QFile file(fileName); //新建QFile对象
    if(!file.open((QFile::ReadOnly|QFile::Text)))
    {
     QMessageBox::warning(this,tr("多文档编辑器"),
                  tr("无法读取文件 %1:\n%2").arg(fileName,file.errorString()));
    }
    QTextStream in(&file);//新建文本流对象
    // 鼠标指针变为等待状态
    QApplication::setOverrideCursor(Qt::WaitCursor);
    //读取文件的全部文本内容,并添加到编辑器中
    ui->tx_send->setPlainText(in.readAll());
    //鼠标指针恢复为原来状态
    QApplication::restoreOverrideCursor();
    ui->tx_rev->setVisible(true);
}

//保存文件
void Widget::btn_file_save_clicked(){
    QString fileName = QFileDialog::getSaveFileName(this);

    QFile file(fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text))
    {
        // %1和%2分别对应后面arg两个参数,/n起换行的作用
        QMessageBox::warning(this, tr("多文档编辑器"),
                    tr("无法写入文件 %1:/n %2")
                   .arg(fileName, file.errorString()));
    }
    QTextStream out(&file);
    // 鼠标指针变为等待状态
    QApplication::setOverrideCursor(Qt::WaitCursor);
    out << ui->tx_rev->toPlainText();
    // 鼠标指针恢复原来的状态
    QApplication::restoreOverrideCursor();
}

//输入定时时间
void Widget::on_lineEdit_ending()
{
    if(ui->lineEdit->text().toInt()>0)
        lineEditData=ui->lineEdit->text().toInt();
    qDebug()<<ui->lineEdit->text()<<endl;
}

//窗体大小事件
void Widget::resizeEvent(QResizeEvent *event){
        qDebug()<<"old:"<<event->oldSize()<<endl;
        qDebug()<<"new:"<<event->size()<<endl;
}


//tablewidget 初始化
void Widget::tableWidgetInit(){
    int i,j;

     ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//设置每一行最后一个单元格不留空格
     ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//设置自适应大小
     ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置等宽

     //设置表格中每一行的内容
     row_count = ui->tableWidget->rowCount();
     column_count = ui->tableWidget->columnCount();
     qDebug()<<"row"<<row_count<<"column"<<column_count;
     for( i=0;i<row_count;i++)
     {
        for( j=0;j<column_count;j++)
        {
            ui->tableWidget->setItem(i,j,new QTableWidgetItem(QString::number(j)));
        }
     }

     //打印表格数据
     //遍历数据
     QTableWidgetItem* item;
     QString str;
     for(int i = 0; i < ui->tableWidget->rowCount(); i++){
         for(int j = 0; j < ui->tableWidget->columnCount(); j++){
             item = ui->tableWidget->item(i, j);
             str = str + item->text() + " ";
         }
     }
     qDebug()<<"str = "<<str;

    // 返回鼠标单击的所在单元格的row和col
    connect(ui->tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(show_prodcut_sets(int,int)));
    connect(ui->tableWidget->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),SLOT(doProcessSelLine(void)));
}

//单击某个单元格
void Widget::show_prodcut_sets(int row,int col)
{

    QString str;
    qDebug() << "所点击的单元格的row=" << row << ",col=" << col;
    // 获取所点击的单元格
    QTableWidgetItem* item = ui->tableWidget->item(row ,col);
        qDebug() <<"内容为:"<< item->text();
}

//选中某一列
void Widget::doProcessSelLine(){
    int current_column;
    QString str;
    QTableWidgetItem* item;

    current_column = ui->tableWidget->currentColumn();//获取当前行号

    //打印行内容
    for(int j = 0; j < ui->tableWidget->columnCount(); j++){
        item = ui->tableWidget->item(current_column, j);
        str = str + item->text() + " ";
    }
    qDebug()<<str<<endl;
}

void Widget::listWidgetInit(){

    mylistWidget = ui->listWidget;
    // 点击列表时,当前选中的项
    connect(ui->listWidget,&QListWidget::itemClicked,this,  &Widget::SLOT_ListWidget_ItemClicked);
}

void Widget::SLOT_ListWidget_ItemClicked(QListWidgetItem* item)
{
    qDebug() << item->text();
    QString text;
    text = item->text();

    if((text)=="连接")
    {
        qDebug()<<111111<<endl;
    }
}




widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtSerialPort>
#include <QtSerialPortVersion>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QFileDialog>
#include <QTimer>
#include <QStringList>
#include <QMouseEvent>
#include <QListWidget>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    int Times,portTime,lineEditData;
private:
    Ui::Widget *ui;
private:
    void Init(void);
    QSerialPort *serial;                    //串口端口
    QTimer *timer;                          //定时器
    QString Sendtext,Receivetext;           //发送、接收缓存区
    long int SendByte,ReceByte;             //发送、接收字符数
    QStringList portStringLine;             //端口链表

    int row_count,column_count;
    QListWidget *mylistWidget;
    void tableWidgetInit(void);
    void listWidgetInit(void);

private slots:
    void serialPort_readyRead();            //串口接收
    void timerout_event();                  //定时发送、更新串口
    void btn_serial_scan_clicked();         //扫描串口
    void btn_serial_send_clicked();         //串口发送
    void btn_serial_open_clicked();         //打开串口
    void btn_clear_counter_clicked();       //清空计数
    void btn_tx_clear_clicked();            //清空发送区
    void btn_rx_clear_clicked();            //清空接收区
    void btn_file_save_clicked();           //保存文件
    void btn_file_open_clicked();           //文件打开
    void chk_rx_tx_clicked();               //文本方式接收
    void chk_rx_hex_clicked();              //hex方式接收
    void chk_tx_tx_clicked();               //文本方式发送
    void chk_tx_hex_clicked();              //hex方式发送
    void chk_rx_pause_clicked();            //暂停接收
    void on_lineEdit_ending();              //输入定时时间

    void show_prodcut_sets(int,int);        //选择单元格
    void doProcessSelLine(void);            //选择行

    void SLOT_ListWidget_ItemClicked(QListWidgetItem *item);        //选中列表


protected:
    void resizeEvent(QResizeEvent *event);
};

#endif // WIDGET_H


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

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

相关文章

Java学习内容有什么?这篇全是干货

Java 是目前应用非常广泛的一种计算机高级编程语言&#xff0c;它是一种计算机程序设计语言&#xff0c;被广泛应用于各大行业和领域&#xff0c;如金融、汽车、医疗、电子、互联网等等。Java 诞生之后风靡全球&#xff0c;并且一直保持其高人气&#xff0c;因此 Java 的学习也…

自动清洁离子风机一般具有什么特点?

自动清洁离子风机是一种能够自动清洁空气中的离子&#xff0c;并同时进行空气净化的设备。它采用先进的离子生成技术&#xff0c;可以释放负离子并吸附空气中的污染物&#xff0c;如细菌、病毒、灰尘、花粉等&#xff0c;将它们沉积在设备表面。当设备侦测到需要清洁时&#xf…

那些年的Xposed开发经验记录

把之前写的Xposed相关文章合并到一块&#xff0c;方便查阅 目录 多进程App的Hook问题XposedHelper中的静态变量demo的AndroidManifest.xml的测试核心代码结论限制handleLoadPackage被单个进程多次执行的问题 多dex Hook问题为应用增加权限利用Xposed删除权限参考 Hook框架集锦…

《漫画算法:小灰的算法之旅》——赠书活动

我想应该有很多人对我今天推荐的书籍不陌生&#xff0c;《漫画算法&#xff1a;小灰的算法之旅》已经是圈内人熟知的“红人”了&#xff0c;但也存在不断有新人入坑&#xff0c;这里就好好介绍一下这本包上“糖衣”的算法“炮弹”吧&#xff0c;整个过程如同本书形象“Q弾可爱&…

热成像技术创新,助力人工智能炼就黑夜中的火眼金睛

原创 | 文 BFT机器人 普渡大学&#xff08;Purdue University&#xff09;的研究人员利用他们正在申请专利的方法来改进传统的机器视觉和感知&#xff0c;从而推动机器人技术和自动控制领域的发展。 埃尔莫尔家族电气与计算机工程学院&#xff08;Elmore Family School of Ele…

Git使用教程(看完会了也懂了)

本文简单的记录一下Git的一些基本的概念和基础的操作&#xff0c;主要是弄懂基本的东西&#xff0c;能够快速的上手并开始使用&#xff1b;但是更多深层的原理和应用还是需要另外去进一步学习的。 创建版本库 我们先整一个git仓库&#xff0c;再来看看基本概念&#xff1b; 新…

免费插件-illustrator-Ai插件-印刷功能-二维码生成

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.示例5.1.QR常用二维码5.2.PDF4175.3.EAN13 6.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行二维码生成。首先从下载网址下载这款插件 https://download.csd…

国际顶级学术会议ISSTA召开,中山大学与微众银行联合发表区块链最新研究成果

美国当地时间7月17日&#xff0c;软件工程领域顶级会议ISSTA 2023在西雅图正式召开。ISSTA &#xff08;The 32nd ACM SIGSOFT International Symposium on Software Testing and Analysis &#xff09;是软件测试与分析方面最著名的国际会议之一&#xff0c;也是中国计算机学会…

中国钢铁工业协会 :2022年钢铁行业经济运行报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 2022年&#xff0c;我国粗钢产量10.18亿吨&#xff0c;比上年下降1.7%&#xff0c;连续两年下降&#xff0c;降幅比上年收窄。2022年&#xff0c;出口钢材 6732万吃&#xff0c;比上年增长0.9%;进口钢…

RabbitMQ:可靠消息传递的强大消息中间件

消息中间件在现代分布式系统中起着关键作用&#xff0c;它们提供了一种可靠且高效的方法来进行异步通信和解耦。在这篇博客中&#xff0c;我们将重点介绍 RabbitMQ&#xff0c;一个广泛使用的开源消息中间件。我们将深入探讨 RabbitMQ 的特性、工作原理以及如何在应用程序中使用…

javaScript:文档流写入和元素写入

目录 前言 文档流写入 把元素直接写入到文档流 注意​编辑 注意 元素写入 注意 innerHTML 特点&#xff1a; 设置内容 获取内容 innerText 特点&#xff1a; 注意 相关代码 前言 在JavaScript中&#xff0c;文档流写入是指将内容直接写入到DOM&#xff08;文档对…

用户生成内容(UGC)与海外网红营销:激活品牌传播的力量

互联网和社交媒体的迅速发展为品牌营销带来了前所未有的机遇。用户生成内容&#xff08;UGC&#xff09;是指由普通用户自发创作、分享和发布的各种内容&#xff0c;而海外网红是指在海外社交平台上拥有大量粉丝和影响力的人物。这两者结合&#xff0c;为品牌传播带来了强大的推…

【C++11】类的新功能 | 可变参数模板

文章目录 一.类的新功能1.默认成员函数2.类成员变量初始化3.强制生成默认函数的关键字default4.禁止生成默认函数的关键字delete5.继承和多态中final与override关键字 二.可变参数模板1.可变参数模板的概念2.可变参数模板的定义方式3.参数包的展开方式①递归展开参数包②逗号表…

虚拟展览馆有哪些优势?如何打造自己的虚拟展览馆

引言&#xff1a; 随着科技的不断创新与发展&#xff0c;虚拟展览馆作为一种全新的文化体验方式&#xff0c;正逐渐引起人们的关注。虚拟展览馆以其便捷、创新、可定制的特点&#xff0c;为参观者提供了前所未有的沉浸式体验。 一&#xff0e;什么是虚拟展览馆&#xff1f; 虚…

MongoDB【无敌详细,建议收藏】

"探索MongoDB的无边之境&#xff1a;沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界&#xff01;在这个博客中&#xff0c;我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者&#xff0c;MongoDB都将为您带来一场令人心动…

修改element-plus主题色

修改element-plus主题色 前提&#xff1a;要安装按需引入和自动导入插件 ​npm install -D unplugin-vue-components unplugin-auto-import文章目录 修改element-plus主题色一、安装插件二、新建一个element的覆盖scss文件三、配置 一、安装插件 npm install -D unplugin-vu…

重启服务器引发的Docker异常

公司使用云服务器需要硬盘扩容&#xff0c;服务器重启才生效。 重启以后发现拉取远程镜像的命令登录失败了&#xff01; 然后发现找不到容器和镜像列表了&#xff0c;但是容器都启动了。 查看docker运行状态都是正常的 systemctl is-active docker systemctl status docker.…

原生JS手写扫雷小游戏

场景 实现一个完整的扫雷游戏需要一些复杂的逻辑和界面交互。我将为你提供一个简化版的扫雷游戏示例&#xff0c;帮助你入门。请注意&#xff0c;这只是一个基本示例&#xff0c;你可以根据自己的需求进行扩展和改进。 思路 创建游戏板&#xff08;Grid&#xff09;&#xff1…

Vue [Day7] 综合案例

核心概念回顾 state&#xff1a;提供数据 getters&#xff1a;提供与state相关的计算属性 mutations&#xff1a;提供方法&#xff0c;用于修改state actions&#xff1a;存放异步操作 modules&#xff1a;存模块 功能分析 https://www.npmjs.com/package/json-server#ge…

企业运单管理教程

随着电子面单的普及&#xff0c;以及商务寄件稳步增加&#xff0c;快递公司为了留住商企客户&#xff0c;推出了月结协议模式寄件。企业可以根据寄件量大小&#xff0c;和快递公司签订月结协议&#xff0c;运费每月结算一次&#xff0c;还能根据自身的寄件量&#xff0c;向快递…