#include "systemconfigwizard.h" #include #include #include #include #include #include #include "pub_widget/MessageBox.h" #include #include #include #include #include #include "kbdtabledatamgr.h" #include "kbddbdesign.h" #include "common_global.h" #include "kbdregexpvalidator.h" #include #include SystemConfigWizard::SystemConfigWizard(QWidget *parent) : QWizard(parent) { setWindowTitle(tr("系统拓扑配置向导")); setWizardStyle(QWizard::ClassicStyle); addPage(createLocationPage()); addPage(createNodePage()); addPage(createDbNodePage()); resize(940,580); } bool SystemConfigWizard::validateCurrentPage() { if(currentId() == 0) { if(checkLocationInfo()) setNodetableDelegate(); else return false; } else if(currentId() == 1) { if(checkNodeInfo()) { setDbNodetableDelegate(); UpdateNoUseNode(); } else return false; } return true; } QWizardPage* SystemConfigWizard::createLocationPage() { QWizardPage* page = new QWizardPage(this); QVBoxLayout* vlayout = new QVBoxLayout; QHBoxLayout* hLayout = new QHBoxLayout; QLabel*lableTitle = new QLabel(tr("位置配置")); QPushButton* btnAdd = new QPushButton(tr("增加"),this); QPushButton* btnDelete = new QPushButton(tr("删除"),this); hLayout->addWidget(lableTitle); hLayout->addStretch(); hLayout->addWidget(btnAdd); hLayout->addWidget(btnDelete); vlayout->addLayout(hLayout); m_tableLocation = new QTableWidget(this); QLabel* lable = new QLabel(tr("提示:"),this); m_textLocationNote = new QTextEdit(this); m_textLocationNote->setMaximumWidth(200); vlayout->addWidget(m_tableLocation); hLayout = new QHBoxLayout; hLayout->addLayout(vlayout); vlayout = new QVBoxLayout; vlayout->addWidget(lable); vlayout->addWidget(m_textLocationNote); hLayout->addLayout(vlayout); hLayout->setMargin(0); page->setLayout(hLayout); initLocationPageData(); connect(btnAdd,&QPushButton::clicked,this,&SystemConfigWizard::onAddLocationPageData); connect(btnDelete,&QPushButton::clicked,this,&SystemConfigWizard::onDeleteLocationPageData); return page; } QWizardPage* SystemConfigWizard::createNodePage() { QWizardPage* page = new QWizardPage(this); QVBoxLayout* vlayout = new QVBoxLayout; QHBoxLayout* hlayout = new QHBoxLayout; QLabel*lableTitle = new QLabel(tr("节点配置")); QPushButton* btnAdd = new QPushButton(tr("增加"),this); QPushButton* btnDelete = new QPushButton(tr("删除"),this); hlayout->addWidget(lableTitle); hlayout->addStretch(); hlayout->addWidget(btnAdd); hlayout->addWidget(btnDelete); vlayout->addLayout(hlayout); m_tableNode = new QTableWidget(this); vlayout->addWidget(m_tableNode); hlayout = new QHBoxLayout; QLabel* lableNet = new QLabel(tr("节点网卡"),this); QPushButton* btnNetAdd = new QPushButton(tr("增加"),this); QPushButton* btnNetDelete = new QPushButton(tr("删除"),this); hlayout->addWidget(lableNet); hlayout->addStretch(); hlayout->addWidget(btnNetAdd); hlayout->addWidget(btnNetDelete); vlayout->addLayout(hlayout); m_tableNetworkCard = new QTableWidget(this); vlayout->addWidget(m_tableNetworkCard); QLabel* lable = new QLabel(tr("提示:"),this); m_textNodeNote = new QTextEdit(this); m_textNodeNote->setMaximumWidth(200); hlayout = new QHBoxLayout; hlayout->addLayout(vlayout); vlayout = new QVBoxLayout; vlayout->addWidget(lable); vlayout->addWidget(m_textNodeNote); hlayout->addLayout(vlayout); hlayout->setMargin(0); page->setLayout(hlayout); initNodePageData(); setNodetableDelegate(); connect(btnAdd,&QPushButton::clicked,this,&SystemConfigWizard::onAddNodePageData); connect(btnDelete,&QPushButton::clicked,this,&SystemConfigWizard::onDeleteNodePageData); connect(btnNetAdd,&QPushButton::clicked,this,&SystemConfigWizard::onAddNetworkCardData); connect(btnNetDelete,&QPushButton::clicked,this,&SystemConfigWizard::onDeleteNetworkCardData); connect(m_tableNode,&QTableWidget::itemSelectionChanged,this,&SystemConfigWizard::onNodeTableClieck); connect(m_tableNode,&QTableWidget::itemChanged,this,&SystemConfigWizard::onNicNumChange); connect(m_tableNetworkCard,&QTableWidget::itemChanged,this,&SystemConfigWizard::onSaveNetworkCardData); return page; } QWizardPage* SystemConfigWizard::createDbNodePage() { QWizardPage* page = new QWizardPage(this); QVBoxLayout* vlayout = new QVBoxLayout; QHBoxLayout* hlayout = new QHBoxLayout; QLabel*lableTitle = new QLabel(tr("数据库节点配置")); QPushButton* btnAdd = new QPushButton(tr("增加"),this); QPushButton* btnDelete = new QPushButton(tr("删除"),this); hlayout->addWidget(lableTitle); hlayout->addStretch(); hlayout->addWidget(btnAdd); hlayout->addWidget(btnDelete); vlayout->addLayout(hlayout); m_tableDbNode = new QTableWidget(this); vlayout->addWidget(m_tableDbNode); hlayout = new QHBoxLayout; lableTitle = new QLabel(tr("虚拟节点配置")); QPushButton* btnAddVirtual = new QPushButton(tr("增加"), this); QPushButton* btnDeleteVirtual = new QPushButton(tr("删除"), this); hlayout->addWidget(lableTitle); hlayout->addStretch(); hlayout->addWidget(btnAddVirtual); hlayout->addWidget(btnDeleteVirtual); vlayout->addLayout(hlayout); m_tableVirtualNode = new QTableWidget(this); vlayout->addWidget(m_tableVirtualNode); QLabel* lable = new QLabel(tr("提示:"),this); m_textDbNodeNote = new QTextEdit(this); m_textDbNodeNote->setMaximumWidth(200); hlayout = new QHBoxLayout; hlayout->addLayout(vlayout); vlayout = new QVBoxLayout; vlayout->addWidget(lable); vlayout->addWidget(m_textDbNodeNote); hlayout->addLayout(vlayout); hlayout->setMargin(0); page->setLayout(hlayout); initDbNodePageData(); setDbNodetableDelegate(); connect(btnAdd,&QPushButton::clicked,this,&SystemConfigWizard::onAddDbNodeData); connect(btnDelete,&QPushButton::clicked,this,&SystemConfigWizard::onDeleteDbNodeData); connect(btnAddVirtual,&QPushButton::clicked,this,&SystemConfigWizard::onAddVirtualNodeData); connect(btnDeleteVirtual,&QPushButton::clicked,this,&SystemConfigWizard::onDeleteVirtualNodeData); return page; } void SystemConfigWizard::initLocationPageData() { m_textLocationNote->setPlainText(tr("1,根据实际工程情况添加位置信息。\n2,若工程已经搭建完成,删除原有的位置可导致原位置下的工程数据被删除。")); m_textLocationNote->setReadOnly(true); QStringList listLabels; listLabels << tr("ID") << tr("标签名") << tr("描述"); m_tableLocation->setColumnCount(listLabels.size()); m_tableLocation->horizontalHeader()->setStretchLastSection(true); m_tableLocation->setHorizontalHeaderLabels(listLabels); m_tableLocation->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableLocation->setSelectionMode(QAbstractItemView::SingleSelection); m_tableLocation->setItemDelegateForColumn(1,new ClineEditDelegate(8,"^([A-Za-z]|[0-9]|[#_\\-])+$",this)); KbdTableModel* m_modelLocation = KbdTableDataMgr::getInstance()->createModel(TBL_LOCATION); if(m_modelLocation == NULL) return; m_modelLocation->load(true); const ColMgrDataList& modelCols = m_modelLocation->getHeadCols(); m_tableLocation->setRowCount(m_modelLocation->rowCount()); for(int i = 0;i < m_modelLocation->rowCount();i++) { QStringList data = m_modelLocation->getRowData(i); QTableWidgetItem* item = new QTableWidgetItem(data.at(modelCols.findCol(CN_LOCATION_ID))); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); m_tableLocation->setItem(i,0,item); item = new QTableWidgetItem(data.at(modelCols.findCol(CN_TAG_NAME))); m_tableLocation->setItem(i,1,item); item = new QTableWidgetItem(data.at(modelCols.findCol(CN_DESC))); m_tableLocation->setItem(i,2,item); } } void SystemConfigWizard::initNodePageData() { m_textNodeNote->setPlainText(tr("1,根据实际工程情况添加节点信息。\n" "2,选中节点添加对应节点网卡信息。\n" "3,数据库服务器的网卡名称必须是电脑实际的网卡名称。\n" "4,网卡名称示例,windows: Realtek PCIe GBE Family Controller ,linux:eth1。")); m_textNodeNote->setReadOnly(true); QStringList listLabels; listLabels << tr("节点名") << tr("主机描述") << tr("节点类型") << tr("部署类型") << tr("所属位置") << tr("是否使用") << tr("网卡个数"); m_tableNode->setColumnCount(listLabels.size()); m_tableNode->horizontalHeader()->setStretchLastSection(true); m_tableNode->setHorizontalHeaderLabels(listLabels); m_tableNode->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableNode->setSelectionMode(QAbstractItemView::SingleSelection); // 注释主机描述的正则表达式限制 //m_tableNode->setItemDelegateForColumn(1,new ClineEditDelegate(64,"^([A-Za-z]|[0-9]|[#_\\-])+$",this)); m_tableNode->setItemDelegateForColumn(6,new ClineEditDelegate(2,"^([1-2])",this)); listLabels.clear(); listLabels << tr("网卡名称") << tr("IP地址") << tr("子网掩码")<< tr("网关"); m_tableNetworkCard->setColumnCount(listLabels.size()); m_tableNetworkCard->horizontalHeader()->setStretchLastSection(true); m_tableNetworkCard->setHorizontalHeaderLabels(listLabels); m_tableNetworkCard->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableNetworkCard->setSelectionMode(QAbstractItemView::SingleSelection); QString sreReg = "^$|^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$"; m_tableNetworkCard->setItemDelegateForColumn(1,new ClineEditDelegate(16,sreReg,this)); m_tableNetworkCard->setItemDelegateForColumn(2,new ClineEditDelegate(16,sreReg,this)); m_tableNetworkCard->setItemDelegateForColumn(3,new ClineEditDelegate(16,sreReg,this)); KbdTableModel* m_modelNode = KbdTableDataMgr::getInstance()->createModel("sys_model_node_info.xml"); if(m_modelNode == NULL) return; m_modelNode->load(true); const ColMgrDataList& modelCols = m_modelNode->getHeadCols(); QList listDatas; for (int i = 0; i < m_modelNode->rowCount(); i++) { QStringList data = m_modelNode->getRowData(i); if (data.at(modelCols.findCol("NODE_TYPE")) == tr("4:虚拟节点")) { m_virtualNodeTag = data.at(modelCols.findCol("NODE_NAME")); continue; } listDatas << data; } m_tableNode->setRowCount(listDatas.size()); for(int i = 0;i < listDatas.size();i++) { QStringList data = listDatas.at(i); QTableWidgetItem* item = new QTableWidgetItem(data.at(modelCols.findCol("NODE_NAME"))); m_tableNode->setItem(i,0,item); item = new QTableWidgetItem(data.at(modelCols.findCol(CN_DESC))); m_tableNode->setItem(i,1,item); item = new QTableWidgetItem(data.at(modelCols.findCol("NODE_TYPE"))); m_tableNode->setItem(i,2,item); item = new QTableWidgetItem(getDeploytype(data.at(modelCols.findCol("NODE_NAME")))); m_tableNode->setItem(i,3,item); item = new QTableWidgetItem(data.at(modelCols.findCol("LOCATION_ID"))); m_tableNode->setItem(i,4,item); item = new QTableWidgetItem(data.at(modelCols.findCol("IS_USED"))); m_tableNode->setItem(i,5,item); QString nic_num = data.at(modelCols.findCol("NIC_NUM")); item = new QTableWidgetItem(nic_num); m_tableNode->setItem(i,6,item); QStringList nicInfo; QList listNicInfo; nicInfo << data.at(modelCols.findCol("NIC1_NAME")); nicInfo << data.at(modelCols.findCol("NIC1_ADDRESS")); nicInfo << data.at(modelCols.findCol("NIC1_NETMASK")); nicInfo << data.at(modelCols.findCol("NIC1_GATEWAY")); listNicInfo << nicInfo; if(nic_num == "2") { nicInfo.clear(); nicInfo << data.at(modelCols.findCol("NIC2_NAME")); nicInfo << data.at(modelCols.findCol("NIC2_ADDRESS")); nicInfo << data.at(modelCols.findCol("NIC2_NETMASK")); nicInfo << data.at(modelCols.findCol("NIC2_GATEWAY")); listNicInfo << nicInfo; } m_mapNetworkCard.insert(m_tableNode->item(i,0),listNicInfo); } } void SystemConfigWizard::initDbNodePageData() { m_textDbNodeNote->setPlainText(tr("1,根据实际情况配置相应数据库节点的连接信息。\n" "2,一个数据库服务器节点时,不配置虚拟节点信息\n" "3,存在两个及以上数据库服务器节点时,必须配置虚拟节点信息,用于数据库同步。")); m_textDbNodeNote->setReadOnly(true); QStringList listLabels; listLabels << tr("数据库标识") << tr("节点名称") << tr("数据库类型") << tr("数据库名") << tr("数据库用户名") << tr("数据库密码") << tr("数据库端口"); m_tableDbNode->setColumnCount(listLabels.size()); m_tableDbNode->horizontalHeader()->setStretchLastSection(true); m_tableDbNode->setHorizontalHeaderLabels(listLabels); m_tableDbNode->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableDbNode->setSelectionMode(QAbstractItemView::SingleSelection); KbdTableModel* m_modelDbNode = KbdTableDataMgr::getInstance()->createModel("sys_model_dbconfig_node.xml"); if(m_modelDbNode == NULL) return; m_modelDbNode->load(true); const ColMgrDataList& modelCols = m_modelDbNode->getHeadCols(); QList listDatas; for (int i = 0; i < m_modelDbNode->rowCount(); i++) { QStringList data = m_modelDbNode->getRowData(i); if(data.at(modelCols.findCol("NODE_NAME")).split(":").first() == m_virtualNodeTag) continue; listDatas << data; } m_tableDbNode->setRowCount(listDatas.size()); for(int i = 0;i < listDatas.size();i++) { QStringList data = listDatas.at(i); QTableWidgetItem* item = new QTableWidgetItem(data.at(modelCols.findCol("DB_NAME"))); m_tableDbNode->setItem(i,0,item); item = new QTableWidgetItem(data.at(modelCols.findCol("NODE_NAME"))); m_tableDbNode->setItem(i,1,item); item = new QTableWidgetItem(data.at(modelCols.findCol("DB_TYPE"))); m_tableDbNode->setItem(i,2,item); item = new QTableWidgetItem(data.at(modelCols.findCol("DB_SERVICE_NAME"))); m_tableDbNode->setItem(i,3,item); item = new QTableWidgetItem(data.at(modelCols.findCol("USER_NAME"))); m_tableDbNode->setItem(i,4,item); item = new QTableWidgetItem(data.at(modelCols.findCol("USER_PASSWORD"))); m_tableDbNode->setItem(i,5,item); item = new QTableWidgetItem(data.at(modelCols.findCol("DB_PORT"))); m_tableDbNode->setItem(i,6,item); } listLabels.clear(); listLabels << tr("虚拟节点IP") << tr("子网掩码") << tr("网关"); m_tableVirtualNode->setColumnCount(listLabels.size()); m_tableVirtualNode->horizontalHeader()->setStretchLastSection(true); m_tableVirtualNode->setHorizontalHeaderLabels(listLabels); m_tableVirtualNode->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableVirtualNode->setSelectionMode(QAbstractItemView::SingleSelection); QString sreReg = "^$|^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$"; m_tableVirtualNode->setItemDelegateForColumn(0,new ClineEditDelegate(16,sreReg,this)); m_tableVirtualNode->setItemDelegateForColumn(1,new ClineEditDelegate(16,sreReg,this)); m_tableVirtualNode->setItemDelegateForColumn(2,new ClineEditDelegate(16,sreReg,this)); KbdTableModel* model = KbdTableDataMgr::getInstance()->createModel("sys_model_node_info.xml"); if (model == NULL) return; const ColMgrDataList& modelNewcols = model->getHeadCols(); for (int i = 0; i < model->rowCount(); i++) { QStringList data = model->getRowData(i); if (data.at(modelNewcols.findCol("NODE_TYPE")) == "4:虚拟节点") { QString nic_num = data.at(modelNewcols.findCol("NIC_NUM")); m_tableVirtualNode->setRowCount(1); QTableWidgetItem* item = new QTableWidgetItem(data.at(modelNewcols.findCol("NIC1_ADDRESS"))); m_tableVirtualNode->setItem(0,0,item); item = new QTableWidgetItem(data.at(modelNewcols.findCol("NIC1_NETMASK"))); m_tableVirtualNode->setItem(0,1,item); item = new QTableWidgetItem(data.at(modelNewcols.findCol("NIC1_GATEWAY"))); m_tableVirtualNode->setItem(0,2,item); if(nic_num == "2") { m_tableVirtualNode->setRowCount(2); QTableWidgetItem* item = new QTableWidgetItem(data.at(modelNewcols.findCol("NIC2_ADDRESS"))); m_tableVirtualNode->setItem(1,0,item); item = new QTableWidgetItem(data.at(modelNewcols.findCol("NIC2_NETMASK"))); m_tableVirtualNode->setItem(1,1,item); item = new QTableWidgetItem(data.at(modelNewcols.findCol("NIC2_GATEWAY"))); m_tableVirtualNode->setItem(1,2,item); } } } } void SystemConfigWizard::setNodetableDelegate() { QList listData; listData << (QStringList() << tr("1:工作站") << "1"); listData << (QStringList() << tr("2:应用服务器") << "2"); listData << (QStringList() << tr("3:数据库服务器") << "3"); m_tableNode->setItemDelegateForColumn(2,new CboxDelegate(listData,this)); listData.clear(); listData << (QStringList() << tr("0:主服务器") << "0"); listData << (QStringList() << tr("1:备服务器") << "1"); m_tableNode->setItemDelegateForColumn(3,new CboxDelegate(listData,this)); listData.clear(); for(int i = 0;i < m_tableLocation->rowCount();i++) { QString locationID = m_tableLocation->item(i,0)->text(); QString des = m_tableLocation->item(i,2)->text(); listData << (QStringList() << locationID + ":" + des << locationID); } m_tableNode->setItemDelegateForColumn(4,new CboxDelegate(listData,this)); listData.clear(); listData << (QStringList() << tr("1:使用") << "1"); listData << (QStringList() << tr("0:不使用") << "0"); m_tableNode->setItemDelegateForColumn(5,new CboxDelegate(listData,this)); } void SystemConfigWizard::setDbNodetableDelegate() { m_listNodeNoUse.clear(); QList listData; listData << (QStringList() << tr("0:主数据库") << "0"); listData << (QStringList() << tr("1:备数据库") << "1"); m_tableDbNode->setItemDelegateForColumn(0,new CboxDelegate(listData,this)); listData.clear(); for(int i = 0;i < m_tableNode->rowCount();i++) { QString bUse = m_tableNode->item(i,5)->text().split(":").first(); QString nodeTag = m_tableNode->item(i,0)->text(); QString des = m_tableNode->item(i,1)->text(); if(bUse == "0") { m_listNodeNoUse << nodeTag + ":" + des; continue; } listData << (QStringList() << nodeTag + ":" + des << nodeTag); } m_tableDbNode->setItemDelegateForColumn(1,new CboxDelegate(listData,this)); listData.clear(); listData << (QStringList() << tr("0:无效") << "0"); listData << (QStringList() << tr("1:Oracle") << "1"); listData << (QStringList() << tr("2:MySQL") << "2"); listData << (QStringList() << tr("3:openGauss") << "3"); listData << (QStringList() << tr("4:Kingbase") << "4"); m_tableDbNode->setItemDelegateForColumn(2,new CboxDelegate(listData,this)); } void SystemConfigWizard::useLocalNic() { QList listInterface = QNetworkInterface::allInterfaces(); for(int i = 0; i < listInterface.size();i++) { if(!listInterface.at(i).isValid()) continue; if(!listInterface.at(i).flags().testFlag(QNetworkInterface::IsRunning) || listInterface.at(i).flags().testFlag(QNetworkInterface::IsLoopBack)) continue; if(listInterface.at(i).humanReadableName().contains("VMware")) continue; } } void SystemConfigWizard::UpdateNoUseNode() { for(int i = 0;i < m_tableDbNode->rowCount();i++) { QString node = m_tableDbNode->item(i,1)->text(); if(m_listNodeNoUse.contains(node)) m_tableDbNode->removeRow(i); } } QString SystemConfigWizard::getDeploytype(QString nodeName) { QString deploytype; KbdDbDesign ds; QString sql = "select NODE1 from sys_model_deploy_info where APP_ID = '2';"; QStringList result; ds.getOneColumnResult(sql,result); if(result.isEmpty()) return QString(tr("0:主服务器")); if(result.at(0) == nodeName) deploytype = tr("0:主服务器"); else deploytype = tr("1:备服务器"); return deploytype; } void SystemConfigWizard::onAddLocationPageData() { int nCount = m_tableLocation->rowCount(); m_tableLocation->setRowCount(nCount + 1); QTableWidgetItem* item = new QTableWidgetItem(QString::number(nCount + 1)); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); m_tableLocation->setItem(nCount,0,item); item = new QTableWidgetItem; m_tableLocation->setItem(nCount,1,item); item = new QTableWidgetItem; m_tableLocation->setItem(nCount,2,item); } void SystemConfigWizard::onDeleteLocationPageData() { m_tableLocation->removeRow(m_tableLocation->currentRow()); for(int i = 0;i < m_tableLocation->rowCount();i++) m_tableLocation->item(i,0)->setText(QString::number(i+1)); } void SystemConfigWizard::onAddNodePageData() { int nCount = m_tableNode->rowCount(); m_tableNode->setRowCount(nCount + 1); QTableWidgetItem* item = new QTableWidgetItem(QHostInfo::localHostName()); m_tableNode->setItem(nCount,0,item); item = new QTableWidgetItem; m_tableNode->setItem(nCount,1,item); item = new QTableWidgetItem(tr("2:应用服务器")); m_tableNode->setItem(nCount,2,item); item = new QTableWidgetItem; if(nCount == 0) item->setText(tr("0:主服务器")); else item->setText(tr("1:备服务器")); m_tableNode->setItem(nCount,3,item); item = new QTableWidgetItem; m_tableNode->setItem(nCount,4,item); item = new QTableWidgetItem(tr("1:使用")); m_tableNode->setItem(nCount,5,item); item = new QTableWidgetItem("1"); m_tableNode->setItem(nCount,6,item); QList listNic; m_mapNetworkCard.insert(m_tableNode->item(nCount,0),listNic); } void SystemConfigWizard::onDeleteNodePageData() { int nRow = m_tableNode->currentRow(); m_mapNetworkCard.erase(m_mapNetworkCard.find(m_tableNode->item(nRow, 0))); m_tableNode->removeRow(nRow); } void SystemConfigWizard::onAddNetworkCardData() { int nCount = m_tableNetworkCard->rowCount(); if(nCount > 1) { onMsg(tr("最多支持两个网卡地址!")); return; } int nNodeRow = m_tableNode->currentRow(); if ( nNodeRow < 0 ) return; int nNicNum = m_tableNode->item(nNodeRow,6)->text().toInt(); if(nNicNum > 2 || nNicNum < 1) { onMsg(tr("网卡个数配置错误")); return; } if(nNicNum == nCount) { onMsg(tr("当前已达到网卡个数上限")); return; } auto iter = m_mapNetworkCard.find(m_tableNode->item(nNodeRow,0)); QStringList nic; nic << "NIC" << "127.0.0.1" << "255.255.255.0" << "127.0.0.1"; (*iter) << nic; m_tableNetworkCard->setRowCount(nCount + 1); QTableWidgetItem* item = new QTableWidgetItem("NIC"); m_tableNetworkCard->setItem(nCount,0,item); item = new QTableWidgetItem("127.0.0.1"); m_tableNetworkCard->setItem(nCount,1,item); item = new QTableWidgetItem("255.255.255.0"); m_tableNetworkCard->setItem(nCount,2,item); item = new QTableWidgetItem("127.0.0.1"); m_tableNetworkCard->setItem(nCount,3,item); } void SystemConfigWizard::onDeleteNetworkCardData() { int nRow = m_tableNetworkCard->currentRow(); if(nRow == -1) nRow = m_tableNetworkCard->rowCount() - 1; m_tableNetworkCard->removeRow(nRow); int nNodeRow = m_tableNode->currentRow(); auto iterCard = m_mapNetworkCard.find(m_tableNode->item(nNodeRow,0)); (*iterCard).removeAt(nRow); } void SystemConfigWizard::onAddDbNodeData() { int nCount = m_tableDbNode->rowCount(); m_tableDbNode->setRowCount(nCount + 1); QTableWidgetItem* item = new QTableWidgetItem("2:MySQL"); m_tableDbNode->setItem(nCount,2,item); item = new QTableWidgetItem(EMS_DEFAULT_DATABASE); m_tableDbNode->setItem(nCount,3,item); item = new QTableWidgetItem("root"); m_tableDbNode->setItem(nCount,4,item); item = new QTableWidgetItem(EMS_DEFAULT_PASSWD); m_tableDbNode->setItem(nCount,5,item); item = new QTableWidgetItem("3306"); m_tableDbNode->setItem(nCount,6,item); item = new QTableWidgetItem; if(nCount == 0) item->setText(tr("0:主数据库")); else item->setText(tr("1:备数据库")); m_tableDbNode->setItem(nCount,0,item); item = new QTableWidgetItem; m_tableDbNode->setItem(nCount,1,item); } void SystemConfigWizard::onAddVirtualNodeData() { int nCount = m_tableVirtualNode->rowCount(); if (nCount > 1) { onMsg(tr("最多支持两个网卡地址!")); return; } m_tableVirtualNode->setRowCount(nCount + 1); QTableWidgetItem* item = new QTableWidgetItem("127.0.0.1"); m_tableVirtualNode->setItem(nCount, 0, item); item = new QTableWidgetItem("255.255.255.0"); m_tableVirtualNode->setItem(nCount, 1, item); item = new QTableWidgetItem("127.0.0.1"); m_tableVirtualNode->setItem(nCount, 2, item); } void SystemConfigWizard::onDeleteVirtualNodeData() { m_tableVirtualNode->removeRow(m_tableVirtualNode->currentRow()); } void SystemConfigWizard::onDeleteDbNodeData() { m_tableDbNode->removeRow(m_tableDbNode->currentRow()); } void SystemConfigWizard::onNodeTableClieck() { m_tableNetworkCard->reset(); int nRow = m_tableNode->currentRow(); auto iterNic = m_mapNetworkCard.find(m_tableNode->item(nRow,0)); if (iterNic == m_mapNetworkCard.end()) return; m_tableNetworkCard->setRowCount(iterNic->size()); for(int i = 0;i < iterNic->size();i++) { QTableWidgetItem* item = new QTableWidgetItem(iterNic->at(i).at(0)); m_tableNetworkCard->setItem(i,0,item); item = new QTableWidgetItem(iterNic->at(i).at(1)); m_tableNetworkCard->setItem(i,1,item); item = new QTableWidgetItem(iterNic->at(i).at(2)); m_tableNetworkCard->setItem(i,2,item); item = new QTableWidgetItem(iterNic->at(i).at(3)); m_tableNetworkCard->setItem(i,3,item); } } void SystemConfigWizard::onSaveNetworkCardData(QTableWidgetItem *item) { int nNodeRow = m_tableNode->currentRow(); int nNicRow = item->row(); int nNicCol = item->column(); auto iter = m_mapNetworkCard.find(m_tableNode->item(nNodeRow,0)); (*iter)[nNicRow].replace(nNicCol,item->text()); } void SystemConfigWizard::onNicNumChange(QTableWidgetItem *item) { int nNicCol = item->column(); if(nNicCol != 6) return; int nNicNum = item->text().toInt(); if(nNicNum > 2 || nNicNum < 1) { onMsg(tr("网卡个数配置错误")); item->setText("1"); return; } if(nNicNum == 2 && m_tableNetworkCard->rowCount() == 1) onAddNetworkCardData(); if(nNicNum == 1 && m_tableNetworkCard->rowCount() == 2) onDeleteNetworkCardData(); } bool SystemConfigWizard::checkLocationInfo() { if (m_tableLocation->rowCount() == 0) { onMsg(tr("未配置位置信息")); return false; } for(int i = 0;i < m_tableLocation->rowCount();i++) { if(m_tableLocation->item(i,1)->text().isEmpty()) { onMsg(tr("位置标签名不能为空")); return false; } if(m_tableLocation->item(i,2)->text().isEmpty()) { onMsg(tr("位置描述不能为空")); return false; } } return true; } bool SystemConfigWizard::checkNodeInfo() { if (m_tableNode->rowCount() == 0) { onMsg(tr("未配置节点信息")); return false; } for(int i = 0;i < m_tableNode->rowCount();i++) { QString nodeName = m_tableNode->item(i,0)->text(); if(nodeName.isEmpty()) { onMsg(tr("节点名不能为空")); return false; } if(m_tableNode->item(i,1)->text().isEmpty()) { onMsg(tr("主机描述描述不能为空")); return false; } if(m_tableNode->item(i,4)->text().isEmpty()) { onMsg(tr("所属位置不能为空")); return false; } QString bUse = m_tableNode->item(i,5)->text().split(":").first(); auto iter = m_mapNetworkCard.find(m_tableNode->item(i,0)); if (iter != m_mapNetworkCard.end()) { if (iter->isEmpty()) { onMsg(tr("存在未配置网卡信息的节点")); return false; } for(int j = 0;j < iter->size();j++) { if(bUse == "0") continue; if(iter->at(j).at(1).startsWith("127.")) { if(nodeName != QHostInfo::localHostName()) { onMsg(QString(tr("节点%1,非本机节点,不能配置本地回环地址")).arg(nodeName)); return false; } } } } } int nNum = 0; for(int i = 0;i < m_tableNode->rowCount();i++) { if(m_tableNode->item(i,3)->text().split(":").first() == "0") nNum++; } if(nNum > 1) { onMsg(tr("最多一个主服务器节点")); return false; } return true; } bool SystemConfigWizard::checkDbNodeInfo() { if (m_tableDbNode->rowCount() == 0) { onMsg(tr("未配置数据库节点信息")); return false; } if(m_tableDbNode->rowCount() > 1) { if(m_tableVirtualNode->rowCount() < 1) { onMsg(tr("当前存在多个数据库节点,请添加虚拟节点配置信息!")); return false; } } QSet setDbType; int nNum = 0; for(int i = 0;i < m_tableDbNode->rowCount();i++) { if(m_tableDbNode->item(i,1)->text().isEmpty()) { onMsg(tr("节点名称不能为空")); return false; } if (m_tableDbNode->item(i, 0)->text() == "0:主数据库") nNum++; setDbType << m_tableDbNode->item(i, 2)->text(); } if (nNum > 1) { onMsg(tr("只能有一个主数据库节点")); return false; } if(setDbType.size() > 1) { onMsg(tr("多个数据库节点只能使用同一种数据库类型")); return false; } return true; } void SystemConfigWizard::writeConfigToDb() { bool success = false; QString retStr = KbdTableDataMgr::getInstance()->startTransaction(); if(!retStr.isEmpty()) { onMsg(retStr); return; } do { if(!createDomain()) break; if(!createStation()) break; if(!createNode()) break; if(!createDeploy()) break; if(!createDbNode()) break; if(!createDbDomain()) break; success = true; }while(false); if(KbdTableDataMgr::getInstance()->commit()?false:((success=false)||true)) onMsg(tr("此次修改失败,已启动回滚!")); if(success) { onMsg(tr("配置成功")); int nRtn = N_MessageBox::information(this,tr("消息"),tr("是否导出全部配置?"),N_MessageBox::Yes,N_MessageBox::No); if(nRtn == N_MessageBox::Yes) { if(configExportAll()) onMsg(tr("导出成功")); else onMsg(tr("导出失败")); } } } bool SystemConfigWizard::configExportAll() { if(Common::isSysRun()) { onMsg(tr("当前系统正在运行,配置未导出")); return false; } QDir dir(Common::getSysModelPath()); if(!dir.exists()) { dir.mkpath(Common::getSysModelPath()); } bool bSuccess = false; QString filePath; do { KbdTableModel* model = KbdTableDataMgr::getInstance()->createModel("sys_model_app_info.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_dbconfig_domain.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_dbconfig_node.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_deploy_info.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_domain_info.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_location_info.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("SYS_MODEL_MSG_RELAY.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_node_info.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_process_info.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; model = KbdTableDataMgr::getInstance()->createModel("sys_model_sub_system_info.xml"); filePath = Common::getSysModelPath() + "/" + model->getTableName() + ".xml"; if(!model->exportFile(filePath)) break; bSuccess = true; }while(false); if(!bSuccess) onMsg(QString(tr("文件:%1,导出失败!").arg(filePath))); Common::reloadKeepalived(); return bSuccess; } void SystemConfigWizard::accept() { if (!checkDbNodeInfo()) return; writeConfigToDb(); QWizard::accept(); } bool SystemConfigWizard::createDomain() { //删除原位置,节点,应用部署信息,数据库节点,数据库部署信息; QStringList listSql; listSql << "DELETE FROM sys_model_domain_info;"; listSql << "DELETE FROM sys_model_location_info;"; listSql << "DELETE FROM sys_model_node_info;"; listSql << "DELETE FROM sys_model_deploy_info;"; listSql << "DELETE FROM sys_model_dbconfig_node;"; listSql << "DELETE FROM sys_model_dbconfig_domain;"; if(!KbdTableDataMgr::getInstance()->executeOnly(listSql)) { onMsg(tr("清理配置表失败!")); return false; } QString sql = "INSERT INTO sys_model_domain_info VALUES (1,'domain1',1,'监控中心域');"; if(!KbdTableDataMgr::getInstance()->executeOnly(sql)) { onMsg(tr("创建域节点失败!")); return false; } return true; } bool SystemConfigWizard::createStation() { //写入位置配置信息 QStringList listLocation; for(int i = 0;i < m_tableLocation->rowCount();i++) { QStringList cfgInfo; cfgInfo << m_tableLocation->item(i,0)->text(); cfgInfo << m_tableLocation->item(i,1)->text().replace("'", "''"); cfgInfo << m_tableLocation->item(i,2)->text().replace("'", "''"); cfgInfo << "1"; cfgInfo << m_tableLocation->item(i,0)->text(); listLocation << "('" + cfgInfo.join("','") + "')"; } QString sql = "INSERT INTO sys_model_location_info (LOCATION_ID,TAG_NAME,DESCRIPTION,DOMAIN_ID,LOCATION_NO) VALUES %1;"; if(!KbdTableDataMgr::getInstance()->executeOnly(sql.arg(listLocation.join(",")))) { onMsg(tr("创建位置信息失败!")); return false; } return true; } bool SystemConfigWizard::createNode() { //写入节点配置信息 QStringList listSql; for(int i = 0;i < m_tableNode->rowCount();i++) { QString nodeName = m_tableNode->item(i,0)->text(); QString des = m_tableNode->item(i,1)->text(); QString nodeType = m_tableNode->item(i,2)->text().split(":").first(); QString location = m_tableNode->item(i,4)->text().split(":").first(); QString isUsed = m_tableNode->item(i,5)->text().split(":").first(); QString nicNum = m_tableNode->item(i,6)->text(); auto iter = m_mapNetworkCard.find(m_tableNode->item(i,0)); QString nicName,nicIP,nicNetMask,nicGateway; QString nic2Name,nic2IP,nic2NetMask,nic2Gateway; if(iter == m_mapNetworkCard.end()) return false; nicName = iter->at(0).at(0); nicIP = iter->at(0).at(1); nicNetMask = iter->at(0).at(2); nicGateway = iter->at(0).at(3); if(iter->size() == 2) { nic2Name = iter->at(1).at(0); nic2IP = iter->at(1).at(1); nic2NetMask = iter->at(1).at(2); nic2Gateway = iter->at(1).at(3); } QString sql = "insert into sys_model_node_info " "(NODE_NAME,LOCATION_ID,DESCRIPTION,NODE_TYPE,IS_USED,NIC_NUM,NIC1_NAME,NIC1_ADDRESS,NIC1_NETMASK,NIC1_GATEWAY,NIC2_NAME,NIC2_ADDRESS,NIC2_NETMASK,NIC2_GATEWAY)" "values ('%1','%2','%3','%4','%5','%6','%7','%8','%9','%10','%11','%12','%13','%14');"; listSql << sql.arg(nodeName).arg(location).arg(des).arg(nodeType).arg(isUsed).arg(nicNum) .arg(nicName).arg(nicIP).arg(nicNetMask).arg(nicGateway) .arg(nic2Name).arg(nic2IP).arg(nic2NetMask).arg(nic2Gateway); } if (m_tableDbNode->rowCount() > 1) { QString nodeName = "virtual-node"; QString des = "虚拟节点"; QString nodeType = "4"; QString location = "1"; QString isUsed = "1"; QString nicNum = QString::number(m_tableVirtualNode->rowCount()); QString nicName, nicIP, nicNetMask, nicGateway; QString nic2Name, nic2IP, nic2NetMask, nic2Gateway; nicName = "NIC1"; nicIP = m_tableVirtualNode->item(0,0)->text(); nicNetMask = m_tableVirtualNode->item(0, 1)->text(); nicGateway = m_tableVirtualNode->item(0, 2)->text(); if (nicNum == "2") { nic2Name = "NIC2"; nic2IP = m_tableVirtualNode->item(1, 0)->text(); nic2NetMask = m_tableVirtualNode->item(1, 1)->text(); nic2Gateway = m_tableVirtualNode->item(1, 2)->text(); } QString sql = "insert into sys_model_node_info " "(NODE_NAME,LOCATION_ID,DESCRIPTION,NODE_TYPE,IS_USED,NIC_NUM,NIC1_NAME,NIC1_ADDRESS,NIC1_NETMASK,NIC1_GATEWAY,NIC2_NAME,NIC2_ADDRESS,NIC2_NETMASK,NIC2_GATEWAY)" "values ('%1','%2','%3','%4','%5','%6','%7','%8','%9','%10','%11','%12','%13','%14');"; listSql << sql.arg(nodeName).arg(location).arg(des).arg(nodeType).arg(isUsed).arg(nicNum) .arg(nicName).arg(nicIP).arg(nicNetMask).arg(nicGateway) .arg(nic2Name).arg(nic2IP).arg(nic2NetMask).arg(nic2Gateway); } if(!KbdTableDataMgr::getInstance()->executeOnly(listSql)) { onMsg(tr("创建节点信息失败!")); return false; } return true; } bool SystemConfigWizard::createDeploy() { QStringList listNode; for(int i = 0;i < m_tableNode->rowCount();i++) { QString nodeType = m_tableNode->item(i,2)->text().split(":").first(); QString deployType = m_tableNode->item(i,3)->text().split(":").first(); QString bUse = m_tableNode->item(i,5)->text().split(":").first(); if(bUse == "0") continue; if(nodeType == "2") { if(deployType == "0") listNode.insert(0,m_tableNode->item(i,0)->text()); else listNode << m_tableNode->item(i,0)->text(); } } if(listNode.empty()) { onMsg(tr("未配置有效应用服务器节点!")); return false; } QStringList listSql; QString nodeNum = QString::number(listNode.size()); while(listNode.size() < 8) listNode << QString(); bool success; QString sql; sql = "insert into sys_model_deploy_info (DOMAIN_ID,APP_ID,DESCRIPTION,NUM,NODE1,NODE2,NODE3,NODE4,NODE5,NODE6,NODE7,NODE8)" \ "values ('1','%1','%2','%3','%4','%5','%6','%7','%8','%9','%10','%11');"; listSql << sql.arg("2").arg("公共应用").arg(nodeNum).arg(listNode.at(0)).arg(listNode.at(1)).arg(listNode.at(2)) .arg(listNode.at(3)).arg(listNode.at(4)).arg(listNode.at(5)).arg(listNode.at(6)).arg(listNode.at(7)); listSql << sql.arg("3").arg("通用应用").arg(nodeNum).arg(listNode.at(0)).arg(listNode.at(1)).arg(listNode.at(2)) .arg(listNode.at(3)).arg(listNode.at(4)).arg(listNode.at(5)).arg(listNode.at(6)).arg(listNode.at(7)); listSql << sql.arg("4").arg("电力监控").arg(nodeNum).arg(listNode.at(0)).arg(listNode.at(1)).arg(listNode.at(2)) .arg(listNode.at(3)).arg(listNode.at(4)).arg(listNode.at(5)).arg(listNode.at(6)).arg(listNode.at(7)); success = KbdTableDataMgr::getInstance()->executeOnly(listSql); if(!success) { onMsg(tr("创建域节点失败!")); return false; } return true; } bool SystemConfigWizard::createDbNode() { QStringList listSql; QString sql = "insert into sys_model_dbconfig_node (NODE_NAME,DB_TYPE,DB_SERVICE_NAME,USER_NAME,USER_PASSWORD,NIC_CUR_ID,DB_NAME,DB_HOST_PRIOR,IS_DB_SWITCH,IS_DIRECT_ACCESS,DB_PORT)" \ "values ('%1','%2','%3','%4','%5','1','%6','1','1','1','%7');"; for(int i = 0;i < m_tableDbNode->rowCount();i++) { QString dbName = m_tableDbNode->item(i,0)->text().split(":").first(); QString nodeName = m_tableDbNode->item(i,1)->text().split(":").first(); QString dbType = m_tableDbNode->item(i,2)->text().split(":").first(); QString dbServerName = m_tableDbNode->item(i,3)->text(); QString userName = m_tableDbNode->item(i,4)->text(); QString userPass = m_tableDbNode->item(i,5)->text(); QString dbPort = m_tableDbNode->item(i,6)->text(); listSql << sql.arg(nodeName).arg(dbType).arg(dbServerName).arg(userName).arg(userPass).arg(dbName).arg(dbPort); if (dbName == "0" && m_tableDbNode->rowCount() > 1) { listSql << sql.arg("virtual-node").arg(dbType).arg(dbServerName).arg(userName).arg(userPass).arg("1").arg(dbPort); } } if(!KbdTableDataMgr::getInstance()->executeOnly(listSql)) { onMsg(tr("创建数据库节点失败!")); return false; } return true; } bool SystemConfigWizard::createDbDomain() { QStringList listNode; for(int i = 0;i < m_tableDbNode->rowCount();i++) { listNode << m_tableDbNode->item(i,1)->text().split(":").first(); } QString sql; if(listNode.size() == 1) { sql = QString("insert into sys_model_dbconfig_domain (DOMAIN_ID,FIRST_CONNECT,NUM1,LOCAL1)" \ "values ('1','%1','1','%1');").arg(listNode.at(0)); } else { int nodeNum = listNode.size(); while(listNode.size() < 4) listNode << QString(); sql = QString("insert into sys_model_dbconfig_domain (DOMAIN_ID,FIRST_CONNECT,NUM1,LOCAL1,LOCAL2,LOCAL3,LOCAL4)" \ "values ('1','%1','%2','%3','%4','%5','%6');").arg("virtual-node").arg(nodeNum).arg(listNode.at(0)) .arg(listNode.at(1)).arg(listNode.at(2)).arg(listNode.at(3)); } if(!KbdTableDataMgr::getInstance()->executeOnly(sql)) { onMsg(tr("创建数据库部署失败!")); return false; } return true; } void SystemConfigWizard::onMsg(const QString &text) { N_MessageBox::information(this,tr("消息"),text); } CboxDelegate::CboxDelegate(QList listBoxData,QObject *parent) : QItemDelegate(parent) { m_cbBoxData = listBoxData; } CboxDelegate::~CboxDelegate() { } QWidget* CboxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &,const QModelIndex &) const { QComboBox* cbBox = new QComboBox(parent); cbBox->setView(new QListView); for(int i = 0;i < m_cbBoxData.size();i++) cbBox->addItem(m_cbBoxData[i].first(),m_cbBoxData[i].last()); return cbBox; } void CboxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString strValue = index.data().toString(); QComboBox *cb = static_cast(editor); cb->setCurrentText(strValue); } void CboxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QComboBox *cb = static_cast(editor); model->setData(index,cb->currentText()); model->setData(index,cb->currentData(),Qt::UserRole); } ClineEditDelegate::ClineEditDelegate(int length,QString regExp,QObject *parent) : QItemDelegate(parent) { m_length = length; m_regExp = regExp; } ClineEditDelegate::~ClineEditDelegate() { } QWidget * ClineEditDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &,const QModelIndex &) const { QLineEdit* lintEdit = new QLineEdit(parent); lintEdit->setMaxLength(m_length); lintEdit->setValidator(new KbdRegExpValidator(m_regExp, lintEdit)); return lintEdit; } void ClineEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString strValue = index.data().toString(); QLineEdit *lintEdit = static_cast(editor); lintEdit->setText(strValue); } void ClineEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QLineEdit *lintEdit = static_cast(editor); model->setData(index,lintEdit->text()); }