ソースを参照

V1.7
1、修复了添加计划页面保存模板不生效的问题
2、添加了管理员和普通用户的权限区别

Apple 2 週間 前
コミット
5a580d7bad

+ 73 - 1
TransmitterSwitch/ManagerPlan/managerplan.cpp

@@ -13,6 +13,8 @@
 #include "tipwidget.h"
 #include "LHQLogAPI.h"
 #include "savetotemplate.h"
+#include "FromWebAPI.h"
+#include "FromSQLite.h"
 
 
 ManagerPlan::ManagerPlan(Enum_Mode mode, QDialog *parent) :
@@ -181,6 +183,28 @@ void ManagerPlan::setPlanList(QList<OnePlanItemInfo>& listPlan)
     }
 }
 
+/* 设置FromWebAPI地址,复用主窗口的WebAPI */
+void ManagerPlan::setFromWebAPI(FromWebAPI* fromWebAPI)
+{
+    if(fromWebAPI == nullptr)
+    {
+        LH_WRITE_ERROR("传入的FromWebAPI指针为空");
+        return;
+    }
+    m_fromWebAPI = fromWebAPI;
+}
+
+/* 设置FromSQLite地址,复用主窗口的SQLite */
+void ManagerPlan::setFromSQLite(FromSQLite* fromSQLite)
+{
+    if(fromSQLite == nullptr)
+    {
+        LH_WRITE_ERROR("传入的FromSQLite指针为空");
+        return;
+    }
+    m_fromSQLite = fromSQLite;
+}
+
 
 /* 修改UI样式 */
 void ManagerPlan::do_setUIStyle()
@@ -515,6 +539,54 @@ void ManagerPlan::setButtonVisible(bool isVisible)
     }
 }
 
+/* 保存模版 */
+void ManagerPlan::saveTemplateToEQM()
+{
+    if(m_fromWebAPI == nullptr && m_fromSQLite == nullptr)
+    {
+        LH_WRITE_ERROR("没有初始化FromWebAPI或FromSQLite");
+        return;
+    }
+    auto chnInfo = ui->pCard->getChannelInfo();
+    /* 获取所有的模板名称 */
+    QList<OneTemplateInfo> list;
+    if(!m_fromWebAPI->getTemplateList(chnInfo.ChannelID, list))
+    {
+        LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(chnInfo.ChannelID));
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
+        return;
+    }
+    /* 弹出导出页面 */
+    std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>();
+    stt->setQSS(EPUIStyle.getQSSPath());
+    stt->setTemplateList(list);
+    stt->exec();
+    if(!stt->isOk())
+    {
+        return;
+    }
+    /* 获取一天的数据 */
+    QList<OnePlanItemInfo> listTmp;
+    ui->pCard->getAllPlanInfo(listTmp);
+    /* 保存到模板 */
+    bool isSuccess = false;
+    if(GInfo.isOnlineDB())
+    {
+        isSuccess = m_fromWebAPI->saveTemplate(stt->getTemplateName(), listTmp);
+    }else {
+        isSuccess = m_fromSQLite->saveTemplate(stt->getTemplateName(), listTmp);
+    }
+
+    if(isSuccess)
+    {
+        TipWidget::display(TipWidget::OPERATOR_OK, "保存模版成功", this);
+    }else {
+        TipWidget::display(TipWidget::OPERATOR_FAIL, "保存模版失败", this);
+    }
+    /* 调用回调函数 */
+    emit signal_callBack(3);
+}
+
 
 /* 选择了一个频率 */
 void ManagerPlan::do_selectFrequency(int index)
@@ -689,7 +761,7 @@ void ManagerPlan::do_saveTemplate()
         return;
     }
     
-    emit signal_saveTemplate(ui->pCard->getChannelInfo());
+    saveTemplateToEQM();
 
 }
 

+ 17 - 2
TransmitterSwitch/ManagerPlan/managerplan.h

@@ -5,6 +5,9 @@
 
 #include "PlanData.h"
 
+class FromWebAPI;
+class FromSQLite;
+
 namespace Ui {
 class ManagerPlan;
 }
@@ -40,9 +43,15 @@ public:
     /* 设置计划列表,给修改模版使用 */
     void setPlanList(QList<OnePlanItemInfo>& listPlan);
 
+    /* 设置FromWebAPI地址,复用主窗口的WebAPI */
+    void setFromWebAPI(FromWebAPI* fromWebAPI);
+    /* 设置FromSQLite地址,复用主窗口的SQLite */
+    void setFromSQLite(FromSQLite* fromSQLite);
+
 signals:
-    /* 发送保存模版信号 */
-    void signal_saveTemplate(ChannelInfo info);
+
+    /* 发送调用回调函数的信号 */
+    void signal_callBack(int actionID);
 
 public slots:
     /* 修改UI样式 */
@@ -79,6 +88,9 @@ private:
     /* 设置按钮显示或隐藏 */
     inline void setButtonVisible(bool isVisible);
 
+    /* 保存模版 */
+    void saveTemplateToEQM();
+
 private slots:
     /* 选择了一个频率 */
     void do_selectFrequency(int index);
@@ -120,6 +132,9 @@ private:
 
     /* 存储计划信息,修改过的频率计划,存储的是这个频率完整的计划 */
     QMap<int, QList<PlanInfo>> m_mapPlanInfo;
+
+    FromWebAPI* m_fromWebAPI = nullptr;  /* 网络API接口,用于获取和保存数据 */
+    FromSQLite* m_fromSQLite = nullptr; /* SQLite数据库操作类 */
 };
 
 #endif // MANAGERPLAN_H

+ 28 - 4
TransmitterSwitch/Resource/QSS/dark/transmitterswitch.qss

@@ -56,23 +56,39 @@ QPushButton#pBtn_defaultPlan
     /* background: #202428; */
     border-radius: 20px 20px 20px 20px;
 }
-QPushButton#pBtn_defaultPlan:checked
+QPushButton#pBtn_defaultPlan:enabled:checked
 {
     border-image: url(:/ICON/ICON/Switch_Open.png);
 }
-QPushButton#pBtn_defaultPlan
+QPushButton#pBtn_defaultPlan:disabled:checked
+{
+    border-image: url(:/ICON/ICON/Switch_OpenNoEdit.png);
+}
+QPushButton#pBtn_defaultPlan:enabled
 {
     border-image: url(:/ICON/ICON/Switch_Close.png);
 }
+QPushButton#pBtn_defaultPlan:disabled
+{
+    border-image: url(:/ICON/ICON/Switch_Close_NoEdit.png);
+}
 
-QRadioButton#rBtn_moment::indicator:unchecked, QRadioButton#rBtn_day::indicator:unchecked
+
+QRadioButton#rBtn_moment::indicator:unchecked, #rBtn_day::indicator:unchecked
 {
     background: #FFFFFF;
     border-radius: 6px;
     border: 2px solid #E5E6EB;
     /* border-image: url(:/ICON/ICON/rBtn_Unchaecked.png); */
 }
-QRadioButton#rBtn_moment::indicator:checked, QRadioButton#rBtn_day::indicator:checked
+QRadioButton#rBtn_moment::indicator:unchecked:disabled, #rBtn_day::indicator:unchecked:disabled
+{
+    background: #cfcfcf;
+    border-radius: 6px;
+    border: 2px solid #E5E6EB;
+    /* border-image: url(:/ICON/ICON/rBtn_Unchaecked.png); */
+}
+QRadioButton#rBtn_moment::indicator:checked, #rBtn_day::indicator:checked
 {
     background: #FFFFFF;
     border-radius: 6px;
@@ -80,6 +96,14 @@ QRadioButton#rBtn_moment::indicator:checked, QRadioButton#rBtn_day::indicator:ch
     color: #B1B3B4;
     /* border-image: url(:/ICON/ICON/rBtn_Checked.png); */
 }
+QRadioButton#rBtn_moment::indicator:checked:disabled, #rBtn_day::indicator:checked:disabled
+{
+    background: #FFFFFF;
+    border-radius: 6px;
+    border: 4px solid #507de4;
+    color: #B1B3B4;
+    /* border-image: url(:/ICON/ICON/rBtn_Checked.png); */
+}
 
 QLabel#label_Tip
 {

+ 27 - 4
TransmitterSwitch/Resource/QSS/white/transmitterswitch.qss

@@ -52,24 +52,39 @@ QPushButton#pBtn_defaultPlan
     /* background: #202428; */
     border-radius: 20px 20px 20px 20px;
 }
-QPushButton#pBtn_defaultPlan:checked
+QPushButton#pBtn_defaultPlan:enabled:checked
 {
     border-image: url(:/ICON/ICON/Switch_Open.png);
 }
-QPushButton#pBtn_defaultPlan
+QPushButton#pBtn_defaultPlan:disabled:checked
+{
+    border-image: url(:/ICON/ICON/Switch_OpenNoEdit.png);
+}
+QPushButton#pBtn_defaultPlan:enabled
 {
     border-image: url(:/ICON/ICON/Switch_Close.png);
 }
+QPushButton#pBtn_defaultPlan:disabled
+{
+    border-image: url(:/ICON/ICON/Switch_Close_NoEdit.png);
+}
 
 
-QRadioButton#rBtn_moment::indicator:unchecked, QRadioButton#rBtn_day::indicator:unchecked
+QRadioButton#rBtn_moment::indicator:unchecked, #rBtn_day::indicator:unchecked
 {
     background: #FFFFFF;
     border-radius: 6px;
     border: 0px solid #E5E6EB;
     border-image: url(:/ICON/ICON/rBtn_Unchaecked.png);
 }
-QRadioButton#rBtn_moment::indicator:checked, QRadioButton#rBtn_day::indicator:checked
+QRadioButton#rBtn_moment::indicator:unchecked:disabled, #rBtn_day::indicator:unchecked:disabled
+{
+    background: #cfcfcf;
+    border-radius: 6px;
+    border: 0px solid #E5E6EB;
+    border-image: url(:/ICON/ICON/rBtn_Unchaecked.png);
+}
+QRadioButton#rBtn_moment::indicator:checked, #rBtn_day::indicator:checked
 {
     background: #FFFFFF;
     border-radius: 6px;
@@ -77,6 +92,14 @@ QRadioButton#rBtn_moment::indicator:checked, QRadioButton#rBtn_day::indicator:ch
     color: #B1B3B4;
     border-image: url(:/ICON/ICON/rBtn_Checked.png);
 }
+QRadioButton#rBtn_moment::indicator:checked:disabled, #rBtn_day::indicator:checked:disabled
+{
+    background: #FFFFFF;
+    border-radius: 6px;
+    border: 0px solid #507de4;
+    color: #B1B3B4;
+    border-image: url(:/ICON/ICON/rBtn_Checked.png);
+}
 
 
 

+ 68 - 45
TransmitterSwitch/Template/templatemanager.cpp

@@ -42,47 +42,19 @@ TemplateManager::TemplateManager(QWidget *parent) :
     auto pShadow = new OneShadowEffect(this);
     this->setGraphicsEffect(pShadow);
 
-    /* 设置列数 */
-    ui->tableWidget->horizontalHeader()->setVisible(true);
-    ui->tableWidget->setColumnCount(5);
-    /* 设置列表头 */
-    QStringList headerList = {"频率名称", "模版名称", "", "", ""};
-    ui->tableWidget->setHorizontalHeaderLabels(headerList);
-    ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
-    ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
-
-    /* 设置列表头高度 */
-    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(40);
-    /* 设置列宽间距,在显示事件中设置 */
-    /* 设置列宽度固定 */
-    ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
-    ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
-    ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
-
-    //设置行高
-    ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
-    
-    /* 设置可编辑,后续创建的时候,单独设置不可编辑 */
-    ui->tableWidget->setEditTriggers(QTableWidget::DoubleClicked);
-    //设置选中一行
-    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
-    //设置只能选中一行
-    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
-    //隐藏横滚动条
-    ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-    //隐藏网格线
-    ui->tableWidget->setShowGrid(false);
-    //隐藏行号
-    ui->tableWidget->verticalHeader()->setVisible(false);
-    //设置不显示选中后的虚线
-    ui->tableWidget->setFocusPolicy(Qt::NoFocus);
-
-    /* 设置第二列输入字数限制 */
-    LineEditDelegate* delegate = new LineEditDelegate(15, this);
-    ui->tableWidget->setItemDelegateForColumn(1, delegate);
-
-    //开启排序功能
-//    ui->tableWidget->setSortingEnabled(true);
+    /* 获取管理员类型 */
+    eUserPermission userPermission = GInfo.getUserPermission();
+    if(userPermission == eUserPermission::User_Administrator)
+    {
+        /* 管理员权限 */
+        m_columnCount = 5; // 模版名称、模版频率、预览、修改、删除
+    }
+    else if(userPermission == eUserPermission::User_Normal)
+    {
+        /* 普通用户权限 */
+        m_columnCount = 3; // 模版名称、模版频率、预览
+    }
+    initTableWidget(m_columnCount);
 
 
     connect(ui->pBtn_close,SIGNAL(clicked()),this,SLOT(close()));
@@ -212,13 +184,17 @@ void TemplateManager::do_itemChanged(QTableWidgetItem* item)
 /* 显示事件 */
 void TemplateManager::showEvent(QShowEvent *event)
 {
+    /* 根据显示的列数计算每列的宽度 */
+    int editColum = m_columnCount -2;
     /* 设置列宽度 */
-    int width = (ui->tableWidget->width() - ( 66 * 3)) / 2;
+    int width = (ui->tableWidget->width() - ( 66 * editColum)) / 2;
     ui->tableWidget->setColumnWidth(0, width);
     ui->tableWidget->setColumnWidth(1, width);
-    ui->tableWidget->setColumnWidth(2, 66);
-    ui->tableWidget->setColumnWidth(3, 66);
-    ui->tableWidget->setColumnWidth(4, 66);
+
+    for(int i = 2; i < m_columnCount; i++)
+    {
+        ui->tableWidget->setColumnWidth(i, 66);
+    }
 }
 
 
@@ -293,6 +269,53 @@ void TemplateManager::setFromSQLite(FromSQLite* sqlite)
     m_fromWebAPI = nullptr;
 }
 
+/* 初始化表格 */
+void TemplateManager::initTableWidget(int columnCount)
+{
+    
+    /* 设置列数 */
+    ui->tableWidget->horizontalHeader()->setVisible(true);
+    ui->tableWidget->setColumnCount(columnCount);
+    /* 设置列表头 */
+    QStringList headerList = {"频率名称", "模版名称", "", "", ""};
+    ui->tableWidget->setHorizontalHeaderLabels(headerList);
+    ui->tableWidget->horizontalHeader()->setSectionsClickable(false);
+    ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+
+    /* 设置列表头高度 */
+    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(40);
+    /* 设置列宽间距,在显示事件中设置 */
+    /* 设置列宽度固定 */
+    ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
+    ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
+    ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
+
+    //设置行高
+    ui->tableWidget->verticalHeader()->setDefaultSectionSize(40);
+    
+    /* 设置可编辑,后续创建的时候,单独设置不可编辑 */
+    ui->tableWidget->setEditTriggers(QTableWidget::DoubleClicked);
+    //设置选中一行
+    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
+    //设置只能选中一行
+    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+    //隐藏横滚动条
+    ui->tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    //隐藏网格线
+    ui->tableWidget->setShowGrid(false);
+    //隐藏行号
+    ui->tableWidget->verticalHeader()->setVisible(false);
+    //设置不显示选中后的虚线
+    ui->tableWidget->setFocusPolicy(Qt::NoFocus);
+
+    /* 设置第二列输入字数限制 */
+    LineEditDelegate* delegate = new LineEditDelegate(15, this);
+    ui->tableWidget->setItemDelegateForColumn(1, delegate);
+
+    //开启排序功能
+//    ui->tableWidget->setSortingEnabled(true);
+}
+
 
 
 /* 添加一行 */

+ 4 - 0
TransmitterSwitch/Template/templatemanager.h

@@ -69,6 +69,8 @@ public:
 signals:
     
 private:
+    /* 初始化表格 */
+    void initTableWidget(int columnCount);
     /* 添加一行 */
     void createRow(const OneTemplateInfo& info);
     /* 修改模版 */
@@ -108,6 +110,8 @@ private:
     // QString m_templateName;                             /* 模版名称 */
     int m_type = -1;                                    /* 模版类型 */
 
+    int m_columnCount = 5;                             /* 列数 */
+
     QPoint m_lastPos;                                   /* 鼠标点击的位置 */
     const int m_roleChnID = Qt::UserRole + 1;           /* 角色名称 */
     const int m_roleTemplateName = Qt::UserRole + 2;    /* 模板名称,传进来的模板名称 */

+ 19 - 1
TransmitterSwitch/TransmitterSwitchInfo.h

@@ -84,17 +84,29 @@ enum class enum_WeekDay : int
     WeekDay_Special = 8            /* 特殊日 */
 };
 
+/**
+ * @brief 用户权限枚举
+ * 
+ */
+enum class eUserPermission : int
+{
+    User_Administrator = 0,         /* 管理员 */
+    User_Normal = 1,                /* 普通用户 */
+};
+
 /**
  * @brief WebAPI初始化数据
  * 
  */
 struct InitData
 {
+    int userPermission = 0;     /* 用户权限,0管理员,1普通用户 */
     QString url;                /* WebAPI地址 */
     QString serverID;           /* 服务器ID */
     QString serverKey;          /* 服务器Key */
     InitData& operator=(const InitData& data)
     {
+        userPermission = data.userPermission;
         url = data.url;
         serverID = data.serverID;
         serverKey = data.serverKey;
@@ -439,11 +451,17 @@ public:
     /* 获取数据库路径 */
     QString getDatabasePath() const { return DatabasePath; }
 
-private:
+    /* 设置权限 */
+    void setUserPermission(eUserPermission permission) { m_userPermission = permission; }
+    /* 获取权限 */
+    eUserPermission getUserPermission() const { return m_userPermission; }
 
+private:
     bool m_oneFrequency = false;            /* 单频率模式 */
     bool m_isOnlineDB = true;               /* 是否在线数据库 */
 
+    eUserPermission m_userPermission = eUserPermission::User_Administrator; /* 用户权限,默认普通用户 */
+
     ChannelInfo channelInfo;                /* 频率信息 */
     QString DatabasePath;                   /* 数据库路径 */
 };

+ 13 - 1
TransmitterSwitch/lhtranmitterswitch.cpp

@@ -33,7 +33,7 @@ int LHTRANSMITTERSWITCH_EXPORT DoCreateWindow(int skintype, QWidget* parent)
         }
         g_pTransmitterSwitch->setUIStyle(skintype);
     }
-    g_pTransmitterSwitch->setWebAPIInfo(g_initData);
+    g_pTransmitterSwitch->initTS(g_initData);
     return 0;
 }
 
@@ -105,6 +105,18 @@ int LHTRANSMITTERSWITCH_EXPORT DoSetCallBack(trackCallBack cb)
     return 0;
 }
 
+int LHTRANSMITTERSWITCH_EXPORT DoSetUserPermission(int USerPermission)
+{
+    if(g_pTransmitterSwitch == nullptr)
+    {
+        return -1;
+    }
+    
+    g_pTransmitterSwitch->setUserPermission(USerPermission);
+
+    return 0;
+}
+
 int LHTRANSMITTERSWITCH_EXPORT DoInitLibrary()
 {
     /* 初始化日志库 */

+ 12 - 0
TransmitterSwitch/lhtranmitterswitch.h

@@ -16,6 +16,7 @@ struct ExecPlanInfo;
 struct OnePlanItemInfo;
 struct ExecPlanConfig;
 
+
 /* 回调函数 */
 using trackCallBack = void(*)(int actionID, QString strMemo);
 
@@ -109,6 +110,17 @@ int LHTRANSMITTERSWITCH_EXPORT DoRelease();
 //------------------------------------------------------------------------
 int LHTRANSMITTERSWITCH_EXPORT DoSetCallBack(trackCallBack cb);
 
+//------------------------------------------------------------------------
+//函    数: DoSetCallBack()
+//
+//说    明: 释放资源
+//
+//参    数: trackCallBack 函数指针
+//
+//返 回 值:0:成功; 其他:失败(详见返回码定义)
+//------------------------------------------------------------------------
+int LHTRANSMITTERSWITCH_EXPORT DoSetUserPermission(int USerPermission);
+
 
 
 /*===========================================================================

+ 79 - 7
TransmitterSwitch/transmitterswitch.cpp

@@ -117,6 +117,48 @@ TransmitterSwitch::~TransmitterSwitch()
     delete ui;
 }
 
+/* 初始化webAPI,重载版 */
+void TransmitterSwitch::initTS(const InitData& data)
+{
+    setWebAPIInfo(data.url, data.serverID, data.serverKey);
+    /* 设置权限 */
+    setUserPermission(data.userPermission);
+}
+
+
+/* 修改用户权限 */
+void TransmitterSwitch::setUserPermission(int userPermission)
+{
+    eUserPermission userPerm = static_cast<eUserPermission>(userPermission);
+    GInfo.setUserPermission(userPerm);
+    if(eUserPermission::User_Administrator == userPerm)
+    {
+        /* 管理员权限 */
+        ui->pBtn_addPlan->show();
+        ui->pBtn_editPlan->show();
+        ui->pBtn_deletePlan->show();
+        ui->pBtn_cloneToOther->show();
+        ui->pBtn_exportPlan->show();
+
+        ui->pBtn_defaultPlan->setEnabled(true);
+        ui->rBtn_moment->setEnabled(true);
+        ui->rBtn_day->setEnabled(true);
+    }
+    else if(eUserPermission::User_Normal == userPerm)
+    {
+        /* 普通用户权限 */
+        ui->pBtn_addPlan->hide();
+        ui->pBtn_editPlan->hide();
+        ui->pBtn_deletePlan->hide();
+        ui->pBtn_cloneToOther->hide();
+        ui->pBtn_exportPlan->hide();
+
+        ui->pBtn_defaultPlan->setEnabled(false);
+        ui->rBtn_moment->setEnabled(false);
+        ui->rBtn_day->setEnabled(false);
+    }
+}
+
 
 /* 设置样式表路径,给弹窗页面使用,不需要包含最后的white,black */
 void TransmitterSwitch::setQSSPath(const QString &qssPath)
@@ -162,11 +204,6 @@ void TransmitterSwitch::setWebAPIInfo(const QString &url, const QString &serverI
     createAllCard();
 }
 
-/* 初始化webAPI,重载版 */
-void TransmitterSwitch::setWebAPIInfo(const InitData& data)
-{
-    setWebAPIInfo(data.url, data.serverID, data.serverKey);
-}
 
 
 
@@ -544,7 +581,9 @@ void TransmitterSwitch::do_pBtnAddExecPlan()
     }else {
         mp->setFrequencyID(pCard->getChannelInfo());
     }
-    connect(mp.get(), &ManagerPlan::signal_saveTemplate, this, &TransmitterSwitch::do_saveTemplateToDB);
+    mp->setFromWebAPI(m_fromWebAPI);
+    mp->setFromSQLite(m_fromSQLite);
+    connect(mp.get(), &ManagerPlan::signal_callBack, this, &TransmitterSwitch::do_callBack);
     mp->exec();
 
     /* 判断是否点击了OK */
@@ -617,7 +656,10 @@ void TransmitterSwitch::do_pBtnModifyExecPlan()
     std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Modify);
     /* 设置频率信息 */
     mp->setFrequencyID(pCard->getChannelInfo());
-    connect(mp.get(), &ManagerPlan::signal_saveTemplate, this, &TransmitterSwitch::do_saveTemplateToDB);
+
+    mp->setFromWebAPI(m_fromWebAPI);
+    mp->setFromSQLite(m_fromSQLite);
+    connect(mp.get(), &ManagerPlan::signal_callBack, this, &TransmitterSwitch::do_callBack);
 
     mp->exec();
 
@@ -662,6 +704,13 @@ void TransmitterSwitch::do_pBtnRefresh()
 /* 点击了“是否开启计划”按钮 */
 void TransmitterSwitch::do_pBtnIsOpenPlan()
 {
+    /* 判断有无权限 */
+    // if(GInfo.getUserPermission() != eUserPermission::User_Administrator)
+    // {
+    //     TipWidget::display(TipWidget::OPERATOR_WARN, "仅管理员可修改", this);
+    //     return;
+    // }
+
     if(!GInfo.isOnlineDB())
     {
         return;
@@ -696,6 +745,13 @@ void TransmitterSwitch::do_pBtnIsOpenPlan()
 /* 点击了“执行模式”按钮 */
 void TransmitterSwitch::do_pBtnExecMode()
 {
+    /* 判断有无权限 */
+    // if(GInfo.getUserPermission() != eUserPermission::User_Administrator)
+    // {
+    //     TipWidget::display(TipWidget::OPERATOR_WARN, "仅管理员可修改", this);
+    //     return;
+    // }
+
     if(!GInfo.isOnlineDB())
     {
         return;
@@ -1035,6 +1091,22 @@ void TransmitterSwitch::do_selectFrequencyBtn()
     
 }
 
+/* 调用了回调函数 */
+void TransmitterSwitch::do_callBack(int actionID)
+{
+    if(m_trackCB == nullptr)
+    {
+        LH_WRITE_ERROR("回调函数为空");
+        return;
+    }
+    if(actionID < 0 || actionID >= static_cast<int>(g_mapTrack.size()))
+    {
+        LH_WRITE_ERROR(QString("错误的actionID: %1").arg(actionID));
+        return;
+    }
+    m_trackCB(actionID, g_mapTrack.value(actionID));
+}
+
 
 
 /* 添加一个频率,包括左侧按钮和右侧卡片 */

+ 9 - 1
TransmitterSwitch/transmitterswitch.h

@@ -32,11 +32,16 @@ public:
     explicit TransmitterSwitch(QWidget *parent = nullptr);
     ~TransmitterSwitch();
 
+    /* 初始化页面 */
+    void initTS(const InitData& data);
+    /* 修改用户权限 */
+    void setUserPermission(int userPermission);
+
     /* 设置样式表路径,给弹窗页面使用,不需要包含最后的white,black */
     void setQSSPath(const QString &qssPath);
     /* 设置WebAPI信息 */
     void setWebAPIInfo(const QString &url, const QString &serverID, const QString &serverKey);
-    void setWebAPIInfo(const InitData& data);
+    
 
     /* 获取EQM数据库中的计划 */
     void getExecPlanFromEQM();
@@ -102,6 +107,9 @@ private slots:
     /* 选择了一个频率按钮,取消其他的选择 */
     void do_selectFrequencyBtn();
 
+    /* 调用了回调函数 */
+    void do_callBack(int actionID);
+
 private:
 
     /* 添加一个频率,包括左侧按钮和右侧卡片 */

+ 11 - 1
show1/LHTransmitterSwitchAPI/lhtransmitterswitchapi.cpp

@@ -71,10 +71,11 @@ bool LHTransmitterSwitchAPI::loadLibrary()
     m_pSaveExecPlanToEQM = (pSaveExecPlanToEQM)lib.resolve("DoSaveExecPlanToEQM");
     m_pRelease = (pRelease)lib.resolve("DoRelease");
     m_pSetCallBack = (pSetCallBack)lib.resolve("DoSetCallBack");
+    m_pSetUserPermission = (pSetUserPermission)lib.resolve("DoSetUserPermission");
 
     if(m_pInit == nullptr || m_pCreateWindow == nullptr || m_pShowWindow == nullptr || 
         m_pGetExecPlanFromEQM == nullptr || m_pSaveExecPlanToEQM == nullptr || 
-        m_pRelease == nullptr || m_pSetCallBack == nullptr)
+        m_pRelease == nullptr || m_pSetCallBack == nullptr || m_pSetUserPermission == nullptr)
     {
         return false;
     }
@@ -163,6 +164,15 @@ int LHTransmitterSwitchAPI::DoSetCallBack(trackCallBack cb)
     return m_pSetCallBack(cb);
 }
 
+int LHTransmitterSwitchAPI::DoSetUserPermission(int userPermission)
+{
+    if(m_pSetUserPermission == nullptr)
+    {
+        return -1;
+    }
+    return m_pSetUserPermission(userPermission);
+}
+
 int LHTransmitterSwitchAPI::DoInitLibrary()
 {
     if(m_pDoInitLibrary == nullptr)

+ 14 - 0
show1/LHTransmitterSwitchAPI/lhtransmitterswitchapi.h

@@ -21,9 +21,20 @@ enum class enum_WeekDay : int
     WeekDay_Special = 8            /* 特殊日 */
 };
 
+/**
+ * @brief 用户权限枚举
+ * 
+ */
+enum class eUserPermission : int
+{
+    User_Administrator = 0,         /* 管理员 */
+    User_Normal = 1,                /* 普通用户 */
+};
+
 /* 初始化数据 */
 struct InitData
 {
+    int userPermission = 0;          /* 用户权限,0是普通用户,1是管理员 */
     QString url;
     QString serverID;
     QString serverKey;
@@ -91,6 +102,7 @@ class LHTransmitterSwitchAPI
     using pSaveExecPlanToEQM = int(*)();
     using pRelease = int(*)();
     using pSetCallBack = int(*)(trackCallBack);
+    using pSetUserPermission = int(*)(int);
 
     using pDoInitLibrary = int(*)();
     using pCreateOneWindow = int(*)(int, QWidget*);
@@ -115,6 +127,7 @@ public:
     int DoSaveExecPlanToEQM();
     int DoRelease();
     int DoSetCallBack(trackCallBack cb);
+    int DoSetUserPermission(int userPermission);
 
     int DoInitLibrary();
     int DoCreateOneWindow(int skintype, QWidget* parent);
@@ -133,6 +146,7 @@ private:
     pSaveExecPlanToEQM m_pSaveExecPlanToEQM = nullptr;
     pRelease m_pRelease = nullptr;
     pSetCallBack m_pSetCallBack = nullptr;
+    pSetUserPermission m_pSetUserPermission = nullptr;
 
     pDoInitLibrary m_pDoInitLibrary = nullptr;
     pCreateOneWindow m_pCreateOneWindow = nullptr;

+ 24 - 0
show1/widget.cpp

@@ -41,6 +41,7 @@ Widget::Widget(QWidget *parent) :
     InitData initData;
     initData.url = "http://192.1.3.133:31000/v6/";
     initData.serverID = "2e36b53ccd2a433b9a803b98d683ed91";
+    initData.userPermission = 1;
 
     // initData.url = "http://192.1.3.136:31000/v6/";
     // initData.serverID = "2e36b53ccd2a433b9a803b98d683ed91";
@@ -162,6 +163,29 @@ void Widget::on_pBtn_useEQM_clicked()
     
 }
 
+/* 切换用户权限 */
+void Widget::on_pBtn_changeUser_clicked()
+{
+    if(m_tSwitch == nullptr)
+    {
+        SPDLOG_DEBUG("TransmitterSwitch is nullptr");
+        return;
+    }
+    if(m_userPermission == 0)
+    {
+        m_userPermission = 1;
+        /* 设置为普通用户 */
+        m_tSwitch->DoSetUserPermission(m_userPermission);
+        ui->pBtn_changeUser->setText("普通用户");
+    }else 
+    {
+        m_userPermission = 0;
+        /* 设置为管理员 */
+        m_tSwitch->DoSetUserPermission(m_userPermission);
+        ui->pBtn_changeUser->setText("管理员");
+    }    
+}
+
 /* 添加测试用的设备信息 */
 // void Widget::addTestDevice()
 // {

+ 4 - 0
show1/widget.h

@@ -29,6 +29,9 @@ private slots:
     void on_pBtn_light_dark_clicked();
     /* 切换是否使用EQM数据库 */
     void on_pBtn_useEQM_clicked();
+    /* 切换用户权限 */
+    void on_pBtn_changeUser_clicked();
+    
 
 private:
     /* 添加测试用的设备信息 */
@@ -42,6 +45,7 @@ private:
     LHTransmitterSwitchAPI* m_tSwitch;           /* 开关页面 */
     QVBoxLayout* m_layout;                  /* 布局 */
     int m_style = 0;                        /* 亮色/暗色 */
+    int m_userPermission = 0;           /* 用户权限,0是普通用户,1是管理员 */
 };
 
 

+ 13 - 0
show1/widget.ui

@@ -84,6 +84,19 @@
         </property>
        </widget>
       </item>
+      <item>
+       <widget class="QPushButton" name="pBtn_changeUser">
+        <property name="minimumSize">
+         <size>
+          <width>120</width>
+          <height>32</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>切换用户</string>
+        </property>
+       </widget>
+      </item>
       <item>
        <spacer name="horizontalSpacer">
         <property name="orientation">