240717班级,工业化控制系统,煤矿相关行业,昆仑系统
Administrator
2024-11-05 7771cfa2ee187ea9777d5725b75c58e3b49b791c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
#include "versionmanage.h"
#include "ui_versionmanage.h"
#include<QDateTime>
#include<QThread>
 
VersionManage::VersionManage(QWidget *parent)
    :QMainWindow(parent)
{
    //Tcp链接
    m_client=new QTcpSocket(this);
    m_client->connectToHost("127.0.0.1",16888);
    if(m_client->waitForConnected()){
        qDebug()<<"conn ok!";
        connect(m_client,SIGNAL(readyRead()),this,SLOT(myRead()));
 
    }else{
         qDebug()<<"conn fail or waiting for conn";
    }
 
    //向客户端发送版本号请求
    sendVersionNumReq();
 
    /*创建一个中央窗口部件 centralWidget,并将其作为当前窗口的子控件。
    设置一个垂直布局 layout 到 centralWidget 上,
    使得任何添加到 layout 的子控件都会在 centralWidget 中从上到下排列。*/
    QWidget *centralWidget=new QWidget(this);
    QVBoxLayout *layout=new QVBoxLayout(centralWidget);
 
    //获取当前工作目录
    QString currentPath=QDir::currentPath();
    qDebug()<<"当前工作路径:"<<currentPath;
 
    //文件导入按钮和文件名标签创建
    QPushButton *importButton=new QPushButton(tr("导入文件"),this);
    connect(importButton,&QPushButton::clicked,this,&VersionManage::importFile);
    fileNameLabel=new QLabel(tr("未选择文件"),this);
    orignalPathLabel=new QLabel(tr("未选择文件路径"),this);
 
    //版本号和路径编辑框初始化
    currVersionEdit=new QLineEdit(this);
    clientPathEdit=new QLineEdit(this);
    serverPathEdit=new QLineEdit(this);
    versionDescriptionEdit = new QTextEdit(this);
    //prevVersionEdit=new QLineEdit(this);
 
    //老版本组合下拉框,各种占位符设计
    prevVersionComboBox=new QComboBox(this);
    prevVersionComboBox->addItem(tr("上一个版本号"));
 
    //prevVersionEdit->setPlaceholderText(tr("上一个版本号"));
    currVersionEdit->setPlaceholderText(tr("当前版本号"));
    clientPathEdit->setPlaceholderText(tr("客户端路劲"));
    serverPathEdit->setPlaceholderText(tr("服务器路径"));
    versionDescriptionEdit->setPlaceholderText(tr("请输入新版本描述"));
 
    //添加版本的按钮,到表格
    QPushButton *addButton =new QPushButton(tr("添加"),this);
    connect(addButton,&QPushButton::clicked,this,&VersionManage::addFileInfo);
 
    //布局上半部分
    layout->addWidget(prevVersionComboBox);
    prevVersionComboBox->setStyleSheet("font-size: 22px;");
    layout->addWidget(currVersionEdit);
    currVersionEdit->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    layout->addWidget(serverPathEdit);
    serverPathEdit->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    layout->addWidget(versionDescriptionEdit);
    versionDescriptionEdit->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    //自动填写服务端路径
    connect(currVersionEdit,&QLineEdit::textChanged,
            this,[this](const QString &text){
        serverPathEdit->setText("./version/"+text);
    });
    layout->addWidget(importButton);
    importButton->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    layout->addWidget(fileNameLabel);
    fileNameLabel->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    layout->addWidget(orignalPathLabel);
    orignalPathLabel->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    layout->addWidget(clientPathEdit);
    clientPathEdit->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    layout->addWidget(addButton);
    addButton->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
 
    //下半部分表格创建
    fileTable=new QTableWidget(0,7,this);
    fileTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
    fileTable->setHorizontalHeaderLabels({tr("文件名"), tr("文件大小"), tr("上一个版本号"), tr("当前版本号"), tr("文件原始路径"), tr("客户端路径"), tr("服务器路径")});
    QPushButton *savebutton=new QPushButton(tr("保存至数据库"),this);
    connect(savebutton,&QPushButton::clicked,this,&VersionManage::saveToDisk);
 
    layout->addWidget(fileTable);
    fileTable->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
    layout->addWidget(savebutton);
    savebutton->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px;");
 
    QPushButton* deleteButton=new QPushButton(tr("删除一个文件"),this);
    deleteButton->setStyleSheet("font-family: 'Microsoft YaHei'; font-size: 22px");
    connect(deleteButton,&QPushButton::clicked,this,[&](){
        int currrow=fileTable->currentRow();
        if(currrow!=-1){
            fileTable->removeRow(currrow);
        }
    });
    layout->addWidget(deleteButton);
    //窗口
    resize(1500, 800);
    setCentralWidget(centralWidget);
 
 
}
 
// 发送版本号请求
void VersionManage::sendVersionNumReq()
{
    VersionNumReq req;
    int len = m_client->write((char*)&req,req.head.len);
    qDebug()<<"len:"<<len;
 
}
 
//导入文件功能
void VersionManage::importFile()
{   //打开文件对话框
    importedFilePath=QFileDialog::getOpenFileName(this,
              tr("选择文件"),"",tr("所有文件(*)"));
    if(!importedFilePath.isEmpty()){
        QFileInfo fileInfo(importedFilePath);
        fileNameLabel->setText(fileInfo.fileName());    //显示文件名+路径
        orignalPathLabel->setText(importedFilePath);
        clientPathEdit->setText(importedFilePath);
        serverPathEdit->setText(importedFilePath);
 
    }
}
 
void VersionManage::addFileInfo()
{
    if(importedFilePath.isEmpty()){
        return ;
    }
    int rowCount=fileTable->rowCount();
    fileTable->insertRow(rowCount);
 
    QFileInfo fileInfo(importedFilePath);
    fileTable->setItem(rowCount,0,new QTableWidgetItem(fileInfo.fileName()));
    qDebug()<<fileInfo.size();
    fileTable->setItem(rowCount,1,new QTableWidgetItem(QString::number(fileInfo.size())));
    fileTable->setItem(rowCount,2,new QTableWidgetItem(prevVersionComboBox->currentText()));//**
    fileTable->setItem(rowCount,3,new QTableWidgetItem(currVersionEdit->text()));
    fileTable->setItem(rowCount,4,new QTableWidgetItem(orignalPathLabel->text()));
    fileTable->setItem(rowCount,5,new QTableWidgetItem(clientPathEdit->text()));
    fileTable->setItem(rowCount,6,new QTableWidgetItem(serverPathEdit->text()));
 
    //添加到表格,清空内容
    //prevVersionComboBox->clear();
    //currVersionEdit->clear();
    //serverPathEdit->clear();
    clientPathEdit->clear();
    fileNameLabel->clear();
    orignalPathLabel->clear();
    importedFilePath.clear();
}
 
//将表格中的文件另存为指定地点
void VersionManage::saveToDisk()
{
    if(fileTable->rowCount()!=0){
        for(int row=0;row<fileTable->rowCount();++row){
            QString saveDirectory = fileTable->item(row, 6)->text();//服务器地址
            QString fileName = fileTable->item(row, 0)->text();
            QString sourceFilePath = fileTable->item(row, 4)->text();  //客户文件原路径
//          QString destinationFilePath = saveDirectory + "/" + fileName;
 
            QFile fl(sourceFilePath);   //打开本地文件(版本跟信号的文件)
            qDebug()<< "打开前";
            qDebug()<< sourceFilePath;
            if(fl.open(QIODevice::ReadOnly)){
 
                //QFile::copy(sourceFilePath,destinationFilePath);
                qDebug()<< "打开前";
                long long all_size = fl.size() + sizeof(UploadFileReq);//总大小把控info了
                UploadFileReq *req=(UploadFileReq*) (new char[all_size]);
                req->head.type=UPLOAD_FILE_REQ;
                req->head.len==all_size;
                req->fileInfo.fileSize=fl.size();
                strcpy(req->fileInfo.s_filepath,saveDirectory.toLocal8Bit().data());
                qDebug()<<"s_filepath:"<< req->fileInfo.s_filepath;
                strcpy(req->fileInfo.fileName,fileName.toLocal8Bit().data());
                memcpy(req->fileInfo.content,fl.readAll().data(),fl.size());
                //组包完成,发包
                qDebug()<<m_client->write((char*)req,req->head.len);
                m_client->flush();  //立即发送
                m_client->waitForBytesWritten(); //同步等待数据写入完成
 
                delete req;
                qDebug()<<"发送数据库成功!";
                fl.close();
 
                //等待回应
                qDebug()<<"waiting for 8 seconds...";
                QThread::sleep(8);
                qDebug()<<"Done waiting";
 
                //数据库信息录入,版本信息条目
               VersionInfoEntryReq *req_2=new VersionInfoEntryReq;
               strcpy_s(req_2->versionId,currVersionEdit->text().toLocal8Bit().data());
               strcpy_s(req_2->versionIdOld,prevVersionComboBox->currentText().toLocal8Bit().data());
               req_2->fileNum=fileTable->rowCount();
 
               QString str=serverPathEdit->text()+versionDescriptionEdit->toPlainText()
                       +QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
               for(int i=0;i<fileTable->rowCount();++i){
                   str+=fileTable->item(i,0)->text()+fileTable->item(i,1)->text()+fileTable->item(i,5)->text();
               }
               strcpy(req_2->context,str.toLocal8Bit().data());//_s 保护
               qDebug()<<"len:"<<m_client->write((char*)req_2,req_2->head.len);
 
               fileTable->setRowCount(0);
            }
 
 
        }
    }
}
 
void VersionManage::myRead()
{
    QByteArray buffer=m_client->readAll();
    qDebug()<<"buffer:"<<buffer;
    //心跳检查
    //解包
    int type=((Head*)buffer.data())->type;
    if(type==VERSION_NUM_RES){
        //版本号相应
    }
    else if(type==UPLOAD_FILE_RES){}
}