QT-自定义参数设计框架软件

QT-自定义参数设计框架软件

  • 前言
  • 一、演示效果
  • 二、使用步骤
    • 1.应用进行参数注册
    • 2.数据库操作单例对象
    • 3.参数操作单例对象
  • 三、下载链接


前言

常用本地数据参数通常使用的是xml等文本的格式,进行本地的数据参数的存储。这种参数的保存方式有个致命的一点,就是可以存在参数的丢失。特别是在软件异常退出的情况下发生。
针对此等情况,我们现在使用的是sqllite的本地存储方式进行设计,并且尽量将参数的格式通用化。

一、演示效果

请添加图片描述

二、使用步骤

1.应用进行参数注册

代码如下:

void QSettingTools::registerParams()
{if (1){QString strGroupName = u8"用户参数";cParamOperator::getInstance()->registerQString(strGroupName, "User", "sa", QString(u8"用户名称"));cParamOperator::getInstance()->registerQString(strGroupName, "Passord", "123456", QString(u8"用户密码"));cParamOperator::getInstance()->registerInt(strGroupName, "Index", 0, 0, 10000, QString(u8"序号"));cParamOperator::getInstance()->registerFloat(strGroupName, "Time", 1.5, 0, 10000, QString(u8"时间,单位秒"));}if (1){QString strGroupName = u8"系统参数";cParamOperator::getInstance()->registerQString(strGroupName, "FactoryId", "123433ad", QString(u8"工厂ID"));}cParamOperator::getInstance()->autoRemoveInvialParams();}

2.数据库操作单例对象

代码如下:

#include "ParamOperator.h"
#include "SqlLiteDatabase.h"
#include <QFile>
#include <QMutex>
#include <QXmlStreamWriter>
#include <QDebug>
#include <QCoreApplication>
#include <QDomDocument>
#include <QApplication>cParamOperator g_userParam;     // 用户参数struct cAppBaserData
{QHash<QString, QString> strScrTranHash;
};cParamOperator::cParamOperator(): d_ptr(new cParamManagerData)
{m_strConfig = "Setting.db";
}cParamOperator::~cParamOperator()
{delete d_ptr;d_ptr = nullptr;
}// 获取一个实例
cParamOperator *cParamOperator::getInstance()
{static cParamOperator manager;return &manager;
}// 设置app安装目录
void cParamOperator::setAppExePath(QString strPath)
{m_strAppExePath = strPath;cSqlLiteDatabase::getInstance()->setAppExePath(strPath);initialParams();
}// 注册整形参数
void cParamOperator::registerInt(QString strGroup, QString strName, int nMin, int nSet, int nMax, QString strDescribe)
{sParamItem_t paramItem;                                           paramItem.strGroupName = strGroup;paramItem.strParamType = PARAM_TYPE_INT;      paramItem.strName = strName;paramItem.strDescribe = strDescribe;paramItem.minVal = nMin;paramItem.setVal = nSet;paramItem.maxVal = nMax;registerParam(paramItem);
}// 注册浮点型参数
void cParamOperator::registerFloat(QString strGroup, QString strName, float fMin, float fSet, float fMax, QString strDescribe)
{sParamItem_t paramItem;paramItem.strGroupName = strGroup;paramItem.strParamType = PARAM_TYPE_FLOAT;paramItem.strName = strName;paramItem.strDescribe = strDescribe;paramItem.minVal = fMin;paramItem.setVal = fSet;paramItem.maxVal = fMax;registerParam(paramItem);
}// 注册字符串参数
void cParamOperator::registerQString(QString strGroup, QString strName, QString strSet, QString strDescribe)
{sParamItem_t paramItem;paramItem.strGroupName = strGroup;paramItem.strParamType = PARAM_TYPE_STRING;paramItem.strName = strName;paramItem.strDescribe = strDescribe;paramItem.minVal = "";paramItem.setVal = strSet;paramItem.maxVal = "";registerParam(paramItem);
}// 修改参数值
void cParamOperator::setParam(QString strName, QVariant var)
{auto pParam = getParam(strName);if (pParam != nullptr){pParam->setVal = var;g_userParam.updateParam(*pParam);}
}// 获取整数
int cParamOperator::getParamInt(QString strName)
{auto param = getParam(strName);if (param != nullptr){return param->setVal.toInt();}return -12345;
}// 获取浮点数
float cParamOperator::getParamFloat(QString strName)
{auto param = getParam(strName);if (param != nullptr){return param->setVal.toFloat();}return -12345;
}// 获取字符串
QString cParamOperator::getParamString(QString strName)
{auto param = getParam(strName);if (param != nullptr){return param->setVal.toString();}return "Error";
}// 获取参数组名链表
QStringList cParamOperator::getGroupNameList()
{QStringList strNameList;auto paramList = params();for (size_t i = 0; i < paramList->size(); i++){auto item = paramList->at(i);if (!strNameList.contains(item.strGroupName)){strNameList << item.strGroupName;}}return strNameList;
}// 获取某个组的所有参数
QVector<sParamItem_t> cParamOperator::getGroupParam(QString strGroupName)
{QVector<sParamItem_t> list;auto paramList = params();for (size_t i = 0; i < paramList->size(); i++){auto item = paramList->at(i);if (item.strGroupName == strGroupName){list << item;}}return list;
}// 初始化一个参数,插入内存中
int cParamOperator::initialParamItem(sParamItem_t &param)
{// 注册过的就直接返回就行了if (d_ptr->mapName.contains(param.strName))return d_ptr->mapName.value(param.strName);// 链表没有,插入链表记录auto index = d_ptr->vecParam.count();d_ptr->vecParam.append(param);d_ptr->mapName.insert(param.strName, index);// 如果有组名,直接插入到组名对应得链表里面if (d_ptr->mapGroup.contains(param.strGroupName)){for (auto iter = d_ptr->mapGroup.begin(); iter != d_ptr->mapGroup.end(); iter++){if (iter.key() == param.strGroupName){iter.value().insert(param.strName, index);break;}}}else{// 重新建立一个组名链表QHash<QString, int> groupItem;groupItem.insert(param.strName, index);d_ptr->mapGroup.insert(param.strGroupName, groupItem);}return index;
}// 刷新参数
bool cParamOperator::updateParam(sParamItem_t &param, bool bUpdateAll)
{bool bRet = false;if (!param.strName.isEmpty()){if (bUpdateAll){// 整个项都更新cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagSetVal, param.setVal.toString());cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagGroupName, param.strGroupName);cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagType, param.strParamType);cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagMinVal, param.minVal.toString());cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagMaxVal, param.maxVal.toString());}else{cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagSetVal, param.setVal.toString());}}return bRet;
}// 通过参数名获取参数
sParamItem_t *cParamOperator::getParam(QString strName)
{return getParam(d_ptr->mapName.value(strName, -1));
}// 通过索引获取参数
sParamItem_t *cParamOperator::getParam(int nIndex)
{if (nIndex >= 0 && nIndex < d_ptr->vecParam.count())return &d_ptr->vecParam[nIndex];return nullptr;
}// 所有的参数
QVector<sParamItem_t>* cParamOperator::params()
{return &d_ptr->vecParam;
}// 删除参数
bool cParamOperator::removeParam(QString strName)
{for (int i = 0; i < d_ptr->vecParam.size(); i++){if (d_ptr->vecParam[i].strName == strName){d_ptr->vecParam.removeAt(i);break;}}return cSqlLiteDatabase::getInstance()->remove(m_strTableName, g_strTagName, strName);
}// 注册参数
int cParamOperator::registerParam(sParamItem_t &param)
{// 缓存起来if (!m_strResisterNameList.contains(param.strName))m_strResisterNameList << param.strName;// 注册过,组名不同得话就重新修改所属得组名,如果没有就直接返回if (d_ptr->mapName.contains(param.strName)){auto paramTemp = getParam(param.strName);// 如果组名不同,就换新注册得组名if (paramTemp->strGroupName != param.strGroupName){auto itGroup = d_ptr->mapGroup.find(paramTemp->strGroupName);if (itGroup != d_ptr->mapGroup.end()){// 删掉旧的,再插入新得auto qTempHash = itGroup.value();d_ptr->mapGroup.erase(itGroup);d_ptr->mapGroup.insert(param.strGroupName, qTempHash);}// 更新为最新注册得paramTemp->strGroupName = param.strGroupName;cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagGroupName, param.strGroupName);}cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagMinVal, param.minVal.toString());cSqlLiteDatabase::getInstance()->update(d_ptr->strTableName, g_strTagName, param.strName, g_strTagMaxVal, param.maxVal.toString());auto pItem = getParam(param.strName);if (pItem != nullptr){pItem->strDescribe = param.strDescribe;pItem->minVal = param.minVal;pItem->maxVal = param.maxVal;if (pItem->strDescribe.indexOf("《****")!= -1){param.strRemarks = "";}pItem->strRemarks = param.strRemarks;}return d_ptr->mapName.value(param.strName);}// 链表没有,插入链表记录auto index = d_ptr->vecParam.count();d_ptr->vecParam.append(param);d_ptr->mapName.insert(param.strName, index);QHash<QString, QString> itemHash;// 同时插入数据表itemHash.insert(g_strTagGroupName, param.strGroupName);itemHash.insert(g_strTagType, param.strParamType);itemHash.insert(g_strTagName, param.strName);itemHash.insert(g_strTagSetVal, param.setVal.toString());itemHash.insert(g_strTagMinVal, param.minVal.toString());itemHash.insert(g_strTagMaxVal, param.maxVal.toString());itemHash.insert(g_strTagDescribe, param.strDescribe);cSqlLiteDatabase::getInstance()->insert(d_ptr->strTableName,itemHash);// 如果有组名,直接插入到组名对应得链表里面if (d_ptr->mapGroup.contains(param.strGroupName)){for (auto iter = d_ptr->mapGroup.begin(); iter != d_ptr->mapGroup.end(); iter++){if (iter.key() == param.strGroupName){iter.value().insert(param.strName, index);break;}}}else{// 重新建立一个组名链表QHash<QString, int> groupItem;groupItem.insert(param.strName, index);d_ptr->mapGroup.insert(param.strGroupName, groupItem);}return index;
}// 全部注册后,删除无效参数(注意:所有的参数要全部注册完成后调用)
void cParamOperator::autoRemoveInvialParams()
{for (auto itSqlName:m_strSqlParamNameList){// 如果程序注册的链表不存在就需要删除数据库的参数if (!m_strResisterNameList.contains(itSqlName)){removeParam(itSqlName);}}// 重新排序,按注册顺序显示QVector<sParamItem_t> tempAllParam = d_ptr->vecParam;d_ptr->vecParam.clear();d_ptr->mapName.clear();d_ptr->mapGroup.clear();for (auto itRegister:m_strResisterNameList){for (auto& itFind : tempAllParam){if (itFind.strName == itRegister){initialParamItem(itFind);break;}}}}// 初始化数据参数
int cParamOperator::initialParams(QString strTableName)
{if (strTableName.isEmpty())return -1;// 先打开数据库cSqlLiteDatabase::getInstance()->openDb(m_strConfig);m_strTableName = strTableName;static QMutex mutex;mutex.lock();// 创建数据库表QStringList strList;strList << g_strTagGroupName << g_strTagType<< g_strTagName << g_strTagSetVal<< g_strTagMinVal << g_strTagMaxVal<< g_strTagDescribe  << g_strTagIsTemp;d_ptr->strTableName = strTableName;cSqlLiteDatabase::getInstance()->createTable(strTableName, strList);// 查找数据库表的所有参数auto dataHashList = cSqlLiteDatabase::getInstance()->select(strTableName);for (int i = 0; i < dataHashList.size(); i++){auto hash = dataHashList[i];sParamItem_t paramItem;paramItem.strGroupName = hash.find(g_strTagGroupName) != hash.end() ? hash.find(g_strTagGroupName).value() : "";paramItem.strParamType = hash.find(g_strTagType) != hash.end() ? hash.find(g_strTagType).value() : "";paramItem.strName = hash.find(g_strTagName) != hash.end() ? hash.find(g_strTagName).value() : "";paramItem.setVal = hash.find(g_strTagSetVal) != hash.end() ? hash.find(g_strTagSetVal).value() : "";paramItem.minVal = hash.find(g_strTagMinVal) != hash.end() ? hash.find(g_strTagMinVal).value() : "";paramItem.maxVal = hash.find(g_strTagMaxVal) != hash.end() ? hash.find(g_strTagMaxVal).value() : "";paramItem.strDescribe = hash.find(g_strTagDescribe) != hash.end() ? hash.find(g_strTagDescribe).value() : "";// 缓存数据库的参数名称if (!m_strSqlParamNameList.contains(paramItem.strName))m_strSqlParamNameList << paramItem.strName;initialParamItem(paramItem);}mutex.unlock();return 0;
}

3.参数操作单例对象

代码如下:

#include "SqlLiteDatabase.h"
#include <QDir>
#include <QDateTime>
#include <QApplication>cSqlLiteDatabase::cSqlLiteDatabase(QObject *parent): QObject(parent)
{}cSqlLiteDatabase::~cSqlLiteDatabase()
{closeDb();
}// 设置appExe安装目录
void cSqlLiteDatabase::setAppExePath(QString strPath)
{m_strExePath = strPath;createDir();
}// 获取实例
cSqlLiteDatabase *cSqlLiteDatabase::getInstance()
{static cSqlLiteDatabase obj;return &obj;
}// 创建配置文件夹
void cSqlLiteDatabase::createDir()
{QDir dir;m_strConfigPath = m_strExePath + QString("/Config");if (!dir.exists(m_strConfigPath))dir.mkpath(m_strConfigPath);m_strDbDirPath = m_strConfigPath;
}// 打开数据库
QSqlDatabase cSqlLiteDatabase::openDb(QString strDatabaseName, QString strDbDirPath)
{if (!strDbDirPath.isEmpty())m_strDbDirPath = strDbDirPath;m_strDatabaseName = strDatabaseName;QSqlDatabase db;if (QSqlDatabase::contains(m_strDatabaseName))db = QSqlDatabase::database(m_strDatabaseName);else{QString strTempName = m_strDbDirPath + "/"+strDatabaseName;db = QSqlDatabase::addDatabase("QSQLITE", m_strDatabaseName);db.setDatabaseName(strTempName);db.setPassword("8888");db.setHostName("root");db.setUserName("root");}if (!db.open())qDebug() << db.lastError().text();elsem_bConnected = true;return db;}// 关闭数据库
bool cSqlLiteDatabase::closeDb()
{QSqlDatabase::removeDatabase(m_strDatabaseName);return true;
}// 创建表
bool cSqlLiteDatabase::createTable(QString strTableName, QStringList strHeaderNameList)
{bool bRet = true;if (true){if (strTableName.isEmpty() || strHeaderNameList.size() <= 0){bRet = false;return bRet;}auto findItem = m_strTableNameHeaderHash.find(strTableName);if (findItem == m_strTableNameHeaderHash.end())m_strTableNameHeaderHash.insert(strTableName, strHeaderNameList);QString strCreateTable = QString(u8"CREATE TABLE %1(").arg(strTableName);for (int i = 0; i < strHeaderNameList.size(); i++){if (i < (strHeaderNameList.size() - 1))strCreateTable = strCreateTable + strHeaderNameList[i] + QString(u8" VARCHAR(256)") + QString(",");elsestrCreateTable = strCreateTable + strHeaderNameList[i] + QString(u8" VARCHAR(256)") + QString(")");}bRet = excute(strCreateTable);}return bRet;
}// 删除表
bool cSqlLiteDatabase::dropTable(QString strTableName)
{if (strTableName.isEmpty())return false;QString strDrop = QString("DROP TABLE %1").arg(strTableName);return excute(strDrop);
}// 执行sql语句
bool cSqlLiteDatabase::excute(QString strSql)
{static QMutex mutex;mutex.lock();bool bRet = true;QSqlDatabase db = openDb(m_strDatabaseName);QString strConnectionName = db.connectionName();QSqlQuery query(db);query.prepare(strSql);bool success = query.exec(strSql);if (!success){qDebug() << "Error:" << query.lastError();bRet = false;}closeDb();mutex.unlock();return bRet;
}// 查找
QList<QStringList> cSqlLiteDatabase::seach(QString strTableName, QString strSql)
{QList<QStringList> temp;QSqlDatabase db = openDb(m_strDatabaseName);QString strConnectionName = db.connectionName();db.transaction(); // 开启事务查询QSqlQuery query("", db);query.exec(strSql);db.commit();  // 提交事务while (query.next()){QStringList keyValueHash;int nCount = query.record().count();for (size_t i = 0; i < nCount; i++)keyValueHash << query.record().value(i).toString();if (keyValueHash.size() > 0)temp << keyValueHash;}closeDb();return temp;
}// 查找
QList< QHash<QString/*name*/, QString/*value*/> > cSqlLiteDatabase::select(QString strTableName, QString strName, QString strValue)
{QList< QHash<QString, QString> > temp;if (strTableName.isEmpty() || strTableName.isEmpty())return temp;QSqlDatabase db = openDb(m_strDatabaseName);QString strConnectionName = db.connectionName();QString strSelect("");if (!strValue.isEmpty()&& !strName.isEmpty())strSelect = QString("SELECT * FROM %1 WHERE %2 = '%3';").arg(strTableName).arg(strName).arg(strValue);elsestrSelect = QString("SELECT * FROM  %1;").arg(strTableName);db.transaction(); // 开启事务查询QSqlQuery query("", db);query.exec(strSelect);db.commit();  // 提交事务while (query.next()){QHash<QString, QString> keyValueHash;int nCount = query.record().count();for (size_t i = 0; i < nCount; i++)keyValueHash.insert(query.record().fieldName(i), query.record().value(i).toString());if (keyValueHash.size() > 0)temp << keyValueHash;}closeDb();return temp;
}// 插入数据
bool cSqlLiteDatabase::insert(QString strTableName, QHash<QString/*name*/, QString/*value*/> dataHash)
{bool bRet = false;if (strTableName.isEmpty())return bRet;QStringList strHeaderList;auto findItem = m_strTableNameHeaderHash.find(strTableName);if (findItem == m_strTableNameHeaderHash.end())return bRet;elsestrHeaderList = m_strTableNameHeaderHash[strTableName];if (true){QString strInsert = QString(u8"INSERT INTO %1 VALUES(").arg(strTableName);for (size_t j = 0; j < strHeaderList.size(); j++){QString strName = strHeaderList[j];QString strValue = "";auto findName = dataHash.find(strName);if (findName != dataHash.end())strValue = findName.value();if (j < (strHeaderList.size() - 1))strInsert = strInsert + QString(u8"'%1'").arg(strValue) + QString(",");elsestrInsert = strInsert + QString(u8"'%1'").arg(strValue) + QString(")");}bRet = excute(strInsert);} return bRet;
}// 更新数据
bool cSqlLiteDatabase::update(QString strTableName, QString strWhereName, QString strWhereValue, QString strUpdateName, QString strUpdateValue)
{bool bRet = false;if (strTableName.isEmpty())return bRet;QStringList strHeaderList;auto findItem = m_strTableNameHeaderHash.find(strTableName);if (findItem == m_strTableNameHeaderHash.end())return bRet;if (true){QString strUpdate = QString(u8"UPDATE %1 SET %2='%3' WHERE %4='%5';").arg(strTableName).arg(strUpdateName).arg(strUpdateValue).arg(strWhereName).arg(strWhereValue);bRet = excute(strUpdate);}return bRet;
}// 删除数据
bool cSqlLiteDatabase::remove(QString strTableName, QString strWhereName, QString strWhereValue)
{bool bRet = false;if (strTableName.isEmpty())return bRet;QStringList strHeaderList;auto findItem = m_strTableNameHeaderHash.find(strTableName);if (findItem == m_strTableNameHeaderHash.end())return bRet;if (true){QString strUpdate = QString(u8"DELETE FROM %1 WHERE %2='%3';").arg(strTableName).arg(strWhereName).arg(strWhereValue);bRet = excute(strUpdate);}return bRet;
}// 模糊查询
QStringList cSqlLiteDatabase::fuzzySearch(QString strTableName, QString strName, QString strLike)
{QStringList temp;if (strTableName.isEmpty() || strTableName.isEmpty())return temp;QSqlDatabase db = openDb(m_strDatabaseName);QString strConnectionName = db.connectionName();QString strSelect("");if (!strLike.isEmpty())strSelect = QString("SELECT %1 FROM %2 WHERE %3 LIKE '%%4%' LIMIT 0,10;").arg(strName).arg(strTableName).arg(strName).arg(strLike);elsereturn temp;db.transaction(); // 开启事务查询QSqlQuery query("", db);query.exec(strSelect);while (query.next()){QHash<QString, QString> keyValueHash;for (size_t i = 0; i < query.record().count(); i++){QString strName = query.record().fieldName(i);QString strValue = query.record().value(i).toString();if (!temp.contains(strValue) && (strLike != strValue))temp << strValue;}}db.commit();  // 提交事务closeDb();return temp;
}

三、下载链接

https://download.csdn.net/download/u013083044/89053778

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

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

相关文章

基于单片机20v数字电压表仿真系统设计

**单片机设计介绍&#xff0c;基于单片机20v数字电压表仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机20V数字电压表仿真系统设计的主要目标是实现一个能够准确测量和显示20V直流电压的仿真系统。以下是该设计的主…

Sy6 编辑器vi的应用(+shell脚本3例子)

实验环境&#xff1a; 宿主机为win11&#xff0c;网络&#xff1a;10.255.50.5 6389 WSL2 ubuntu 目标机的OS&#xff1a;Ubuntu 内核、版本如下&#xff1a; linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…

VMware创建Ubuntu虚拟机详细教程

下载ISO映像文件 进入官网下载&#xff1a;Download Ubuntu Desktop | Download | Ubuntu 下面是一些其他的下载路径&#xff1a; 中国官网 https://cn.ubuntu.com/ 中科大源 Index of /ubuntu-releases/ (ustc.edu.cn) 阿里云开源镜像站 ubuntu-releases安装包下载_开源镜像…

真·面试题总结——JVM虚拟机

JVM虚拟机 JVM虚拟机规范与实现 JVM虚拟机规范 JVM虚拟机实现 JVM的常见实现 JVM虚拟机物理架构 JVM虚拟机的运转流程 JVM类加载过程 JVM类加载器及类加载器类型 JVM类加载器双亲委派机制 JVM运行时数据区的内存模型 JVM运行时数据区的内存模型&#xff1a;程序计数器…

day08 java 静态方法调用 方法的内存实现机制

目录 静态方法调用 方法的内存实现 静态方法调用 静态方法&#xff1a; 静态方法要在方法上用修饰符static。 静态方法可以通过类名调用 &#xff1a;类名.方法名&#xff08;&#xff09;或者 直接调用 &#xff1a;方法名&#xff08;&#xff09; 在同一个类中时&#xf…

网工内推 | 国企运维,IA认证,大专以上即可,最高22K

01 深圳建广数字科技有限公司青岛分公司 招聘岗位&#xff1a;桌面运维工程师 职责描述&#xff1a; 1.根据运维服务请求完成关于操作系统、应用软件、办公设备、网络等方面的安装、管理与维护&#xff1b; 2.各种PC软硬件故障诊断、排查及升级&#xff1b; 3.桌面设备&…

自动化测试如何管理测试数据

前段时间&#xff0c;知识星球里有同学问到&#xff1a;自动化case越多&#xff0c;测试数据越多&#xff0c;数据的管理成本也越来越高&#xff0c;是否需要一个数据池来专门管理测试数据&#xff1f;这是一个好问题&#xff0c;也是很多测试同学在自动化测试实践中必须面对的…

新手使用GIT上传本地项目到Github(个人笔记)

亲测下面的文章很有用处。 1. 初次使用git上传代码到github远程仓库 - 知乎 (zhihu.com) 2. 使用Git时出现refusing to merge unrelated histories的解决办法 - 知乎

Lua环境下载与配置

这里介绍如何下载已经编译好的Lua环境&#xff0c;如何配置Lua环境。 如希望自己从源码编译Lua环境&#xff0c;请自行搜索资料。 第一步&#xff1a;下载编译好的lua环境 打开下面链接&#xff0c;然后根据指引下载。 The Programming Language Luahttps://www.lua.org/hom…

【论文极速读】 指令微调BLIP:一种对指令微调敏感的Q-Former设计

【论文极速读】 指令微调BLIP&#xff1a;一种对指令微调敏感的Q-Former设计 FesianXu 20240330 at Tencent WeChat search team 前言 之前笔者在[1]中曾经介绍过BLIP2&#xff0c;其采用Q-Former的方式融合了多模态视觉信息和LLM&#xff0c;本文作者想要简单介绍一个在BLIP2…

docker 安装nginx

一、先查看有没有nginx镜像 docker images 二、发现没有nginx镜像&#xff0c;下载最新镜像 docker pull nginx 三、运行镜像 为了先复制出部分文件&#xff0c;先启动一个临时容器 docker run --name nginx -p 9001:80 -d nginx docker cp nginx:/etc/nginx/conf.d /home/…

HTTP/1.1、HTTP/2、HTTP/3 演变(计算机网络)

HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接改善了短连接造成的性能开销。支持管道网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&#xff0c…

百卓Smart管理平台 importexport.php SQL注入漏洞复现(CVE-2024-27718)

0x01 产品简介 百卓Smart管理平台是北京百卓网络技术有限公司(以下简称百卓网络)的一款安全网关产品,是一家致力于构建下一代安全互联网的高科技企业。 0x02 漏洞概述 百卓Smart管理平台 importexport.php 接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数据…

基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】

基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的…

每日一题————P5725 【深基4.习8】求三角形

题目&#xff1a; 题目乍一看非常的简单&#xff0c;属于初学者都会的问题——————————但是实际上呢&#xff0c;有一些小小的坑在里面。 就是三角形的打印。 平常我们在写代码的时候&#xff0c;遇到打印三角形的题&#xff0c;一般简简单单两个for循环搞定 #inclu…

MySQL 学习心得和知识总结(五)|MySQL的一般查询日志(general log)

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

权限提升技术:攻防实战与技巧

本次活动赠书1本&#xff0c;包邮到家。参与方式&#xff1a;点赞收藏文章即可。获奖者将以私信方式告知。 网络安全已经成为当今社会非常重要的话题&#xff0c;尤其是近几年来&#xff0c;我们目睹了越来越多的网络攻击事件&#xff0c;例如公民个人信息泄露&#xff0c;企业…

软件测试学习(一)

1.软件测试的定义 软件是控制计算机硬件工作的工具。 软件基本组成&#xff1a;客服端、服务器、数据库 软件产生过程&#xff1a;需求产生->需求文档->设计效果图->产品开发->产品测试->部署上线 软件测试的定义&#xff1a;使用技术手段来验证软件产品是否…

第四百三十九回

文章目录 1. 概念介绍2. 实现方法3. 示例代码 我们在上一章回中介绍了dart语言中的setter/getter相关的内容&#xff0c;本章回中将介绍局部动态列表.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 在正常情况下列表位于整个页面中&#xff0c;而且可以在整个页…

波士顿房价预测案例(python scikit-learn)---多元线性回归(多角度实验分析)

波士顿房价预测案例&#xff08;python scikit-learn&#xff09;—多元线性回归(多角度实验分析) 这次实验&#xff0c;我们主要从以下几个方面介绍&#xff1a; 一、相关框架介绍 二、数据集介绍 三、实验结果-优化算法对比实验&#xff0c;数据标准化对比实验&#xff0…