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

news2024/11/27 22:42:07

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();
	else
		m_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(",");
			else
				strCreateTable = 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);
	else
		strSelect = 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;
	else
		strHeaderList = 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(",");
			else
				strInsert = 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);
	else
		return 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.coloradmin.cn/o/1562736.html

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

相关文章

linux监控命令全

1.1 top 1.1.1 命令说明 Top 命令能够实时监控系统的运行状态&#xff0c;并且可以按照cpu、内存和执行时间进行排序 1.1.2 用法 top -hv | -bcisSHM -d delay -n iterations [-u user | -U user] -p pid [,pid ...] 1.1.3 参数说明 命令行启动参数&#xff1a; -b : 批次…

从入门到实战:vue3路由知识点

本人在B站上关于vue3的尚硅谷的课程&#xff0c;以下是整理一些笔记。 1.两个知识点 1.路由组件通常存放在pages 或 views文件夹&#xff0c;一般组件通常存放在components文件夹。 组件可以分为&#xff1a; 1. 一般组件&#xff1a;亲手写标签出来的 2. 路由组件&#…

【检索增强】Retrieval-Augmented Generation for Large Language Models:A Survey

本文简介 1、对最先进水平RAG进行了全面和系统的回顾&#xff0c;通过包括朴素RAG、高级RAG和模块化RAG在内的范式描述了它的演变。这篇综述的背景下&#xff0c;更广泛的范围内的法学硕士研究RAG的景观。 2、确定并讨论了RAG过程中不可或缺的核心技术&#xff0c;特别关注“…

成都直播基地 天府新区产业园能获得哪些政府支持

为了推动成都直播产业的快速发展&#xff0c;政府出台了一系列政策措施&#xff0c;为成都直播基地提供了全方位的支持。本篇文章将为您具体解析入驻成都直播基地 天府新区产业园 天府锋巢直播产业基地都能获得哪些政府支持。 首先&#xff0c;天府新区作为成都市的重要发展区…

【亚马逊云科技】使用 Vscode Amazon-Q 完成 GUI 界面粉笔脚本开发

前言 亚马逊云科技- Q &#xff0c;可以快速获得紧迫问题的相关答案&#xff0c;解决问题&#xff0c;生成内容。当与 Q 聊天时&#xff0c;它会提供即时的相关信息和建议&#xff0c;以帮助简化任务、加快决策速度&#xff0c;并帮助激发工作中的创造力和创新。本次我们通过完…

捷途山海T2正式开启预售,新能源方盒子SUV仅售18.49万起

4月2日&#xff0c;捷途汽车宣布&#xff0c;定位为“旅行越野超混SUV”的山海T2正式开启预售。新车共计将推出3款不同配置车型&#xff0c;预售价格区间为18.49万-21.69万元。同时&#xff0c;预售期间捷途官方还将为用户推出7重预售礼。 山海T2是捷途山海系列第二款产品&…

idea使用docker将Java项目生成镜像并使用

1&#xff1a;开启docker 远程访问 使用 vim 编辑docker服务配置文件 vim /lib/systemd/system/docker.service [Service] Typenotify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not suppor…

【Python从入门到进阶】52、CrawlSpider链接提取器的使用

接上篇《51、电影天堂网站多页面下载实战》 上一篇我们采用Scrapy框架多页面下载的模式来实现电影天堂网站的电影标题及图片抓取。本篇我们来学习基于规则进行跟踪和自动爬取网页数据的“特殊爬虫”CrawlSpider。 一、什么是CrawlSpider&#xff1f; 1、CrawlSpider的概念 Cr…

互联网轻量级框架整合之JavaEE基础I

不得不解释得几个概念 JavaEE SUN公司提出来的企业版Java开发中间件&#xff0c;主要用于企业级互联网系统的框架搭建&#xff0c;同时因为Java语言优质的平台无关性、可移植性、健壮性、支持多线程和安全性等优势&#xff0c;其迅速成为构建企业互联网平台的主流技术&#x…

【技巧】Leetcode 287. 寻找重复数【中等】

寻找重复数 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组…

搜维尔科技:Manus Prime 3 Mocap数据手套,体验极致的每指触觉!

完全适用于VR虚拟现实场景 特斯拉也在使用的量子数据 Tesla 目前正在使用 MANUS Quantum Metagloves创建一个数据集&#xff0c;帮助他们训练 Tesla 机器人。 量子数据训练QUANTUM AI 我们以类似的方式使用 Quantum Metagloves 来生成一流的手指跟踪数据集&#xff0c;并将其…

yolov5目标检测可视化界面pyside6源码(无登录版)

一、软件简介&#xff1a; 这是基于yolov5-7.0目标检测实现的的可视化目标检测源码 本套项目没有用户登录的功能&#xff0c;如需用户登录版&#xff0c;看另一篇文章&#xff1a;yolov5pyside6登录用户管理目标检测可视化源码_yolov5用户登入功能-CSDN博客 ①程序中图片和图标…

护眼台灯怎么选看哪些指标?护眼灯十大品牌推荐

在追求高效工作与学习的同时&#xff0c;如何保护视力健康&#xff0c;避免长时间用眼带来的疲劳与伤害&#xff0c;已成为现代人关注的焦点。护眼台灯作为提升用眼环境的重要工具&#xff0c;其选择显得尤为关键。那么&#xff0c;面对市面上琳琅满目的护眼台灯产品&#xff0…

分治dp,LeetCode 894. 所有可能的真二叉树

目录 一、题目 1、题目描述 2、接口描述 ​cpp python3 3、原题链接 二、解题报告 1、思路分析 F1 回溯 F2 动态规划 2、复杂度 3、代码详解 ​分治 cpp python3 dp cpp python3 一、题目 1、题目描述 给你一个整数 n &#xff0c;请你找出所有可能含 n 个节…

数学矩阵(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容&#xff0c;但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数&#xff0c;只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时&#xff0c;才能相乘&#xff0c;否则不允…

蓝桥杯单片机速成2-动态数码管数码管显示

一、原理图 段选给1是选中 &#xff0c;该数码管是共阳极的数码管&#xff0c;位选输入0才会电亮一位 二、代码分析 /************* 本地常量声明 **************/ u8 code t_display[]{ //标准字库 // 0 1 2 3 4 5 6 7 8…

Java复习第十五天学习笔记(JS),附有道云笔记链接

一、JS简介 JS&#xff1a; 1、直接嵌入HTML页面。 2、由浏览器解释执行代码&#xff0c;不进行预编译。 解释型语言和编译型语言 JS&#xff1a;解释型语言、弱类型语言 Java:编译型语言、强类型语言 变量: var num 100; variable 用var来定义一个变量。 int num 1…

kubernetes(K8S)学习(九):K8S之日志监控

K8S之日志监控 一、Log and Monitor1.1 Log1.1.1 容器级别1.1.2 Pod级别1.1.3 组件服务级别1.1.4 LogPilot ES Kibana 1.2 Monitor1.2.1 Prometheus简介1.2.2 Prometheus架构1.2.3 Prometheus知识普及1.2.4 数据采集1.2.5 Prometheus Grafana 二、Trouble Shooting&#xff…

ARM64架构栈帧以及帧指针FP

文章目录 前言一、arm64架构寄存器简介1.1 异常等级1.2 通用寄存器1.3 ARM64架构ABI 二、ARM64架构函数调用标准2.1 AArch64过程调用标准简介2.2 通用寄存器中的参数 三、demo分析3.1 main函数3.2 funb3.3 funa 四、栈帧总结五、demo演示参考资料 前言 这篇文章描述了 x86_64架…

原生小程序开发性能优化指南

性能优化指南 1.骨架屏 业务可以在数据加载完成之前用骨架屏幕来占位&#xff0c;提升体验。 2.包大小优化 减小包中静态资源&#xff0c;例如图片文件&#xff0c;可将图片进行压缩降低文件体积。无用文件、函数、样式剔除。除了部分用于容错的图片必须放在代码包&#xf…