日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt编写物联网管理平台31-用户权限管理

發布時間:2024/1/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt编写物联网管理平台31-用户权限管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

隨著需求的不斷變化,功能的增多,在用戶信息這塊,除了需要用戶登錄退出驗證以外,還需要有個簡單的用戶權限邏輯處理,比如限定某些用戶只有查看權限,沒有刪除記錄、清空記錄、系統設置的權限,與之相對應的就是用戶信息表中,存儲有該用戶具備哪些權限,當該用戶登錄成功以后,對應的權限應用到各個界面邏輯中,一般都是在觸發了對應的顯示或者單擊后處理,比如不具備刪除記錄權限,則在對應的刪除記錄代碼中過濾處理,判斷當前登錄的用戶是否具備該權限,不具備則彈出提示,不做處理。還有一個就是切換界面的時候,沒有到該界面的權限彈出提示,并仍然停留在上一個界面。

在十幾年的從業生涯中,最開始編程的時候,也做過簡單的權限管理,思路極其簡單那就是根據用戶類型寫死,比如某個用戶是管理員類型,則具備所有權限,某個用戶是操作員類型,則不能有刪除記錄、用戶管理的權限。好處是容易理解,邏輯簡單到爆,缺點是代碼寫死,不能動態控制某個擁有某個模塊的權限。暫且將這種處理叫做v0.1版本。

為了能夠更進一步的拓展功能,后面修改過用戶權限管理,暫且稱為v0.2版本。在用戶信息表中增加了一個用戶權限字段,字符串表示 1|0|1 之類的,按照順序約定對應位是哪個模塊,1表示有該模塊的權限,0表示沒有權限,相對于v0.1版本的時候,可以控制不同模塊的權限,相對靈活一些,但是還是不夠通用,對約定的要求極其嚴格。

于是來到了現在的v0.3版本,索性增加了7個用戶權限字段,對應用戶7種模塊權限,至于該種權限是對應哪個模塊,填入對應的字符串名稱就行,這樣可以做一個通用的權限校驗功能,不用用戶權限驗證代碼寫的到處都是,用戶擁有該名稱的權限則通過,不具備則彈出提示,一般常規的權限就有系統設置、刪除記錄、用戶管理。

二、功能特點

2.1 軟件模塊

  • 設備監控模塊,包括數據監控(表格形式展示)、設備面板(面板形式展示)、地圖監控(地圖形式展示)、曲線監控(曲線形式展示)。
  • 數據查詢模塊,包括報警記錄、運行記錄、操作記錄。
  • 系統設置模塊,包括基本設置、端口管理、控制器管理、探測器管理、報警聯動、類型設置等。
  • 其他設置模塊,包括用戶管理、地圖管理、位置調整、組態設計、設備調試等。
  • 2.2 基礎功能

  • 設備數據采集,支持串口、網絡,串口可設置串口號、波特率,網絡可設置IP地址、通訊端口。
  • 每個端口支持采集周期時間,默認1秒鐘一個設備。
  • 支持設置通訊超時次數,默認3次。
  • 支持最大重連時間,用于重新讀取離線的設備。
  • 控制器信息,能夠添加控制器名稱,選擇控制器地址、控制器型號,設置該控制器下面的探測器數量。
  • 探測器信息,能夠添加位號、探測器型號、氣體種類、氣體符號、高報值、低報值、緩沖值、清零值、是否啟用、報警聲音、背景地圖、存儲周期、數值換算小數點位數、報警延時時間、報警的類型(HH,LL,HL)等。
  • 類型管理可配置控制器型號、探測器型號、氣體種類、氣體符號等。
  • 地圖支持導入和刪除,所有的探測器在地圖上的位置可自由拖動保存。
  • 端口信息、控制器信息、探測器信息、類型信息、用戶信息等,都支持導入、導出、導出到excel、打印。
  • 運行記錄、報警記錄、操作記錄,都支持多條件組合查詢,比如時間段、控制器、探測器等,所有記錄支持導出到excel/pdf和打印。
  • 運行記錄、報警記錄、操作記錄都可刪除指定時間范圍內的數據。
  • 系統設置可選擇對應表最大保存記錄數,自動清理早期數據,留出足夠的空間存儲重要的數據。
  • 報警短信轉發,支持多個接收手機號碼,可設定發送間隔,比如即時發送或者6個小時發送一次所有的報警信息,短信內容過長,自動拆分多條短信。
  • 報警郵件轉發,支持多個接收郵箱,可設定發送間隔,比如即時發送或者6個小時發送一次所有的報警信息,支持附件發送。
  • 設置軟件的中文標題、英文標題、logo路徑、版權所有等。
  • 開關設置開機運行、報警聲音、自動登錄、記住密碼等。
  • 報警聲音可設置播放次數,界面風格樣式提供18套皮膚文件選擇。
  • 用戶管理,包括用戶權限配置,不同用戶可以有不同模塊的權限。
  • 用戶登錄和用戶退出,可以記住密碼和自動登錄,超過三次報錯提示并關閉程序。
  • 四種監控模式,設備面板監控、地圖監控、表格數據監控、曲線數據監控,可自由切換,四種模式下都實時展示采集到的數據,報警閃爍等。
  • 報警繼電器聯動,一個位號可以跨串口聯動多個模塊和繼電器號,支持多對多。
  • 2.3 特色功能

  • 通信協議支持modbus_com、modbus_tcp_rtu,后期拓展mqtt等協議。
  • 數據源除了真實的硬件設備采集,還可選數據庫采集,這樣用戶可以安排其他程序員比如java程序員將前端采集好的數據放到數據庫,本系統直接從數據庫采集即可。數據庫采集模式可以作為通用的系統使用,更適合多人多系統協作。
  • 智能跳過超時的設備,加快對在線設備的采集速度,當設備數量很多的時候尤其有用。
  • 對智能跳過的超時的設備,在設定的重連時間自動采集一次,以便探測設備是否又重新上線。
  • 每個探測器可控是否啟用,不啟用則不會采集,也不會在界面顯示,相當于運行階段臨時關閉。
  • 探測器可設置緩沖值和報警延時時間,在該值附近波動產生的報警,不計入報警,只有持續處于報警值且超過報警延時時間才算真正報警,這樣可以規避很多波動導致的誤報。
  • 探測器可設置存儲周期,按照設定的時間來存儲一條運行記錄,可以按照重要程度對重要性高的設定存儲周期短一些,不重要的設定大一些,這樣可以節省不少的存儲空間,也保證了重要的數據及時存儲。
  • 探測器可設置清零值,在一些高精度高靈敏的設備可能出廠的時候默認值未必是0,需要設定清零值來表示初始值。
  • 探測器可設置小數點,用于計算后的真實數據控制小數點點位顯示,相當于除以10、除以100、除以1000,這樣大部分的探測器數據直接通過小數點位設置控制真實換算后的值,極個別的需要特殊轉換的可以在通信協議中約定。
  • 探測器報警的類型支持多種,有些設備是高于某個值高報,低于某個值低報,而有些設備是在最小值最大值范圍內是高報,低于最小值低報,高于最大值正常。這樣可以分情況處理,涵蓋各種報警類型。
  • 原創數據導入、導出、打印機制,跨平臺不依賴任何組件,瞬間導出數據。
  • 導出到excel的記錄支持所有excel、wps等表格文件版本,不依賴excel等軟件。
  • 高報顏色、低報顏色、正常顏色、默認值顏色等,都可以自由設置。
  • 支持云端數據同步,將本地采集到的數據實時同步到云端。
  • 支持網絡轉發和網絡接收,網絡接收開啟后,軟件從udp接收數據進行解析。網絡轉發支持多個目標IP,這樣就實現了本地采集的軟件,自由將數據轉到客戶端,隨時查看采集到的數據。
  • 自動記住用戶最后停留的界面以及其他配置信息,重啟后自動應用。
  • 報警自動切換到對應的地圖,探測器按鈕閃爍,表格數據對應顏色顯示。
  • 雙擊探測器圖標,彈出對應探測器詳細信息,可以根據需要定制回控操作。
  • 數據庫支持多種,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金倉等。
  • 本地設備采集到的數據實時上傳到云端,以便手機APP或者web等其他方式提取。
  • 自帶設備模擬工具,支持不同型號的多個設備數據模擬,同時還帶數據庫數據模擬,以便在沒有設備的時候測試數據。
  • 標準modbus協議,各種控制器類型、探測器類型、種類、符號等全部自定義,非常靈活和強大,通信協議示例數據非常完整,通用各種modbus協議系統,適用于各種應用場景接入。
  • 同時集成了串口通信、網絡通信、數據庫通信、數據導入導出打印、通信協議解析、界面UI、全局換膚等眾多組件和知識點,非常適合新手入門和進階。
  • 支持xp、win7、win10、、win11、linux、mac、各種國產系統(UOS、中標麒麟、銀河麒麟等)、嵌入式linux等系統。
  • 注釋完整,項目結構清晰,超級詳細完整的使用開發手冊,精確到每個代碼文件的功能說明,不斷持續迭代版本。
  • 三、體驗地址

  • 國內站點:https://gitee.com/feiyangqingyun
  • 國際站點:https://github.com/feiyangqingyun
  • 個人主頁:https://blog.csdn.net/feiyangqingyun
  • 知乎主頁:https://www.zhihu.com/people/feiyangqingyun
  • 產品主頁:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  • 在線文檔:https://feiyangqingyun.gitee.io/qwidgetdemo/iotsystem/
  • 體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 文件名:bin_iotsystem.zip。
  • 文章導航:https://qtchina.blog.csdn.net/article/details/121330922
  • 四、效果圖



    五、相關代碼

    #include "userhelper.h" #include "quihelper.h"QString UserHelper::CurrentUserName = "admin"; QString UserHelper::CurrentUserPwd = "admin"; QString UserHelper::CurrentUserType = QString::fromUtf8("管理員"); QList<bool> UserHelper::UserPermission = QList<bool>() << true << true << true << true << true << true << true; QStringList UserHelper::PermissionName = QStringList() << QString::fromUtf8("系統設置|刪除記錄|模塊A|模塊B|模塊C|模塊D|模塊E").split("|");int UserHelper::UserInfo_Count = 0; QList<QString> UserHelper::UserInfo_UserName = QList<QString>(); QList<QString> UserHelper::UserInfo_UserPwd = QList<QString>(); QList<QString> UserHelper::UserInfo_UserType = QList<QString>(); QList<QString> UserHelper::UserInfo_Permission1 = QList<QString>(); QList<QString> UserHelper::UserInfo_Permission2 = QList<QString>(); QList<QString> UserHelper::UserInfo_Permission3 = QList<QString>(); QList<QString> UserHelper::UserInfo_Permission4 = QList<QString>(); QList<QString> UserHelper::UserInfo_Permission5 = QList<QString>(); QList<QString> UserHelper::UserInfo_Permission6 = QList<QString>(); QList<QString> UserHelper::UserInfo_Permission7 = QList<QString>();void UserHelper::loadUserInfo() {UserHelper::UserInfo_Count = 0;UserHelper::UserInfo_UserName.clear();UserHelper::UserInfo_UserPwd.clear();UserHelper::UserInfo_UserType.clear();UserHelper::UserInfo_Permission1.clear();UserHelper::UserInfo_Permission2.clear();UserHelper::UserInfo_Permission3.clear();UserHelper::UserInfo_Permission4.clear();UserHelper::UserInfo_Permission5.clear();UserHelper::UserInfo_Permission6.clear();UserHelper::UserInfo_Permission7.clear();QString column = "Permission1,Permission2,Permission3,Permission4,Permission5,Permission6,Permission7";QString sql = QString("select UserName,UserPwd,UserType,%1 from UserInfo").arg(column);QSqlQuery query;if (!query.exec(sql)) {qDebug() << TIMEMS << query.lastError().text() << sql;return;}while (query.next()) {QString userName = query.value(0).toString();QString userPwd = query.value(1).toString();QString userType = query.value(2).toString();QString permission1 = query.value(3).toString();QString permission2 = query.value(4).toString();QString permission3 = query.value(5).toString();QString permission4 = query.value(6).toString();QString permission5 = query.value(7).toString();QString permission6 = query.value(8).toString();QString permission7 = query.value(9).toString();UserHelper::UserInfo_Count++;UserHelper::UserInfo_UserName << userName;UserHelper::UserInfo_UserPwd << userPwd;UserHelper::UserInfo_UserType << userType;UserHelper::UserInfo_Permission1 << permission1;UserHelper::UserInfo_Permission2 << permission2;UserHelper::UserInfo_Permission3 << permission3;UserHelper::UserInfo_Permission4 << permission4;UserHelper::UserInfo_Permission5 << permission5;UserHelper::UserInfo_Permission6 << permission6;UserHelper::UserInfo_Permission7 << permission7;} }void UserHelper::clearUserInfo() {QString sql = "delete from UserInfo where UserName!='admin'";DbHelper::execSql(sql); }void UserHelper::updateUserInfo(const QString &userName, const QString &userPwd) {QString sql = QString("update UserInfo set UserPwd='%1' where UserName='%2'").arg(userPwd).arg(userName);DbHelper::execSql(sql); }void UserHelper::getUserInfo() {UserHelper::getUserInfo(UserHelper::CurrentUserName, UserHelper::CurrentUserPwd, UserHelper::CurrentUserType, UserHelper::UserPermission); }void UserHelper::getUserInfo(const QString &userName, QString &userPwd, QString &userType, QList<bool> &permission) {QString column = "Permission1,Permission2,Permission3,Permission4,Permission5,Permission6,Permission7";QString sql = QString("select UserPwd,UserType,%1 from UserInfo where UserName='%2'").arg(column).arg(userName);QSqlQuery query;if (!query.exec(sql)) {qDebug() << TIMEMS << query.lastError().text() << sql;return;}if (query.next()) {userPwd = query.value(0).toString();userType = query.value(1).toString();for (int i = 0; i < 7; ++i) {permission[i] = (query.value(i + 2).toString() == "啟用");}}//qDebug() << TIMEMS << UserHelper::CurrentUserName << UserHelper::CurrentUserPwd << UserHelper::CurrentUserType << UserHelper::UserPermission; }bool UserHelper::checkPermission(const QString &text) {//從權限模塊名稱找到當前模塊是否需要授權//可能對應按鈕的文本有空格要去掉再比較 比如權限文本設定的是 用戶管理 而實際按鈕是 用 戶 管 理QString flag = text; #if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))flag.remove(QRegularExpression("\\s")); #elseflag.remove(QRegExp("\\s")); #endifint index = UserHelper::PermissionName.indexOf(flag);if (index >= 0) {if (!UserHelper::UserPermission.at(index)) {QUIHelper::showMessageBoxError(QString("當前用戶沒有 [%1] 權限!").arg(text), 3);return false;}}return true; }

    總結

    以上是生活随笔為你收集整理的Qt编写物联网管理平台31-用户权限管理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。