240717班级,工业化控制系统,煤矿相关行业,昆仑系统
lzz
2024-11-07 edd4466fdad20fcf50a7c30569ba7ce11f262914
Merge branch 'master' of ssh://115.28.86.8:29418/~admin/昆仑_1025
10个文件已修改
27个文件已添加
1 文件已重命名
1个文件已删除
3255 ■■■■■ 已修改文件
Client/冀浩昶/log/日志_冀浩昶_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/刘子航/log/日志_刘子航_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/宋昊昳/log/日志_宋昊昳_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/clientmainwindow.cpp 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/clientmainwindow.h 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/clientmainwindow.ui 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/common.h 1062 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/kunlunclient.pro 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/kunlunclient.pro.user 806 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/logquery.cpp 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/logquery.h 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/logquery.ui 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/kunlunclient/main.cpp 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/服务端/LogSearch.cpp 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/code/服务端/LogSearch.h 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/朱航/log/朱航1105.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/李宵增/log/历史查询_李宵增_1104.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/李宵增/log/历史查询_李宵增_1105.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/王鑫鑫/log/日志_王鑫鑫_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/申烜/log/日志_申烜_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/郑凯文/log/郑凯文1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/黎弘霖/log/设备管理_黎弘霖_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/龚启祥/log/日志模板_龚启祥_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/code/ConnectionPool.cpp 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/code/ConnectionPool.h 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/code/MysqlConn.cpp 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/code/MysqlConn.h 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/log/日志模板_王琨元_1101.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/log/日志模板_王琨元_1103 .doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/log/日志模板_王琨元_1104.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/log/日志模板_王琨元_1105.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/王琨元/log/日志模板_王琨元_1106.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/陈楚丹/log/日志_陈楚丹_1105.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/马渝杭/log/20241106昆仑日报.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/马渝杭/log/日志_马渝杭_20241106.doc 补丁 | 查看 | 原始文档 | blame | 历史
common.h 125 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
kunlun.sql 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
~$表.docx 补丁 | 查看 | 原始文档 | blame | 历史
表.docx 补丁 | 查看 | 原始文档 | blame | 历史
Client/¼½ºÆêÆ/log/ÈÕÖ¾_¼½ºÆêÆ_1106.doc
Binary files differ
Client/Áõ×Óº½/log/ÈÕÖ¾_Áõ×Óº½_1106.doc
Binary files differ
Client/ËÎ껕i/log/ÈÕÖ¾_ËÎ껕i_1106.doc
Binary files differ
Client/Ö캽/code/kunlunclient/clientmainwindow.cpp
New file
@@ -0,0 +1,52 @@
#include "clientmainwindow.h"
#include "ui_clientmainwindow.h"
#include <QDebug>
#pragma execution_character_set("utf-8")
ClientMainWindow::ClientMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ClientMainWindow)
{
    ui->setupUi(this);
    m_client = new QTcpSocket(this);
    m_client->connectToHost("127.0.0.1",16888);
    if(m_client->waitForConnected()){
        qDebug()<<"conn success";
        //关联收包槽
        connect(m_client,SIGNAL(readyRead()),this,SLOT(myRead()));
        //调用界面初始化
        initUi();
    }else{
        qDebug()<<"conn fail:"<<m_client->errorString();
    }
}
ClientMainWindow::~ClientMainWindow()
{
    delete ui;
}
void ClientMainWindow::initUi()
{
    //m_logSer = new LogQuery(this);
    m_logSer = new LogQuery(m_client,this);
    ui->tabWidget->addTab(m_logSer,"日志查询");
    connect(this,SIGNAL(queryResSignal(LogQueryRes*)),m_logSer,SLOT(queryResSlot(LogQueryRes*)));
}
void ClientMainWindow::myRead()
{
    QByteArray buffer = m_client->readAll();
    qDebug()<< "buffer.size():"<<buffer.size();
    qDebug()<< "buffer:"<<buffer;
    int type = ((Head*)buffer.data())->type;
    qDebug()<<"type:"<<type;
    if(type == LOGSEARCH_RES){
        LogQueryRes *res = (LogQueryRes*)buffer.data();
        qDebug()<< "status:"<<res->status;
        emit queryResSignal(res);//发信号给日志查询界面
    }
}
Client/Ö캽/code/kunlunclient/clientmainwindow.h
New file
@@ -0,0 +1,34 @@
#ifndef CLIENTMAINWINDOW_H
#define CLIENTMAINWINDOW_H
#include <QMainWindow>
#include "logquery.h"
#include "common.h"
#include <QTcpSocket>
#pragma execution_character_set("utf-8")
namespace Ui {
class ClientMainWindow;
}
class ClientMainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit ClientMainWindow(QWidget *parent = 0);
    ~ClientMainWindow();
    void initUi();
signals:
    void queryResSignal(LogQueryRes *);//日志查询响应信号
private slots:
    void myRead();
private:
    Ui::ClientMainWindow *ui;
    LogQuery *m_logSer;
    QTcpSocket *m_client;
};
#endif // CLIENTMAINWINDOW_H
Client/Ö캽/code/kunlunclient/clientmainwindow.ui
New file
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>ClientMainWindow</class>
 <widget class="QMainWindow" name="ClientMainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>663</width>
    <height>537</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>ClientMainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QTabWidget" name="tabWidget">
      <property name="currentIndex">
       <number>1</number>
      </property>
      <widget class="QWidget" name="tab">
       <attribute name="title">
        <string>实时大屏</string>
       </attribute>
      </widget>
      <widget class="QWidget" name="tab_2">
       <attribute name="title">
        <string>系统设置</string>
       </attribute>
      </widget>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>663</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>
Client/Ö캽/code/kunlunclient/common.h
New file
@@ -0,0 +1,1062 @@
#ifndef COMMON_H
#define COMMON_H
#include <string.h>
enum TypeInfo {
    //注册登录
    LOGIN_REQ, // ç™»å½•请求
    LOGIN_RES, // ç™»å½•响应
    REGISTER_REQ, //注册请求
    REGISTER_RES, //注册响应
    RESET_REQ, //重置密码请求
    RESET_RES, //重置密码响应
    //权限管理
    QUERY_PMS_REQ,      // æŒ‰å‘˜å·¥ç¼–号、名字或职位查询人员权限信息请求
    UPDATE_PMS_REQ,     // æŒ‰è§’色id更新权限信息请求
    QUERY_PMS_RES,      // æŸ¥è¯¢äººå‘˜å’Œè§’色信息的响应结构体
    UPDATE_PMS_RES,     // æƒé™æ›´æ–°ç»“果响应体
    //设备管理
    AD_REQ,//添加设备请求
    AD_RES,//添加设备响应
    MD_REQ,//修改设备请求
    MD_RES,//修改设备响应
    QD_REQ,//查询设备请求
    QD_RES,//查询设备响应
    //地图标注
    MML_REQ,//地图标注加载请求
    MML_RES,//地图标注加载响应
    MMI_REQ,//地图标注插入请求
    MMI_RES,//地图标注插入响应
    MMD_REQ,//地图标注删除请求
    MMD_RES,//地图标注删除响应
    //大屏显示
    ENVIRONMENT_REQ,//环境数据请求
    ENVIRONMENT_RES,//环境数据响应
    DEVICESTATUS_REQ,//设备状态请求
    DEVICESTATUS_RES,//设备状态响应
    MOVEMENTRECORD_REQ,//操作日志请求
    MOVEMENTRECORD_RES,//操作日志响应
    ALARMRECORD_REQ,//警报记录请求
    ALARMRECORD_RES,//警报记录响应
    YIELD_REQ,//煤矿产量请求
    YIELD_RES,//煤矿产量响应
    //警报管理
    WARNING_REQ, // è­¦æŠ¥è¯·æ±‚
    WARNING_RES, // è­¦æŠ¥å“åº”
    //生产计划管理
    ADD_PDPLAN_REQ,//添加一条生产计划的请求结构体
    ADD_PDPLAN_RES,//添加一条生产计划的响应结构体
    DEL_PDPLAN_REQ,//删除一条生产计划的请求结构体
    DEL_PDPLAN_RES,//删除一条生产计划的响应结构体
    UPDATE_PDPLAN_REQ,//更改一条生产计划的请求结构体
    UPDATE_PDPLAN_RES,//更改一条生产计划的响应结构体
    QUERY_PDPLAN_REQ,//查询一条生产计划的请求结构体
    QUERY_PDPLAN_RES,//查询一条生产计划的响应结构体
    ADD_MONOUTPUT_REQ,//添加月产量的请求结构体
    ADD_MONOUTPUT_RES,//添加月产量的响应结构体
    DEL_MONOUTPUT_REQ,//删除月产量的请求结构体
    DEL_MONOUTPUT_RES,//删除月产量的响应结构体
    UPDATE_MONOUTPUT_REQ,//更新月产量的请求结构体
    UPDATE_MONOUTPUT_RES,//更新月产量的响应结构体
    QUERY_MONOUTPUT_REQ,//查询月产量的请求结构体
    QUERY_MONOUTPUT_RES,//查询月产量的响应结构体
    //自动升级
    VERSION_NUM_REQ,  // ç‰ˆæœ¬å·è¯·æ±‚
    VERSION_NUM_RES,   // ç‰ˆæœ¬å·å“åº”
    UPLOAD_FILE_REQ, // ä¸Šä¼ æ–‡ä»¶çš„请求
    UPLOAD_FILE_RES, // ä¸Šä¼ æ–‡ä»¶çš„响应
    VERSION_INFOENTRY_REQ,       // ç‰ˆæœ¬ä¿¡æ¯å½•入请求
    VERSION_INFOENTRY_RES,       //版本信息录入响应
    VERSION_UPDATE_REQ, // ç‰ˆæœ¬æ›´æ–°è¯·æ±‚
    VERSION_UPDATE_RES, // ç‰ˆæœ¬æ›´æ–°å“åº”
    FILE_DOWNLOADS_REQ, // ç‰ˆæœ¬æ›´æ–°æ–‡ä»¶ä¸‹è½½è¯·æ±‚
    FILE_DOWNLOADS_RES, // ç‰ˆæœ¬æ›´æ–°æ–‡ä»¶ä¸‹è½½å“åº”
    DOWNLOAD_SUCCESSFULLY_RES,       // æ›´æ–°æ–‡ä»¶ä¸‹è½½æˆåŠŸçš„å“åº”
    //日志
    LOGSEARCH_REQ,//日志查询请求
    LOGSEARCH_RES,//日志查询响应
};
struct Head {
    int type;
    int len;
};
//注册登录
//登录请求
struct LoginReq
{
    Head head;
    char userName[32];
    char password[32];
    LoginReq() {
        head.type = LOGIN_REQ;
        head.len = sizeof(LoginReq);
    }
};
struct Permission
{
    int admin;//超级管理员
    int loggerSearch; //日志查询
    int queryHistory; //历史记录
    int mapMark;//地图
    int versionManage; // ç‰ˆæœ¬ç®¡ç†
    int warning; //警报
    int devManage; //设备管理
    int productPlan;//生产计划
    char roleName[32]; // è§’色名
};
//登录响应
struct LoginRes
{
    Head head;
    char userName[32];
    int status; // ç™»å½•状态
    // ç™»å½•成功时,该账号对应的权限组合
    Permission per;
    LoginRes()
    {
        head.type = LOGIN_RES;
        head.len = sizeof(LoginRes);
    }
};
//注册请求
struct RegisterReq
{
    Head head;
    char userName[32];
    char password[32];
    char email[50];
    char capcha[10];//验证码
    char telephone[32];
    RegisterReq() {
        head.type = REGISTER_REQ;
        head.len = sizeof(RegisterReq);
    }
};
//注册响应
struct RegisterRes
{
    Head head;
    char userName[32];
    int status; // æ³¨å†ŒçŠ¶æ€
    RegisterRes()
    {
        head.type = REGISTER_RES;
        head.len = sizeof(RegisterRes);
    }
};
//重置密码请求
struct ResetReq
{
    Head head;
    char email[50];
    char capcha[10];//验证码
    char password[32];//新密码
    char confirmPassword[32];//确认密码
    ResetReq() {
        head.type = RESET_REQ;
        head.len = sizeof(ResetReq);
    }
};
//重置密码响应
struct ResetRes
{
    Head head;
    char user_name[32];
    int status; // é‡ç½®å¯†ç çŠ¶æ€
    ResetRes()
    {
        head.type = RESET_RES;
        head.len = sizeof(ResetRes);
    }
};
//权限管理
// æŒ‰å‘˜å·¥ç¼–号、名字或职位查询人员权限信息请求
 struct QueryPmsReq {
    Head head;
    char userNo[32];
    char name[32];
    char permissonType[32];
    QueryPmsReq() {
        head.type = QUERY_PMS_REQ;
        memset(userNo, 0, 32);
        memset(permissonType, 0, 32);
        memset(name, 0, 32);
        head.len = sizeof(QueryPmsReq);
    }
};
// æŒ‰è§’色id更新权限信息请求
struct UpdatePmsReq {
    Head head;
    // äººå‘˜è¡¨ä¸»é”®id
    int id;
    int queryHistory;
    int loggerSearch;
    int mapMark;
    int devManage;
    int productPlan;
    int warningManage;
    int versionManage; //版本管理
    int admin; //系统管理员
    UpdatePmsReq() {
        head.type = QUERY_PMS_RES;
        head.len = sizeof(UpdatePmsReq);
    }
} ;
// å•个人员和权限联合查询结构体
 struct PmsRes {
    int queryHistory;
    int loggerSearch;
    int mapMark;
    int devManage;
    int productPlan;
    int id;
    char userNo[32];
    char name[32];
    char permissonType[32];  // è§’色类型
    int versionManage; //版本管理
    int admin; //系统管理员
    char department[32];
    char loginTime[32];
    char registerTime[32];
};
// æŸ¥è¯¢äººå‘˜å’Œè§’色信息的响应结构体
 struct QueryPmsRes {
    Head head;
    int success; // 1为成功 ,0为失败
    PmsRes pmsList[0];
    QueryPmsRes() {
        head.type = QUERY_PMS_REQ;
    }
};
// æƒé™æ›´æ–°ç»“果响应体
struct UpdatePmsRes {
    Head head;
    int success; // 1为成功 ,0为失败
    UpdatePmsRes() {
        head.type = UPDATE_PMS_RES;
        head.len = sizeof(UpdatePmsRes);
    }
};
//设备管理
struct DevicesInfo
{
    int deviceID;
    char deviceName[32];//设备名称
    char deviceStatus[32];//设备状态
    char manufacturer[100];//厂家
    char devicesType[32];//设备类型
    double longitude;//经度
    double latitude;//纬度
    char purchasingTime[15];//购买时间
    char installTime[15];//安装时间
    char devicesSerialNumber[32];//设备编码
};
//添加设备
struct ADReq//添加请求
{
    Head head;
    char deviceName[32];
    ADReq() {
        head.type = AD_REQ;
        head.len = sizeof(ADReq);
    }
};
struct ADRes//添加响应
{
    Head head;
    int type;
    ADRes() {
        head.type = AD_RES;
        head.len = sizeof(ADRes);
    }
};
//修改设备
struct MDRes//修改请求
{
    Head head;
    DevicesInfo info;
    MDRes() {
        head.type = MD_RES;
        head.len = sizeof(MDRes);
    }
};
struct MDReq//修改响应
{
    Head head;
    int type;
    MDReq() {
        head.type = MD_REQ;
        head.len = sizeof(MDReq);
    }
};
//查询设备
struct QDReq//查询请求
{
    Head head;
    DevicesInfo info;
    QDReq() {
        head.type = QD_REQ;
        head.len = sizeof(QDReq);
    }
};
struct QDRes//查询响应
{
    Head head;
    int type;
    QDRes() {
        head.type = QD_RES;
        head.len = sizeof(QDRes);
    }
};
//地图标注
struct MarkInfo
{
    int markId;//标注点id
    double latitude;//纬度
    double longitude;//经度
    int deviceId;//设备ID
    int deviceStatus;//设备状态
    char deviceName[32];//设备名称
};
//地图标注加载请求
struct MMLReq//地图
{
    Head head;
    MMLReq() {
        head.type = MML_REQ;
        head.len = sizeof(MMLReq);
    }
};
//地图标注加载响应:
struct MMLRes
{
    Head head;
    int status;//操作状态
    MarkInfo info[0];
    MMLRes() {
        head.type = MML_RES;
        head.len = sizeof(MMLRes);
    }
};
//地图标注插入请求
struct MMIReq//地图
{
    Head head;
    MarkInfo info[0];
    MMIReq() {
        head.type = MMI_REQ;
        head.len = sizeof(MMIReq);
    }
};
//地图标注插入响应:
struct MMIRes
{
    Head head;
    int status;//操作状态
    MarkInfo info[0];
    MMIRes() {
        head.type = MMI_RES;
        head.len = sizeof(MMIRes);
    }
};
//地图标注删除请求
struct MMDReq//地图
{
    Head head;
    MarkInfo info[0];
    MMDReq() {
        head.type = MMD_REQ;
        head.len = sizeof(MMDReq);
    }
};
//地图标注删除响应:
struct MMDRes
{
    Head head;
    int status;//操作状态
    MarkInfo info[0];
    MMDRes() {
        head.type = MMD_RES;
        head.len = sizeof(MMDRes);
    }
};
//大屏显示
//环境数据请求
struct EnvironmentReq
{
    Head head;
    EnvironmentReq() {
        head.type = ENVIRONMENT_REQ;
        head.len = sizeof(EnvironmentReq);
    }
};
//环境数据响应
struct Environment
{
    double longitude;//经度
    double latitude;//纬度
    float temp;//温度
    float humidity;//湿度
    float oxygen;//氧气浓度
    float carbon;//一氧化碳浓度
};
struct EnvironmentRes
{
    Head head;
    int status;
    Environment environment[0];
    EnvironmentRes() {
        head.type = ENVIRONMENT_RES;
        head.len = sizeof(EnvironmentRes);
    }
};
//设备状态请求
struct DeviceStatusReq
{
    Head head;
    DeviceStatusReq() {
        head.type = DEVICESTATUS_REQ;
        head.len = sizeof(DeviceStatusReq);
    }
};
//设备状态响应
struct DeviceStatus
{
    double longitude;//经度
    double latitude;//纬度
    int deviceID;//设备编号
    char deviceName[32];//设备名称
    char deviceStatus[32];//设备状态
};
struct DeviceStatusRes
{
    Head head;
    int status;
    DeviceStatus deviceStatus[0];
    DeviceStatusRes() {
        head.type = DEVICESTATUS_RES;
        head.len = sizeof(DeviceStatusRes);
    }
};
//操作日志请求
struct MovementRecordReq
{
    Head head;
    MovementRecordReq() {
        head.type = MOVEMENTRECORD_REQ;
        head.len = sizeof(MovementRecordReq);
    }
};
//操作日志响应
struct MovementRecord
{
    double longitude;//经度
    double latitude;//纬度
    char userName;//操作用户名
    char operateTime[32];//操作时间
    char deviceName[32];//操作设备
    char movement[256];//操作描述
};
struct MovementRecordRes
{
    Head head;
    int status;
    MovementRecord movementRecord[0];
    MovementRecordRes() {
        head.type = MOVEMENTRECORD_RES;
        head.len = sizeof(MovementRecordRes);
    }
};
//警报记录请求
struct AlarmRecordReq
{
    Head head;
    AlarmRecordReq() {
        head.type = ALARMRECORD_REQ;
        head.len = sizeof(AlarmRecordReq);
    }
};
//警报记录响应
struct AlarmRecord
{
    double longitude;//经度
    double latitude;//纬度
    char alarmTime[32];//警报时间
    char alarmtype[32];//处理时间
    char alarmContent[256];//警报内容
};
struct AlarmRecordRes
{
    Head head;
    int status;
    AlarmRecord alarmRecord[0];
    AlarmRecordRes() {
        head.type = ALARMRECORD_RES;
        head.len = sizeof(AlarmRecordRes);
    }
};
//煤矿产量请求
struct YieldReq
{
    Head head;
    YieldReq() {
        head.type = YIELD_REQ;
        head.len = sizeof(YieldReq);
    }
};
//煤矿产量响应
struct Yield
{
    int month;//月份
    int output;//产量
};
struct YieldRes
{
    Head head;
    int status;
    Yield yield[0];
    YieldRes() {
        head.type = YIELD_RES;
        head.len = sizeof(YieldRes);
    }
};
//警报管理
// è­¦æŠ¥è¯·æ±‚结构体
struct WarningReq {
    Head head;
    float oxygenWarning;
    float carbonWarning;
    float tempWarning;
    float humidityWarning;
    WarningReq() {
        head.type = WARNING_REQ;
        head.len = sizeof(WarningReq);
    }
};
struct DataThreshold {
    //阈值
    float oxygenThreshold;
    float carbonThreshold;
    float tempThreshold;
    float humidityThreshold;
};
struct Data {
    float oxygen;   // æ°§æ°”浓度
    float carbon;   // ä¸€æ°§åŒ–碳浓度
    float temp;     // æ¸©åº¦
    float humidity; // æ¹¿åº¦
};
// è­¦æŠ¥å“åº”结构体
struct WarningRes {
    Head head;
    int status;         // å“åº”状态(比如 0 è¡¨ç¤ºæˆåŠŸï¼Œ1 è¡¨ç¤ºå¤±è´¥ç­‰ï¼‰
    const char* message; // å“åº”消息描述
    WarningRes(int stat, const char* msg) {
        head.type = WARNING_RES;
        head.len = sizeof(WarningRes);
        status = stat;
        message = msg;
    }
};
//生产计划管理
struct PdplanInfo
{
    int planId;//订单编号
    char planName[32];//订单名字
    char startDate[32];//起始日期
    char closingDate[32];//交付日期
    char pdName[8];//产品名
    double plannedPd;//计划生产量
    double actualPd;//实际生产量
    double progress;//生产进度
    int finishOntime;//是否按期完成
};
struct MonoutputInfo
{
    int month;//月份
    double aOutput;//a产品月产量
    double bOutput;//b产品月产量
    double cOutput;//c产品月产量
};
//添加一条生产计划的请求结构体
struct AddPdplanReq
{
    Head head;
    PdplanInfo info[0];
    AddPdplanReq() {
        head.type = ADD_PDPLAN_REQ;
        head.len = sizeof(AddPdplanReq);
    }
};
//添加一条生产计划的响应结构体
struct AddPdplanRes
{
    Head head;
    int status;//表示是否添加成功,0否1是
    AddPdplanRes() {
        head.type = ADD_PDPLAN_RES;
        head.len = sizeof(AddPdplanRes);
    }
};
//删除一条生产计划的请求结构体
struct DelPdplanReq
{
    Head head;
    PdplanInfo info[0];
    DelPdplanReq() {
        head.type = DEL_PDPLAN_REQ;
        head.len = sizeof(DelPdplanReq);
    }
};
//删除一条生产计划的响应结构体
struct DelPdplanRes
{
    Head head;
    int status;//表示是否删除成功,0否1是
    DelPdplanRes() {
        head.type = DEL_PDPLAN_RES;
        head.len = sizeof(DelPdplanRes);
    }
};
//更改一条生产计划的请求结构体.
struct UpdatePdplanReq
{
    Head head;
    PdplanInfo info[0];
    UpdatePdplanReq() {
        head.type = UPDATE_PDPLAN_REQ;
        head.len = sizeof(UpdatePdplanReq);
    }
};
//更改一条生产计划的响应结构体
struct UpdatePdplanRes
{
    Head head;
    int status;//表示是否更新成功,0否1是
    PdplanInfo info[0];
    UpdatePdplanRes() {
        head.type = UPDATE_PDPLAN_RES;
        head.len = sizeof(UpdatePdplanRes);
    }
};
//查询一条生产计划的请求结构体
struct QueryPdplanReq
{
    Head head;
    int planId;//订单编号
    char planName[32];//订单划名字
    char startDate[32];//起始日期
    char closingDate[32];//交付日期
    char pdName[8];//产品名
    double plannedPd;//计划生产量
    double actualPd;//实际生产量
    double progress;//生产进度
    int finishOntime;//是否按期完成
    QueryPdplanReq() {
        head.type = QUERY_PDPLAN_REQ;
        head.len = sizeof(QueryPdplanReq);
    }
};
//查询一条生产计划的响应结构体
struct QueryPdplanRes
{
    Head head;
    int status;//表示是否添加成功,0否1是
    PdplanInfo info[0];
    QueryPdplanRes() {
        head.type = QUERY_PDPLAN_RES;
        head.len = sizeof(QueryPdplanRes);
    }
};
//添加月产量的请求结构体
struct AddMonoutputReq
{
    Head head;
    MonoutputInfo info[0];
    AddMonoutputReq() {
        head.type = ADD_MONOUTPUT_REQ;
        head.len = sizeof(AddMonoutputReq);
    }
};
//添加月产量的响应结构体
struct AddMonoutputRes
{
    Head head;
    int status;//表示是否添加成功,0否1是
    AddMonoutputRes() {
        head.type = ADD_MONOUTPUT_RES;
        head.len = sizeof(AddMonoutputRes);
    }
};
//删除月产量的请求结构体
struct DelMonoutputReq
{
    Head head;
    MonoutputInfo info[0];
    DelMonoutputReq() {
        head.type = DEL_MONOUTPUT_REQ;
        head.len = sizeof(DelMonoutputReq);
    }
};
//删除月产量的响应结构体
struct DelMonoutputRes
{
    Head head;
    int status;//表示是否删除成功,0否1是
    DelMonoutputRes() {
        head.type = DEL_MONOUTPUT_RES;
        head.len = sizeof(DelMonoutputRes);
    }
};
//更改月产量的请求结构体.
struct UpdateMonoutputReq
{
    Head head;
    MonoutputInfo info[0];
    UpdateMonoutputReq() {
        head.type = UPDATE_MONOUTPUT_REQ;
        head.len = sizeof(UpdateMonoutputReq);
    }
};
//更改月产量的响应结构体
struct UpdateMonoutputRes
{
    Head head;
    int status;//表示是否更新成功,0否1是
    MonoutputInfo info[0];
    UpdateMonoutputRes() {
        head.type = UPDATE_MONOUTPUT_RES;
        head.len = sizeof(UpdateMonoutputRes);
    }
};
//查询月产量的请求结构体
struct QueryMonoutputReq
{
    Head head;
    int month;//月份
    double aOutput;//a产品月产量
    double bOutput;//b产品月产量
    double cOutput;//c产品月产量
    QueryMonoutputReq() {
        head.type = QUERY_MONOUTPUT_REQ;
        head.len = sizeof(QueryMonoutputReq);
    }
};
//查询月产量的响应结构体
struct QueryMonoutputRes
{
    Head head;
    int status;//表示是否添加成功,0否1是
    MonoutputInfo info[0];
    QueryMonoutputRes() {
        head.type = QUERY_MONOUTPUT_RES;
        head.len = sizeof(QueryMonoutputRes);
    }
};
//历史查询分析
// åŽ†å²æŸ¥è¯¢è¯·æ±‚ç»“æž„ä½“
struct HistoryQueryReq {
    Head head;
    //根据时间范围查询
    char startTime[32];
    char endTime[32];
    //关键字查询
    char keyWord[32];
    HistoryQueryReq() {
        // åˆå§‹åŒ–数据头
        head.type = QUERY_MONOUTPUT_REQ;
        head.len = sizeof(HistoryQueryReq);
        // åˆå§‹åŒ–查询条件字段
        memset(startTime, 0, sizeof(startTime));
        memset(endTime, 0, sizeof(endTime));
    }
};
// åŽ†å²æŸ¥è¯¢å“åº”ç»“æž„ä½“
// ç³»ç»Ÿè¿è¡ŒçŠ¶æ€è¡¨ç›¸å…³ä¿¡æ¯
struct HistroyInfo {
    WarningRes warn;//警报查询
    QDRes dev;//设备查询
    QueryPdplanRes  pro;//生产计划查询
};
struct HistoryQueryRes {
    Head head;
    HistroyInfo sys[0];
    HistoryQueryRes() {
        // åˆå§‹åŒ–数据头
        head.type = QUERY_MONOUTPUT_RES;
        head.len = sizeof(HistoryQueryRes);
    }
};
//自动升级
struct VersionNumReq        // ç‰ˆæœ¬å·è¯·æ±‚
{
    Head head;
    VersionNumReq() {
        head.type = VERSION_NUM_REQ;
        head.len = sizeof(VersionNumReq);
    }
};
struct VersionNumRes        // ç‰ˆæœ¬å·å“åº”
{
    Head head;
    char versionId[64]; // ç‰ˆæœ¬å·
    VersionNumRes() {
        head.type = VERSION_NUM_RES;
        head.len = sizeof(VersionNumRes);
    }
};
// æ–‡ä»¶ä¼ è¾“
struct FileInfo
{
    char fileName[256];
    long long fileSize;
    char s_filepath[128];
    char content[0];
};
struct UploadFileReq        // ä¸Šä¼ æ–‡ä»¶çš„请求
{
    Head head;
    FileInfo fileInfo;
    UploadFileReq() {
        head.type = UPLOAD_FILE_REQ;
        head.len = sizeof(UploadFileReq);
    }
};
struct UploadFileRes {      // ä¸Šä¼ æ–‡ä»¶çš„响应
    Head head;
    bool state = false;
    char fileName[256];
    long long file_size;
    UploadFileRes()
    {
        head.type = UPLOAD_FILE_RES;
        head.len = sizeof(UploadFileRes);
    }
};
// ç‰ˆæœ¬ä¿¡æ¯å½•å…¥
// è¯·æ±‚
struct VersionInfoEntryReq {
    Head head;
    char versionId[64]; // ç‰ˆæœ¬å·
    char versionIdOld[64]; // ä¸Šä¸€ä¸ªç‰ˆæœ¬å·
    int fileNum;
    char context[0];        //包含下载文件信息
    VersionInfoEntryReq()
    {
        head.type = VERSION_INFOENTRY_REQ;
        head.len = sizeof(VersionInfoEntryReq);
    }
};
// ç‰ˆæœ¬ä¿¡æ¯å½•入响应
struct VersionInfoEntryRes {
    Head head;
    bool state = false;
    VersionInfoEntryRes()
    {
        head.type = VERSION_INFOENTRY_RES;
        head.len = sizeof(VersionInfoEntryRes);
    }
};
// ç‰ˆæœ¬æ›´æ–°è¯·æ±‚
struct VersionUpdateReq {
    Head head;
    char curVersionId[64]; // ç‰ˆæœ¬å·
    VersionUpdateReq()
    {
        head.type = VERSION_UPDATE_REQ;
        head.len = sizeof(VersionUpdateReq);
    }
};
// ç‰ˆæœ¬æ›´æ–°å“åº”
struct VersionUpdateRes {
    Head head;
    bool state = false;
    char versionId[64]; // ç‰ˆæœ¬å·
    char updateDate[32]; // æ›´æ–°æ—¶é—´
    char versionDescription[1024]; //更新描述
    VersionUpdateRes()
    {
        head.type = VERSION_UPDATE_RES;
        head.len = sizeof(VersionUpdateRes);
    }
};
// ç‰ˆæœ¬æ›´æ–°æ–‡ä»¶ä¸‹è½½è¯·æ±‚
struct FileDownloadsReq {
    Head head;
    char versionId[64]; // ç‰ˆæœ¬å·
    FileDownloadsReq()
    {
        head.type = FILE_DOWNLOADS_REQ;
        head.len = sizeof(FileDownloadsReq);
    }
};
// ç‰ˆæœ¬æ›´æ–°æ–‡ä»¶ä¸‹è½½å“åº”
struct FileDownloadsRes {
    Head head;
    char versionId[64]; // ç‰ˆæœ¬å·
    char filename[128]; //文件名
    long long filesize; //文件大小
    char c_filepath[128];    //客户端放最新版本的本地路径
    int fileNum; // æ–‡ä»¶æ•°é‡
    long long allFileSize; // æ–‡ä»¶æ€»å¤§å°
    char content[0];
    FileDownloadsRes()
    {
        head.type = FILE_DOWNLOADS_RES;
        head.len = sizeof(FileDownloadsRes);
    }
};
// æ›´æ–°æ–‡ä»¶ä¸‹è½½æˆåŠŸçš„å“åº”
struct DownloadSuccessfullyRes {
    Head head;
    bool state = false;
    char fileName[256];
    long long fileSize;
    DownloadSuccessfullyRes()
    {
        head.type = DOWNLOAD_SUCCESSFULLY_RES;
        head.len = sizeof(DownloadSuccessfullyRes);
    }
};
//日志
struct ParsedLog {
    int id;
    char timeStamp[64]; // æ—¶é—´æˆ³
    char deviceId[64]; // è®¾å¤‡ID
    char level[16];    // æ—¥å¿—级别
    char content[256];  // æ—¥å¿—内容
    char userId[64];    // ç”¨æˆ·ID
    char fileName[32];   //文件名
    int problemLine;    //产生错误行号
    char functionName[32];  //函数名
};
// æ—¥å¿—查询请求结构体
struct LogQueryReq {
    Head head;                      // æ•°æ®å¤´
    char startTime[20]; // æ ¹æ®å®žé™…需要调整大小
    char endTime[20];   // æ ¹æ®å®žé™…需要调整大小
    char content[256];           // æ—¥å¿—内容
    char level[16];                 //日志级别
    char deviceId[64];             // è®¾å¤‡ID
                                   // æ— å‚构造函数
    LogQueryReq() {
        head.type = LOGSEARCH_REQ;
        head.len = sizeof(LogQueryReq);
    }
};
// æ—¥å¿—查询响应结构体
struct LogQueryRes {
    Head head;
    int status;                    // å“åº”状态 (如 0 è¡¨ç¤ºæˆåŠŸï¼Œéž 0 è¡¨ç¤ºå¤±è´¥)
    ParsedLog parsedLog[0];  // ä½¿ç”¨æŸ”性数组存储查询结果
    // æ— å‚构造函数
    LogQueryRes() {
        head.type = LOGSEARCH_RES;
        head.len = sizeof(LogQueryRes);
    }
};
#endif // COMMON_H
Client/Ö캽/code/kunlunclient/kunlunclient.pro
New file
@@ -0,0 +1,39 @@
#-------------------------------------------------
#
# Project created by QtCreator 2024-11-04T19:54:13
#
#-------------------------------------------------
QT       += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = kunlunclient
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
        main.cpp \
        clientmainwindow.cpp \
    logquery.cpp
HEADERS += \
        clientmainwindow.h \
    logquery.h \
    common.h
FORMS += \
        clientmainwindow.ui \
    logquery.ui
Client/Ö캽/code/kunlunclient/kunlunclient.pro.user
New file
@@ -0,0 +1,806 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.5.0, 2024-11-06T21:44:24. -->
<qtcreator>
 <data>
  <variable>EnvironmentId</variable>
  <value type="QByteArray">{197a2871-47a7-48be-824d-e8eb4f5b395c}</value>
 </data>
 <data>
  <variable>ProjectExplorer.Project.ActiveTarget</variable>
  <value type="int">0</value>
 </data>
 <data>
  <variable>ProjectExplorer.Project.EditorSettings</variable>
  <valuemap type="QVariantMap">
   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
    <value type="QString" key="language">Cpp</value>
    <valuemap type="QVariantMap" key="value">
     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
    </valuemap>
   </valuemap>
   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
    <value type="QString" key="language">QmlJS</value>
    <valuemap type="QVariantMap" key="value">
     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
    </valuemap>
   </valuemap>
   <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
   <value type="int" key="EditorConfiguration.IndentSize">4</value>
   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
   <value type="int" key="EditorConfiguration.TabSize">8</value>
   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
  </valuemap>
 </data>
 <data>
  <variable>ProjectExplorer.Project.PluginSettings</variable>
  <valuemap type="QVariantMap"/>
 </data>
 <data>
  <variable>ProjectExplorer.Project.Target.0</variable>
  <valuemap type="QVariantMap">
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.9.4 MinGW 32bit</value>
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.9.4 MinGW 32bit</value>
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.594.win32_mingw53_kit</value>
   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MinGW_32bit-Debug</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MinGW_32bit-Release</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MinGW_32bit-Profile</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">在本地部署</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
     <value type="int">0</value>
     <value type="int">1</value>
     <value type="int">2</value>
     <value type="int">3</value>
     <value type="int">4</value>
     <value type="int">5</value>
     <value type="int">6</value>
     <value type="int">7</value>
     <value type="int">8</value>
     <value type="int">9</value>
     <value type="int">10</value>
     <value type="int">11</value>
     <value type="int">12</value>
     <value type="int">13</value>
     <value type="int">14</value>
    </valuelist>
    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">kunlunclient</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:B:/Qt/QtProject/kunlunclient/kunlunclient.pro</value>
    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">kunlunclient.pro</value>
    <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MinGW_32bit-Debug</value>
    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
  </valuemap>
 </data>
 <data>
  <variable>ProjectExplorer.Project.Target.1</variable>
  <valuemap type="QVariantMap">
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.9.4 MSVC2015 32bit</value>
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.9.4 MSVC2015 32bit</value>
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.594.win32_msvc2015_kit</value>
   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MSVC2015_32bit-Debug</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MSVC2015_32bit-Release</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MSVC2015_32bit-Profile</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">在本地部署</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
     <value type="int">0</value>
     <value type="int">1</value>
     <value type="int">2</value>
     <value type="int">3</value>
     <value type="int">4</value>
     <value type="int">5</value>
     <value type="int">6</value>
     <value type="int">7</value>
     <value type="int">8</value>
     <value type="int">9</value>
     <value type="int">10</value>
     <value type="int">11</value>
     <value type="int">12</value>
     <value type="int">13</value>
     <value type="int">14</value>
    </valuelist>
    <value type="int" key="PE.EnvironmentAspect.Base">-1</value>
    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
    <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
    <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
    <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
  </valuemap>
 </data>
 <data>
  <variable>ProjectExplorer.Project.Target.2</variable>
  <valuemap type="QVariantMap">
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.9.4 MSVC2015 64bit</value>
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.9.4 MSVC2015 64bit</value>
   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.594.win64_msvc2015_64_kit</value>
   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MSVC2015_64bit-Debug</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MSVC2015_64bit-Release</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">B:/Qt/QtProject/build-kunlunclient-Desktop_Qt_5_9_4_MSVC2015_64bit-Profile</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">在本地部署</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
     <value type="int">0</value>
     <value type="int">1</value>
     <value type="int">2</value>
     <value type="int">3</value>
     <value type="int">4</value>
     <value type="int">5</value>
     <value type="int">6</value>
     <value type="int">7</value>
     <value type="int">8</value>
     <value type="int">9</value>
     <value type="int">10</value>
     <value type="int">11</value>
     <value type="int">12</value>
     <value type="int">13</value>
     <value type="int">14</value>
    </valuelist>
    <value type="int" key="PE.EnvironmentAspect.Base">-1</value>
    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
    <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
    <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
    <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Custom Executable</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
   </valuemap>
   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
  </valuemap>
 </data>
 <data>
  <variable>ProjectExplorer.Project.TargetCount</variable>
  <value type="int">3</value>
 </data>
 <data>
  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
  <value type="int">18</value>
 </data>
 <data>
  <variable>Version</variable>
  <value type="int">18</value>
 </data>
</qtcreator>
Client/Ö캽/code/kunlunclient/logquery.cpp
New file
@@ -0,0 +1,216 @@
#include "logquery.h"
#include "ui_logquery.h"
#include <QTcpSocket>
#include <QMessageBox>
#include <QStandardItemModel>
#pragma execution_character_set("utf-8")
LogQuery::LogQuery(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::LogQuery)
{
    ui->setupUi(this);
    m_client = nullptr;//置空
}
LogQuery::LogQuery(QTcpSocket *client, QWidget *parent):
    QMainWindow(parent),
    ui(new Ui::LogQuery)
{
     ui->setupUi(this);
     connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onComboBoxIndexChanged(int)));
     ui->dateTimeEdit_end->setDateTime(QDateTime::currentDateTime());
     //拉伸 æ•ˆæžœ
     ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
     ui->spinBox->setValue(10);
//     int nWidth = ui->tableView->width();
//     ui->tableView->setColumnWidth(0, qRound(nWidth*0.1));
//     ui->tableView->setColumnWidth(1, qRound(nWidth*0.5));
//     ui->tableView->setColumnWidth(2, qRound(nWidth*0.3));
//     ui->tableView->setColumnWidth(3, qRound(nWidth*0.15));
//     ui->tableView->setColumnWidth(4, qRound(nWidth*0.15));
//     ui->tableView->setColumnWidth(5, qRound(nWidth*0.3));
//     ui->tableView->setColumnWidth(6, qRound(nWidth*0.3));
//     ui->tableView->setColumnWidth(7, qRound(nWidth*0.3));
//     ui->tableView->setColumnWidth(8, qRound(nWidth*0.3));
     m_client = client;//共享套接字
}
LogQuery::~LogQuery()
{
    delete ui;
}
void LogQuery::on_pushButton_search_clicked()
{
    QString selectedFilter = ui->comboBox->currentText();
    QByteArray request;
    // åŠ¨æ€åˆ†é…è¯·æ±‚ç»“æž„ä½“
    int size = sizeof(LogQueryReq) + sizeof(ParsedLog);
    LogQueryReq* req = (LogQueryReq*)new char[size];
    req->head.type = LOGSEARCH_REQ;
    req->head.len = size;
    // åˆå§‹åŒ–请求数据
    initializeRequestData(req);
    // æ ¹æ®é€‰å®šçš„筛选条件填充请求数据
    if (selectedFilter == "时间") {
        QString startTime = ui->dateTimeEdit_start->dateTime().toString("yyyy-MM-dd HH:mm:ss");
        QString endTime = ui->dateTimeEdit_end->dateTime().toString("yyyy-MM-dd HH:mm:ss");
        // å°†å¼€å§‹æ—¶é—´å’Œç»“束时间设置到请求中
        strcpy(req->startTime, startTime.toLocal8Bit().constData());
        strcpy(req->endTime, endTime.toLocal8Bit().constData());
    } else if (selectedFilter == "日志内容" || selectedFilter == "日志级别" || selectedFilter == "设备ID") {
        QString filterValue = ui->lineEdit->text();
        if (filterValue.isEmpty()) {
            QMessageBox::warning(this, "警告", "请输入筛选条件!");
            delete[] req; // é‡Šæ”¾å†…å­˜
            return;
        }
        // æ ¹æ®ç­›é€‰æ¡ä»¶å¡«å……相应的字段
        if (selectedFilter == "日志内容") {
            strcpy(req->content, filterValue.toLocal8Bit().data());
        } else if (selectedFilter == "日志级别") {
            strcpy(req->level, filterValue.toLocal8Bit().data());
        } else if (selectedFilter == "设备ID") {
            strcpy(req->deviceId, filterValue.toLocal8Bit().data());
        }
    } else {
        QMessageBox::warning(this, "警告", "请选择有效的筛选条件!");
        delete[] req; // é‡Šæ”¾å†…å­˜
        return;
    }
    // å°†ç»“构体转为 QByteArray
    request = QByteArray((char*)(req), req->head.len);
    // å‘送请求
    if (m_client != nullptr) {
        qDebug() << __FUNCTION__ << m_client->write(request);
    }
    // é‡Šæ”¾å†…å­˜
    delete[] req;
    currentPage = 1;
    // é‡æ–°è®¡ç®—总页数
    totalPages = (logs.size() + logsPerPage - 1) / logsPerPage;
    displayCurrentPage();
    updatePageLabel();
}
void LogQuery::queryResSlot(LogQueryRes *res)
{
    if (res->status == 1) {
       // è§£æžæ—¥å¿—数据
       logs.clear();
       int maxLogs = ui->spinBox->value();
       int logCount = (res->head.len - sizeof(LogQueryRes)) / sizeof(ParsedLog);
       qDebug()<<"logcount = "<<logCount;
       int displayCount = qMin(maxLogs, logCount); // æ˜¾ç¤ºæ•°é‡ä¸è¶…过最大值
       for (int i = 0; i < displayCount; ++i) {
           logs.append(res->parsedLog[i]);
       }
       totalPages = (logs.size()+logsPerPage -1)/ logsPerPage;//计算总页数
       currentPage = 1; // é‡ç½®é¡µç 
       updatePageLabel();//更新标签
       displayCurrentPage(); // æ˜¾ç¤ºç¬¬ä¸€é¡µ
        }
    else{
        ui->tableView->setModel(nullptr);
        QMessageBox::warning(this, "警告", "无相关内容");
    }
}
void LogQuery::initializeRequestData(LogQueryReq *req)
{
    req->startTime[0] = '\0';
    req->endTime[0] = '\0';
    req->level[0] = '\0';
    req->deviceId[0] = '\0';
    req->content[0] = '\0';
}
void LogQuery::updatePageLabel()
{
    ui->label_currentPage->setText(QString("当前页:%1 / %2").arg(currentPage).arg(totalPages));
    // å¦‚果只有一页或者没有数据,禁用上下页按钮
    ui->pushButton_up->setEnabled(currentPage > 1);           // ç¦ç”¨ä¸Šä¸€é¡µæŒ‰é’®
    ui->pushButton_down->setEnabled(currentPage < totalPages); // ç¦ç”¨ä¸‹ä¸€é¡µæŒ‰é’®
}
void LogQuery::on_pushButton_up_clicked()
{
    if (currentPage > 0) {
           --currentPage;
           updatePageLabel();
           displayCurrentPage();  // æ˜¾ç¤ºä¸Šä¸€é¡µ
       }
}
void LogQuery::on_pushButton_down_clicked()
{
    if (currentPage < totalPages) {
        ++currentPage;
        updatePageLabel();
        displayCurrentPage();
    }
}
void LogQuery::onComboBoxIndexChanged(int index)
{
    ui->lineEdit->clear();
}
void LogQuery::displayCurrentPage()
{
        QStandardItemModel* model = new QStandardItemModel();
        model->setHorizontalHeaderLabels({"ID", "时间", "设备ID", "日志级别", "日志内容", "用户ID", "错误文件名", "错误行号", "错误函数名"});
        int start = (currentPage -1)* logsPerPage;
        int end = qMin(start + logsPerPage, logs.size());
        // å¡«å……当前页的日志条目
        for (int i = start; i < end; ++i) {
            ParsedLog parsedLog = logs[i];
            QList<QStandardItem *> rowItems;
            rowItems.append(new QStandardItem(QString::number(parsedLog.id)));
            rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.timeStamp)));
            rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.deviceId)));
            rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.level)));
            rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.content)));
            rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.userId)));
            rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.fileName)));
            rowItems.append(new QStandardItem(QString::number(parsedLog.problemLine)));
            rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.functionName)));
            model->appendRow(rowItems);
        }
        // æ›´æ–°è¡¨æ ¼è§†å›¾
        ui->tableView->setModel(model);
        ui->tableView->resizeColumnsToContents();
}
Client/Ö캽/code/kunlunclient/logquery.h
New file
@@ -0,0 +1,49 @@
#ifndef LOGQUERY_H
#define LOGQUERY_H
#include <QMainWindow>
#include "common.h"
#include <QTcpSocket>
#pragma execution_character_set("utf-8")
namespace Ui {
class LogQuery;
}
class LogQuery : public QMainWindow
{
    Q_OBJECT
public:
    explicit LogQuery(QWidget *parent = 0);
    explicit LogQuery(QTcpSocket *client,QWidget *parent = 0);
    ~LogQuery();
private slots:
    void on_pushButton_search_clicked();
    void queryResSlot(LogQueryRes *res);
    void on_pushButton_up_clicked();
    void on_pushButton_down_clicked();
    void onComboBoxIndexChanged(int index);
private:
    void displayCurrentPage();
    Ui::LogQuery *ui;
    QTcpSocket *m_client;
    QVector<ParsedLog> logs;
    int currentPage = 1;    // å½“前页码,从1开始
    int totalPages = 1;     // æ€»é¡µæ•°
    const int logsPerPage = 10;   // æ¯é¡µæ˜¾ç¤ºçš„æ—¥å¿—数量
    void initializeRequestData(LogQueryReq* req);//初始化请求数据
    void updatePageLabel();
};
#endif // LOGQUERY_H
Client/Ö캽/code/kunlunclient/logquery.ui
New file
@@ -0,0 +1,209 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>LogQuery</class>
 <widget class="QMainWindow" name="LogQuery">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <widget class="QGroupBox" name="groupBox">
      <property name="title">
       <string>查询条件</string>
      </property>
      <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
          <widget class="QComboBox" name="comboBox">
           <item>
            <property name="text">
             <string>时间</string>
            </property>
           </item>
           <item>
            <property name="text">
             <string>日志内容</string>
            </property>
           </item>
           <item>
            <property name="text">
             <string>日志级别</string>
            </property>
           </item>
           <item>
            <property name="text">
             <string>设备ID</string>
            </property>
           </item>
          </widget>
         </item>
         <item>
          <widget class="QLineEdit" name="lineEdit"/>
         </item>
        </layout>
       </item>
       <item row="1" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout_2">
         <item>
          <widget class="QLabel" name="label">
           <property name="text">
            <string>开始:</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QDateTimeEdit" name="dateTimeEdit_start">
           <property name="calendarPopup">
            <bool>true</bool>
           </property>
          </widget>
         </item>
         <item>
          <spacer name="horizontalSpacer">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>40</width>
             <height>20</height>
            </size>
           </property>
          </spacer>
         </item>
         <item>
          <widget class="QLabel" name="label_2">
           <property name="text">
            <string>结束:</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QDateTimeEdit" name="dateTimeEdit_end">
           <property name="calendarPopup">
            <bool>true</bool>
           </property>
          </widget>
         </item>
         <item>
          <spacer name="horizontalSpacer_2">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>40</width>
             <height>20</height>
            </size>
           </property>
          </spacer>
         </item>
        </layout>
       </item>
       <item row="2" column="0">
        <layout class="QHBoxLayout" name="horizontalLayout_4">
         <item>
          <widget class="QPushButton" name="pushButton_search">
           <property name="text">
            <string>查询</string>
           </property>
          </widget>
         </item>
         <item>
          <spacer name="horizontalSpacer_3">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>40</width>
             <height>20</height>
            </size>
           </property>
          </spacer>
         </item>
         <item>
          <widget class="QSpinBox" name="spinBox"/>
         </item>
        </layout>
       </item>
      </layout>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QGroupBox" name="groupBox_2">
      <property name="title">
       <string>查询结果</string>
      </property>
      <layout class="QHBoxLayout" name="horizontalLayout_3">
       <item>
        <widget class="QTableView" name="tableView"/>
       </item>
      </layout>
     </widget>
    </item>
    <item row="2" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout_5">
      <item>
       <widget class="QLabel" name="label_currentPage">
        <property name="text">
         <string/>
        </property>
       </widget>
      </item>
      <item>
       <spacer name="horizontalSpacer_4">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
          <width>40</width>
          <height>20</height>
         </size>
        </property>
       </spacer>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton_up">
        <property name="text">
         <string>上一页</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton_down">
        <property name="text">
         <string>下一页</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
Client/Ö캽/code/kunlunclient/main.cpp
New file
@@ -0,0 +1,11 @@
#include "clientmainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ClientMainWindow w;
    w.show();
    return a.exec();
}
Client/Ö캽/code/·þÎñ¶Ë/LogSearch.cpp
New file
@@ -0,0 +1,91 @@
#include "stdafx.h"
#include "LogSearch.h"
#include <iostream>
#include "MysqlConn.h"
using namespace std;
LogSearch::LogSearch()
{
}
LogSearch::~LogSearch()
{
}
bool LogSearch::searchLogBusiness(SOCKET client, LogQueryReq * req)
{
    //// åˆå§‹åŒ– SQL æŸ¥è¯¢è¯­å¥
    string sql = "SELECT * FROM parsed_logs WHERE";
    if (*(req->startTime) && *(req->endTime)) {
        sql += " time_stamp BETWEEN '" + string(req->startTime) + "' AND '" + string(req->endTime) + "'";
    }
    if (*(req->level)) {
        sql += " level LIKE '%" + string(req->level) + "%'";
    }
    if (*(req->deviceId)) {
        sql += " device_id LIKE '%" + string(req->deviceId) + "%'";
    }
    if ((*req->content)) {
        sql += " content LIKE '%" + string(req->content) + "%'";
    }
    // æ‰“印构建的 SQL è¯­å¥ï¼Œæ–¹ä¾¿è°ƒè¯•
    cout << "SQL: " << sql << endl;
    // è®¾ç½® MySQL è¿žæŽ¥å¹¶æ‰§è¡ŒæŸ¥è¯¢
        MysqlConn conn;
        vector<vector<string>> result;
        bool querySuccess = conn.query(sql, result);
        if (!querySuccess) {
            cout << "查询失败" << endl;
            return false;
        }
        int len = sizeof(LogQueryRes) + result.size() * sizeof(ParsedLog);  // åŠ¨æ€è®¡ç®—æ•°æ®é•¿åº¦
        LogQueryRes* res = (LogQueryRes*)malloc(len);  // ä¸º LogQueryRes ç»“构体及其柔性数组分配内存
                                                       // åˆå§‹åŒ–结构体
        res->head.type = LOGSEARCH_RES;
        res->head.len = len;
        res->status = (result.empty()) ? 0 : 1; // å¦‚果结果为空,设置状态为 0
                                                // å°†æŸ¥è¯¢ç»“果填充到 parsedLog æ•°ç»„中
        for (const auto& row : result) {
            cout << "行:" << row.size() << endl;
            for (const auto& item : row) {
                cout << item << " ";
            }
        }
            cout << endl;
        for (size_t i = 0; i < result.size(); ++i) {
            const auto& row = result[i];
            ParsedLog parlog;
            if (row.size() >= 9) {
                parlog.id = stoi(row[0]);
                strncpy(parlog.timeStamp, row[1].c_str(), sizeof(parlog.timeStamp));
                strncpy(parlog.deviceId, row[2].c_str(), sizeof(parlog.deviceId));
                strncpy(parlog.level, row[3].c_str(), sizeof(parlog.level));
                strncpy(parlog.content, row[4].c_str(), sizeof(parlog.content));
                strncpy(parlog.userId, row[5].c_str(), sizeof(parlog.userId));
                strncpy(parlog.fileName, row[6].c_str(), sizeof(parlog.fileName));
                parlog.problemLine = stoi(row[7]);
                strncpy(parlog.functionName, row[8].c_str(), sizeof(parlog.functionName));
                res->parsedLog[i] = parlog;  // å¡«å……数据
            }
        }
        // å‘送响应
        cout << __FUNCTION__ << send(client, (char*)res, res->head.len, 0) << endl;
        // é‡Šæ”¾å†…å­˜
        free(res);  // é‡Šæ”¾åˆ†é…çš„内存
}
Client/Ö캽/code/·þÎñ¶Ë/LogSearch.h
New file
@@ -0,0 +1,17 @@
#pragma once
#include "common.h"
#include <WinSock2.h>
#include "mysql1/include/jdbc/mysql_driver.h"
#include "mysql1/include/jdbc/mysql_connection.h"
#include "mysql1/include/jdbc/cppconn/prepared_statement.h"
#include "mysql1/include/jdbc/cppconn/resultset.h"
#include "mysql1/include/jdbc/cppconn//exception.h"
#include <iostream>
class LogSearch
{
public:
    LogSearch();
    virtual ~LogSearch();
    bool searchLogBusiness(SOCKET client, LogQueryReq* req);
};
Client/Ö캽/log/Ö캽1105.doc
Binary files differ
Client/ÀîÏüÔö/log/ÀúÊ·²éѯ_ÀîÏüÔö_1104.doc
Binary files differ
Client/ÀîÏüÔö/log/ÀúÊ·²éѯ_ÀîÏüÔö_1105.doc
Binary files differ
Client/ÍõöÎöÎ/log/ÈÕÖ¾_ÍõöÎöÎ_1106.doc
Binary files differ
Client/ÉêŸ@/log/ÈÕÖ¾_ÉêŸ@_1106.doc
Binary files differ
Client/Ö£¿­ÎÄ/log/Ö£¿­ÎÄ1106.doc
Binary files differ
Client/ÀèºëÁØ/log/É豸¹ÜÀí_ÀèºëÁØ_1106.doc
Binary files differ
Client/¹¨ÆôÏé/log/ÈÕ־ģ°å_¹¨ÆôÏé_1106.doc
Binary files differ
Server/ÍõçûÔª/code/ConnectionPool.cpp
@@ -1,125 +1,101 @@
#include "stdafx.h"
#include "ConnectionPool.h"
#include <fstream>
#include <iostream>
#include <thread>
ConnectionPool* ConnectionPool::getInstance() {
    static ConnectionPool connPool;
    return &connPool;
}
ConnectionPool::ConnectionPool() {
    // åŠ è½½é…ç½®æ–‡ä»¶
    if (!parseJsonFile()) {
        std::cout << "parseJsonFile is failed!" << std::endl;
        return;
    }
    for ( int i = 0 ; i < m_min_conn ; i++ ) {
        addConnection( );
    }
    // åˆ›å»ºä¸€ä¸ªçº¿ç¨‹ï¼Œå¯¹è¿žæŽ¥æ•°è¿›è¡Œç›‘控 ï¼Œè¿žæŽ¥æ•°ä¸è¶³å°±å†ç»§ç»­åˆ›å»º
    std::thread producer(&ConnectionPool::produce, this);
    // å¯¹è¿žæŽ¥æ•°è¿›è¡Œç›‘控 ï¼Œå¦‚果有太多空闲得线程 ï¼Œé‚£ä¹ˆå°±å¯¹å…¶è¿›è¡Œé”€æ¯
    std::thread recycler( &ConnectionPool::recycle,  this);
    // çº¿ç¨‹åˆ†ç¦»
    producer.detach();
    recycler.detach();
    m_min_conn = 5; // å‡è®¾æœ€å°è¿žæŽ¥æ•°ä¸º 5
    m_max_conn = 10; // å‡è®¾æœ€å¤§è¿žæŽ¥æ•°ä¸º 10
    m_timeout = 1000; // å‡è®¾è¿žæŽ¥è¶…时时间为 1000 æ¯«ç§’
    max_del_time = 60000; // å‡è®¾æœ€å¤§ç©ºé—²æ—¶é—´ä¸º 60000 æ¯«ç§’
    for (int i = 0; i < m_min_conn; i++) {
        addConnection();
    }
    // åˆ›å»ºä¸€ä¸ªçº¿ç¨‹ï¼Œå¯¹è¿žæŽ¥æ•°è¿›è¡Œç›‘控 ï¼Œè¿žæŽ¥æ•°ä¸è¶³å°±å†ç»§ç»­åˆ›å»º
    thread producer(&ConnectionPool::produce, this);
    // å¯¹è¿žæŽ¥æ•°è¿›è¡Œç›‘控 ï¼Œå¦‚果有太多空闲得线程 ï¼Œé‚£ä¹ˆå°±å¯¹å…¶è¿›è¡Œé”€æ¯
    thread recycler(&ConnectionPool::recycle, this);
    // çº¿ç¨‹åˆ†ç¦»
    producer.detach();
    recycler.detach();
}
bool ConnectionPool::parseJsonFile() {
    /*std::ifstream ifs("dbconf.json");
    Reader rd;
    Value root;
    rd.parse(ifs, root);
    if ( root.isObject( ) ) {
        m_ip = root["ip"].asString();
        m_port = root["port"].asInt();
        m_userName = root["userName"].asString();
        m_passwd = root["password"].asString();
        m_db = root["dbName"].asString();
        m_min_conn = root["minSize"].asInt();
        m_max_conn = root["maxSize"].asInt();
        max_del_time = root["maxDleTime"].asInt();
        m_timeout = root["timeout"].asInt();
        return true;
    }*/
    return false;
}
void ConnectionPool::description() {
    std::cout << m_ip << ". " << m_userName << ". " << m_passwd << ". " << m_db << ". "
               << m_port << ". " << m_max_conn << ". " << m_min_conn << ". " << m_timeout << ". "
               << max_del_time << std::endl;
}
ConnectionPool::~ConnectionPool() {
    while (!m_connkQueue.empty()) {
        MysqlConn* conn = m_connkQueue.front();
        m_connkQueue.pop();
        delete  conn;
    }
    while (!m_connkQueue.empty()) {
        MysqlConn* conn = m_connkQueue.front();
        m_connkQueue.pop();
        delete conn;
    }
}
void ConnectionPool::addConnection() {
    MysqlConn* conn = new MysqlConn();
    if ( !conn->connect( m_ip, m_userName, m_passwd, m_db, m_port  ) ) {
        std::cout << "ConnectionPool connect to mysql is failed!" << std::endl;
        delete conn;
        return;
    }
    conn->refreshActiveTime( );
    m_connkQueue.push(conn);
    m_cond.notify_one();   // å”¤é†’一个线程
    MysqlConn* conn = new MysqlConn();
    if (!conn->isConnected()) {
        cout << "ConnectionPool connect to mysql is failed!" << endl;
        delete conn;
        return;
    }
    conn->refreshActiveTime();
    m_connkQueue.push(conn);
    m_cond.notify_one();   // å”¤é†’一个线程
}
void ConnectionPool::produce(){
    while (true) {
        std::unique_lock<std::mutex> lock(m_mutex);
        while (m_connkQueue.size() >= m_min_conn) { // è¿žæŽ¥é˜Ÿåˆ—的数量大于最小的连接数
            m_cond.wait(lock);
        }
        addConnection();
    }
void ConnectionPool::produce() {
    while (true) {
        unique_lock<mutex> lock(m_mutex);
        while (m_connkQueue.size() >= m_min_conn) { // è¿žæŽ¥é˜Ÿåˆ—的数量大于最小的连接数
            m_cond.wait(lock);
        }
        addConnection();
    }
}
// åˆ é™¤ç©ºé—²è¿žæŽ¥
void ConnectionPool::recycle() {
    while ( true ) {
        std::this_thread::sleep_for( std::chrono::milliseconds(500));   // ä¼‘眠500 ms
        std::unique_lock<std::mutex>lock(m_mutex);
        while ( m_connkQueue.size() > m_min_conn ) {
            MysqlConn* conn = m_connkQueue.front( );
            if (conn->getActiveTime() >= max_del_time) {
                m_connkQueue.pop();
                delete conn;
            }
            else {
                break;
            }
        }
    }
    while (true) {
        this_thread::sleep_for(chrono::milliseconds(500));   // ä¼‘眠 500 ms
        unique_lock<mutex> lock(m_mutex);
        while (m_connkQueue.size() > m_min_conn) {
            MysqlConn* conn = m_connkQueue.front();
            if (conn->getActiveTime() >= max_del_time) {
                m_connkQueue.pop();
                delete conn;
            }
            else {
                break;
            }
        }
    }
}
std::shared_ptr<MysqlConn>  ConnectionPool::getMysqlConn() {
    std::unique_lock<std::mutex>lock(m_mutex);
    while ( m_connkQueue.empty()) {
        // å¦‚果等待一段时间后,队列还是为空,返回一个 null
        if ( std::cv_status::timeout == m_cond.wait_for(lock, std::chrono::milliseconds(m_timeout)) ) {
            if( m_connkQueue.empty( ) )    return nullptr;
        }
    }
    std::shared_ptr<MysqlConn> connPtr(std::move(m_connkQueue.front()), [this](MysqlConn* conn) {
        std::unique_lock <std::mutex>lock(m_mutex) ;
        conn->refreshActiveTime();
        m_connkQueue.push(conn);
        });
    m_connkQueue.pop();
    m_cond.notify_one();   // å”¤é†’阻塞的生产者线程,开始生产
    return connPtr;
shared_ptr<MysqlConn> ConnectionPool::getMysqlConn() {
    unique_lock<mutex> lock(m_mutex);
    while (m_connkQueue.empty()) {
        // å¦‚果等待一段时间后,队列还是为空,返回一个 null
        if (cv_status::timeout == m_cond.wait_for(lock, chrono::milliseconds(m_timeout))) {
            if (m_connkQueue.empty()) return nullptr;
        }
    }
    shared_ptr<MysqlConn> connPtr(move(m_connkQueue.front()), [this](MysqlConn* conn) {
        unique_lock<mutex> lock(m_mutex);
        conn->refreshActiveTime();
        m_connkQueue.push(conn);
        });
    m_connkQueue.pop();
    m_cond.notify_one();   // å”¤é†’阻塞的生产者线程,开始生产
    return connPtr;
}
void ConnectionPool::description() {
    cout << m_ip << ". " << m_userName << ". " << m_passwd << ". " << m_db << ". "
        << m_port << ". " << m_max_conn << ". " << m_min_conn << ". " << m_timeout << ". "
        << max_del_time << endl;
}
ConnectionPool* ConnectionPool::getInstance() {
    static ConnectionPool connPool;
    return &connPool;
}
Server/ÍõçûÔª/code/ConnectionPool.h
@@ -1,50 +1,44 @@
#pragma once
#include <queue>
#include <mutex>
#include <condition_variable>
//#include <json/json.h>
#include "MysqlConn.h"
//using namespace Json;
class ConnectionPool
{
public:
    static ConnectionPool* getInstance( );
    static ConnectionPool* getInstance();
    std::shared_ptr<MysqlConn>  getMysqlConn();    // ä»Žæ•°æ®åº“连接池获取连接
    shared_ptr<MysqlConn> getMysqlConn();    // ä»Žæ•°æ®åº“连接池获取连接
    ConnectionPool(const ConnectionPool& other) = delete;
    ConnectionPool& operator = (const ConnectionPool & other ) = delete;
    ~ConnectionPool();
    ConnectionPool(const ConnectionPool& other) = delete;
    ConnectionPool& operator=(const ConnectionPool& other) = delete;
    void description();
    ~ConnectionPool();
    void description();
protected:
    ConnectionPool( );   // æž„造函数
    ConnectionPool();   // æž„造函数
private:
    bool parseJsonFile();   // è§£æžé…ç½®
    // ä¸å†éœ€è¦è§£æžé…ç½®æ–‡ä»¶çš„函数
    // bool parseJsonFile();   // è§£æžé…ç½®
    void produce();
    void recycle();
    void addConnection();  // å¢žåŠ è¿žæŽ¥æ•°
    void produce();
    void recycle();
    void addConnection();  // å¢žåŠ è¿žæŽ¥æ•°
    std::string  m_ip;
    std::string  m_userName;
    std::string  m_passwd;
    std::string  m_db;
    unsigned short m_port;
    // å†™æ­»çš„æ•°æ®åº“连接参数
    string m_ip = "127.0.0.1";
    string m_userName = "root";
    string m_passwd = "123456";
    string m_db = "mayi_kunlun";
    unsigned short m_port = 3306;
    int m_max_conn;
    int m_min_conn;
    int m_max_conn;
    int m_min_conn;
    int m_timeout;      // è¿žæŽ¥è¶…æ—¶æ—¶é—´
    int max_del_time;   // æœ€å¤§åˆ é™¤æ—¶é—´( è¿žæŽ¥ç©ºé—²æ—¶é—´è¶…过这个,就给当前连接关闭 )
    std::queue<MysqlConn*>m_connkQueue ;   // è¿žæŽ¥é˜Ÿåˆ—
    std::mutex m_mutex;  // äº’斥锁
    std::condition_variable m_cond;   // æ¡ä»¶å˜é‡
    int m_timeout;      // è¿žæŽ¥è¶…æ—¶æ—¶é—´
    int max_del_time;   // æœ€å¤§åˆ é™¤æ—¶é—´( è¿žæŽ¥ç©ºé—²æ—¶é—´è¶…过这个,就给当前连接关闭 )
    queue<MysqlConn*> m_connkQueue;   // è¿žæŽ¥é˜Ÿåˆ—
    mutex m_mutex;  // äº’斥锁
    condition_variable m_cond;   // æ¡ä»¶å˜é‡
};
Server/ÍõçûÔª/code/MysqlConn.cpp
@@ -1,37 +1,60 @@
#include "stdafx.h"
#include "MysqlConn.h"
#include <regex>
// åˆå§‹åŒ–连接
// åˆå§‹åŒ–连接
MysqlConn::MysqlConn() {
    mysql_ = mysql_init(mysql_);
    // è®¾ç½®å­—符集
    if (mysql_) mysql_set_character_set(mysql_, "gbk");
}
// è¿žæŽ¥æ•°æ®åº“
bool MysqlConn::connect(std::string ip, std::string userName, std::string passwd, std::string db, int port) {
    mysql_ = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
    if (!mysql_) {
        return false;
    m_mysql = mysql_init(nullptr);
    if (!m_mysql) {
        cout << "Failed to initialize MySQL." << endl;
        return;
    }
    return true;
    // è®¾ç½®å­—符集
    if (m_mysql) mysql_set_character_set(m_mysql, "gbk");
    // ä½¿ç”¨å†™æ­»çš„参数连接数据库
    m_mysql = mysql_real_connect(m_mysql, "127.0.0.1", "root", "123456", "mayi_kunlun", 3306, nullptr, 0);
    if (!m_mysql) {
        cout << "MysqlConn connect to mysql is failed!" << endl;
        // ç¡®ä¿åœ¨è¿žæŽ¥å¤±è´¥æ—¶æ­£ç¡®æ¸…理资源
        mysql_close(m_mysql);
        m_mysql = nullptr;
    }
    // åˆå§‹åŒ– row_ å’Œ res_
    m_row = nullptr;
    m_res = nullptr;
}
bool MysqlConn::isConnected() {
    return m_mysql != nullptr;
}
// è¿žæŽ¥æ•°æ®åº“
//bool MysqlConn::connect() {
//    string ip = "127.0.0.1";
//    string userName = "root";
//    string passwd = "123456";
//    string db = "mayi_kunlun";
//    int port = 3306;
//    m_mysql = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
//    if (!m_mysql) {
//        return false;
//    }
//    return true;
//}
// é‡Šæ”¾èµ„源
MysqlConn::~MysqlConn() {
    if (mysql_) {
        mysql_close(mysql_);
        mysql_ = nullptr;
    if (m_mysql) {
        mysql_close(m_mysql);
        m_mysql = nullptr;
    }
    freeRes();
}
// æ›´æ–°æ•°æ®
bool MysqlConn::update(std::string sql) {
bool MysqlConn::update(string sql) {
    // å‚数化查询优化后的安全检查
    MYSQL_STMT* stmt = mysql_stmt_init(mysql_);
    MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
    if (!stmt) {
        return false;
    }
@@ -53,11 +76,36 @@
    return true;
}
bool MysqlConn::query(string sql, vector<vector<string>>& result)
{
    freeRes();
    int ret = mysql_query(m_mysql, sql.c_str());
    if (ret != 0) {
        fprintf(stderr, "Query failed: %s\n", mysql_error(m_mysql));
        return false;
    }
    // èŽ·å–æŸ¥è¯¢ç»“æžœ
    m_res = mysql_store_result(m_mysql);
    if (!m_res)   return false;
    //将结果集转到二维数组result里面
    //int col_cnt = m_mysql->field_count;
    int col_cnt = mysql_field_count(m_mysql);
    cout << col_cnt << endl;
    while (m_row = mysql_fetch_row(m_res)) {
        vector<string> tmp;
        for (int i = 0; i < col_cnt; i++) {
            tmp.push_back(m_row[i]);
        }
        result.push_back(tmp);
    }
    return true;
}
// æŸ¥è¯¢æ•°æ®åº“
bool MysqlConn::query(std::string sql) {
bool MysqlConn::query(string sql) {
    freeRes();
    // å‚数化查询优化后的安全检查
    MYSQL_STMT* stmt = mysql_stmt_init(mysql_);
    MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
    if (!stmt) {
        return false;
    }
@@ -75,8 +123,8 @@
        mysql_stmt_close(stmt);
        return false;
    }
    res_ = mysql_stmt_result_metadata(stmt);
    if (!res_) {
    m_res = mysql_stmt_result_metadata(stmt);
    if (!m_row) {
        mysql_stmt_close(stmt);
        return false;
    }
@@ -86,59 +134,60 @@
// å¾—到结果集
bool MysqlConn::getResult() {
    if (res_) {
        row_ = mysql_fetch_row(res_);
        if (row_) return true;
    if (m_row) {
        m_row = mysql_fetch_row(m_res);
        if (m_row) return true;
    }
    return false;
}
// èŽ·å–ç»“æžœé›†çš„å­—æ®µ
std::string MysqlConn::getField(int index) {
    int cols = mysql_num_fields(res_);
    if (index >= cols || index < 0) return std::string("");
string MysqlConn::getField(int index) {
    int cols = mysql_num_fields(m_res);
    if (!m_res || index >= cols || index < 0) return string("");
    char* value = row_[index];
    unsigned long len = mysql_fetch_lengths(res_)[index];
    return std::string(value, len);
    char* value = m_row[index];
    // ä½¿ç”¨æ˜¾å¼ç±»åž‹è½¬æ¢
    unsigned long len = static_cast<unsigned long>(mysql_fetch_lengths(m_res)[index]);
    return string(value, len);
}
// äº‹åŠ¡æ“ä½œ
bool MysqlConn::transaction() {
    return mysql_autocommit(mysql_, false);
    return mysql_autocommit(m_mysql, false);
}
// æäº¤äº‹åŠ¡
bool MysqlConn::commit() {
    return mysql_commit(mysql_);
    return mysql_commit(m_mysql);
}
// äº‹åŠ¡å›žæ»š
bool MysqlConn::rollback() {
    return mysql_rollback(mysql_);
    return mysql_rollback(m_mysql);
}
void MysqlConn::refreshActiveTime() {
    activeTime_ = std::chrono::steady_clock::now();
    m_activeTime = chrono::steady_clock::now();
}
long long MysqlConn::getActiveTime() {
    // çº³ç±³
    std::chrono::nanoseconds nased = std::chrono::steady_clock::now() - activeTime_;
    chrono::nanoseconds nased = chrono::steady_clock::now() - m_activeTime;
    // è½¬æ¢æˆæ¯«ç±³
    std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>(nased);
    chrono::microseconds millsed = chrono::duration_cast<chrono::microseconds>(nased);
    return millsed.count();   // å¤šå°‘毫秒
}
// å®‰å…¨æ ¡éªŒå®žçŽ°ï¼Œè¿™é‡Œç®€å•ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼åˆ¤æ–­æ˜¯å¦åŒ…å«å±é™©å­—ç¬¦
bool MysqlConn::isSqlSafe(const std::string& sql) {
    std::regex dangerousPattern(".*(['\";\\-+=]).*");
    return!std::regex_search(sql, dangerousPattern);
bool MysqlConn::isSqlSafe(const string& sql) {
    regex dangerousPattern(".*(['\";\\-+=]).*");
    return!regex_search(sql, dangerousPattern);
}
void MysqlConn::freeRes() {
    if (res_) {
        mysql_free_result(res_);
        res_ = nullptr;
    if (m_res) {
        mysql_free_result(m_res);
        m_res = nullptr;
    }
}
Server/ÍõçûÔª/code/MysqlConn.h
@@ -2,48 +2,53 @@
#include <string>
#include <WinSock2.h>
//#include <mysql.h>
#include "MySQL/include/mysql.h"
#include <string.h>
#include <chrono>
#include <iostream>
#include <memory>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <regex>
#pragma comment(lib,"./MySQL/lib/libmysql.lib")
using namespace std;
class MysqlConn
{
public:
    // åˆå§‹åŒ–连接
    MysqlConn();
    // è¿žæŽ¥æ•°æ®åº“
    bool connect(std::string ip, std::string userName, std::string passwd, std::string db , int port = 3306);
    //bool connect();
    // é‡Šæ”¾èµ„源
    ~MysqlConn( );
    ~MysqlConn();
    // æ›´æ–°æ•°æ®åº“  ( insert  update delete )
    bool update(std::string sql);
    bool update(string sql);
    // æŸ¥è¯¢æ•°æ®åº“
    bool query(std::string sql);
    bool query(string sql, vector<vector<string>>& result);
    bool query(string sql);
    // å¾—到结果集
    bool getResult();
    // èŽ·å–ç»“æžœé›†çš„å­—æ®µ
    std::string getField(int index);
    string getField(int index);
    // äº‹åŠ¡æ“ä½œ
    bool transaction();
    // æäº¤äº‹åŠ¡
    bool commit( );
    bool commit();
    // äº‹åŠ¡å›žæ»š
    bool rollback();
    void refreshActiveTime( );   // åˆ·æ–°æ´»è·ƒæ—¶é—´
    void refreshActiveTime();   // åˆ·æ–°æ´»è·ƒæ—¶é—´
    long long getActiveTime();   // èŽ·å–å½“å‰æ´»è·ƒçš„æ—¶é—´é—´éš” 
    // å®‰å…¨æ ¡éªŒæŽ¥å£
    bool isSqlSafe(const std::string& sql);
private:
    bool isSqlSafe(const string& sql);
    bool isConnected();
protected:
    void freeRes();
    MYSQL* mysql_ = NULL ;
    MYSQL_RES* res_ = NULL;
    MYSQL_ROW row_ = nullptr;
    std::chrono::steady_clock::time_point  activeTime_;
    MYSQL* m_mysql;
    MYSQL_RES* m_res;
    MYSQL_ROW m_row;
    chrono::steady_clock::time_point  m_activeTime;
};
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1101.doc
Binary files differ
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1103 .doc
Binary files differ
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1104.doc
Binary files differ
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1105.doc
Binary files differ
Server/ÍõçûÔª/log/ÈÕ־ģ°å_ÍõçûÔª_1106.doc
Binary files differ
Server/³Â³þµ¤/log/ÈÕÖ¾_³Â³þµ¤_1105.doc
Binary files differ
Server/ÂíÓ庼/log/20241106À¥ÂØÈÕ±¨.doc
Binary files differ
Server/ÂíÓ庼/log/ÈÕÖ¾_ÂíÓ庼_20241106.doc
Binary files differ
common.h
@@ -50,7 +50,11 @@
    //警报管理
    WARNING_REQ, // è­¦æŠ¥è¯·æ±‚
    WARNING_RES, // è­¦æŠ¥å“åº”
    WARNING_RES, // è­¦æŠ¥å“åº”
    DATA_REQ,  // æ•°æ®è¯·æ±‚
    DATA_RES,  // æ•°æ®å“åº”
    THRESHOLD_REQ, //阈值请求
    THRESHOLD_RES, //阈值响应
    //生产计划管理
@@ -351,6 +355,7 @@
{
    Head head;
    int status;
    DevicesInfo info[0];
    QDRes() {
        head.type = QD_RES;
        head.len = sizeof(QDRes);
@@ -574,51 +579,99 @@
};
//警报管理
// è­¦æŠ¥è¯·æ±‚结构体
struct warningInfo {
    char device_name[32];//设备名称
    char des[32];//警报描述
    char time[32];//警报时间
    float warningdata;//警报数据
    char type[16];//警报类型
    char status[16];//警报状态
};
struct dataInfo {
    char device_name[32];
    char type[16];//环境数据类型
    float data;
    char time[32];//上传数据时间
};
struct threshInfo {
    char device_name[32];
    char type[16];//环境类型
    float min;//最小阈值
    float max;//最大阈值
    char time[32];//阈值修改时间
};
//警报请求结构体
struct WarningReq {
    Head head;
    Head head;
    warningInfo info[0];
    float oxygenWarning;
    float carbonWarning;
    float tempWarning;
    float humidityWarning;
    WarningReq() {
        head.type = WARNING_REQ;
        head.len = sizeof(WarningReq);
    }
};
    WarningReq() {
        head.type = WARNING_REQ;
        head.len = sizeof(WarningReq);
    }
//数据请求结构体
struct DataReq {
    Head head;
    dataInfo Info[0];
    DataReq() {
        head.type = DATA_REQ;
        head.len = sizeof(DataReq);
    }
};
//阈值请求结构体
struct ThresholdReq {
    Head head;
    threshInfo threInfo[0];
    ThresholdReq() {
        head.type = THRESHOLD_REQ;
        head.len = sizeof(ThresholdReq);
    }
};
struct DataThreshold {
    //阈值
    float oxygenThreshold;
    float carbonThreshold;
    float tempThreshold;
    float humidityThreshold;
};
struct Data {
    float oxygen;   // æ°§æ°”浓度
    float carbon;   // ä¸€æ°§åŒ–碳浓度
    float temp;     // æ¸©åº¦
    float humidity; // æ¹¿åº¦
};
// è­¦æŠ¥å“åº”结构体
//警报响应结构体
struct WarningRes {
    Head head;
    int status;         // å“åº”状态(比如 0 è¡¨ç¤ºæˆåŠŸï¼Œ1 è¡¨ç¤ºå¤±è´¥ç­‰ï¼‰
    const char* message; // å“åº”消息描述
    Head head;
    int status;// å“åº”状态
    warningInfo warninginfo[0];
    WarningRes(int stat, const char* msg) {
        head.type = WARNING_RES;
        head.len = sizeof(WarningRes);
        status = stat;
        message = msg;
    }
    WarningRes() {
        head.type = WARNING_RES;
        head.len = sizeof(WarningRes);
    }
};
struct DataRes {
    Head head;
    int status;// å“åº”状态
    dataInfo datainfo[0];
    DataRes() {
        head.type = DATA_RES;
        head.len = sizeof(DataRes);
    }
};
struct ThresholdRes {
    Head head;
    int status;// å“åº”状态
    threshInfo threInfo[0];
    ThresholdRes() {
        head.type = THRESHOLD_RES;
        head.len = sizeof(ThresholdRes);
    }
};
//生产计划管理
struct PdplanInfo
{
kunlun.sql
@@ -22,14 +22,17 @@
-- å¯¼å‡º  è¡¨ mayi_kunlun.data_info ç»“æž„
CREATE TABLE IF NOT EXISTS `data_info` (
  `id` int NOT NULL AUTO_INCREMENT,
  `device_id` int DEFAULT NULL,
  `type` varchar(50) DEFAULT NULL,
  `device_name` varchar(50) DEFAULT NULL,
  `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `data` float DEFAULT NULL,
  `time` datetime DEFAULT NULL,
  `time` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据';
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='数据';
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.data_info çš„æ•°æ®ï¼š~0 rows (大约)
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.data_info çš„æ•°æ®ï¼š~2 rows (大约)
INSERT INTO `data_info` (`id`, `device_name`, `type`, `data`, `time`) VALUES
    (1, '刘', '但是', 1, '1'),
    (2, '王', ' çš„', 2, '2');
-- å¯¼å‡º  è¡¨ mayi_kunlun.devices_management_info ç»“æž„
CREATE TABLE IF NOT EXISTS `devices_management_info` (
@@ -47,13 +50,15 @@
  `mark_name` varchar(50) DEFAULT NULL,
  `mark_time` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.devices_management_info çš„æ•°æ®ï¼š~3 rows (大约)
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.devices_management_info çš„æ•°æ®ï¼š~5 rows (大约)
INSERT INTO `devices_management_info` (`id`, `devices_name`, `devices_type`, `devices_serial_number`, `devices_status`, `area`, `longitude`, `latitude`, `purchasing_time`, `install_time`, `manufacturer`, `mark_name`, `mark_time`) VALUES
    (2, '12', '3', '2', '2', '3', 4, 6, '6', '3', '3', NULL, NULL),
    (3, '3', '1', '3', '3', '1', 2, 5, '6', '3', '6', NULL, NULL),
    (4, '10', '1', '3', '3', '1', 2, 5, '9', '3', '6', NULL, NULL);
    (6, '6', '6', '6', '6', '8', 8, 8, '8', '8', '8', NULL, NULL),
    (7, '1', '4', '4', '2', '6', 6, 9, '9', '2', '2', NULL, NULL),
    (8, '1', '2', '3', '2', '3', 2, 2, '3', '3', '1', NULL, NULL),
    (9, '10', '2', '3', '2', '3', 2, 2, '3', '3', '1', NULL, NULL),
    (10, '6', '5', '5', '5', '5', 5, 5, '5', '5', '5', NULL, NULL);
-- å¯¼å‡º  è¡¨ mayi_kunlun.month_info ç»“æž„
CREATE TABLE IF NOT EXISTS `month_info` (
@@ -70,7 +75,7 @@
-- å¯¼å‡º  è¡¨ mayi_kunlun.parsed_logs ç»“æž„
CREATE TABLE IF NOT EXISTS `parsed_logs` (
  `id` int NOT NULL AUTO_INCREMENT,
  `time_stamp` timestamp NOT NULL DEFAULT (0),
  `time_stamp` varchar(50) NOT NULL DEFAULT '0',
  `device_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `level` varchar(16) NOT NULL,
  `content` varchar(256) NOT NULL,
@@ -79,9 +84,12 @@
  `problem_line` int NOT NULL,
  `function_name` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.parsed_logs çš„æ•°æ®ï¼š~0 rows (大约)
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.parsed_logs çš„æ•°æ®ï¼š~2 rows (大约)
INSERT INTO `parsed_logs` (`id`, `time_stamp`, `device_id`, `level`, `content`, `user_id`, `file_name`, `problem_line`, `function_name`) VALUES
    (1, '2024-05-10 10:05:06', '5', '5', '5', '5', '5', 7, '5'),
    (2, '2020-05-01 11:05:02', '2', '3', '6', '3', '1', 2, '3');
-- å¯¼å‡º  è¡¨ mayi_kunlun.production_plan ç»“æž„
CREATE TABLE IF NOT EXISTS `production_plan` (
@@ -117,24 +125,14 @@
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.role_info çš„æ•°æ®ï¼š~0 rows (大约)
-- å¯¼å‡º  è¡¨ mayi_kunlun.student ç»“æž„
CREATE TABLE IF NOT EXISTS `student` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.student çš„æ•°æ®ï¼š~0 rows (大约)
-- å¯¼å‡º  è¡¨ mayi_kunlun.threshold_info ç»“æž„
CREATE TABLE IF NOT EXISTS `threshold_info` (
  `id` int NOT NULL AUTO_INCREMENT,
  `device_id` int DEFAULT NULL,
  `min_threshold` float DEFAULT NULL,
  `max_threshold` float DEFAULT NULL,
  `device_name` varchar(50) DEFAULT NULL,
  `type` varchar(50) DEFAULT NULL,
  `time` datetime DEFAULT NULL,
  `min` float DEFAULT NULL,
  `max` float DEFAULT NULL,
  `time` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='阈值';
@@ -184,27 +182,27 @@
  `version_description` char(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '',
  `version_creatime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.version_info çš„æ•°æ®ï¼š~2 rows (大约)
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.version_info çš„æ•°æ®ï¼š~3 rows (大约)
INSERT INTO `version_info` (`id`, `version_id`, `version_id_old`, `version_description`, `version_creatime`) VALUES
    (1, '1.3', '1.3', '225', '2024-10-29 15:47:00'),
    (2, '1.4', '1.4', '226', '2024-10-30 02:47:30'),
    (3, '1.5', '1.5', '227', '2024-11-01 15:48:18');
-- å¯¼å‡º  è¡¨ mayi_kunlun.warningdata_info ç»“æž„
CREATE TABLE IF NOT EXISTS `warningdata_info` (
-- å¯¼å‡º  è¡¨ mayi_kunlun.warning_info ç»“æž„
CREATE TABLE IF NOT EXISTS `warning_info` (
  `id` int NOT NULL AUTO_INCREMENT,
  `device_id` int NOT NULL,
  `device_name` varchar(50) NOT NULL DEFAULT '',
  `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `des` varchar(50) NOT NULL,
  `time` datetime NOT NULL,
  `warningdata` float NOT NULL,
  `type` varchar(50) NOT NULL,
  `warning_data` float NOT NULL,
  `time` varchar(50) NOT NULL DEFAULT '',
  `status` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='警报数据';
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.warningdata_info çš„æ•°æ®ï¼š~0 rows (大约)
-- æ­£åœ¨å¯¼å‡ºè¡¨  mayi_kunlun.warning_info çš„æ•°æ®ï¼š~0 rows (大约)
/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
~$±í.docx
Binary files differ
±í.docx
Binary files differ