




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第1章緒論1.1研究背景隨著物聯(lián)網(wǎng)技術(shù)的迅速發(fā)展和廣泛應(yīng)用,各類設(shè)備的連接與管理方式發(fā)生了深刻變革。從傳統(tǒng)的單一控制到如今的智能化、網(wǎng)絡(luò)化運維,設(shè)備信息的獲取于交互方式愈發(fā)豐富多樣。而基于物聯(lián)網(wǎng)的設(shè)備運維管理系統(tǒng)正以其精準(zhǔn)、高效的特性,成為現(xiàn)代工業(yè)、家居等領(lǐng)域不可或缺的重要工具。據(jù)統(tǒng)計,采用物聯(lián)網(wǎng)技術(shù)的設(shè)備運維管理系統(tǒng)已經(jīng)廣泛應(yīng)用于電力、交通、醫(yī)療等多個領(lǐng)域,為提升行業(yè)的智能化水平、推動產(chǎn)業(yè)升級做出了重要貢獻(xiàn)。因此,深入研究基于物聯(lián)網(wǎng)的設(shè)備運維管理系統(tǒng)的設(shè)計與實現(xiàn),不僅具有重要的理論價值,更有著廣闊的應(yīng)用前景和深遠(yuǎn)的社會意義。 1.2研究意義設(shè)備運維對企業(yè)的穩(wěn)定生產(chǎn)和長期發(fā)展具有重要意義,但是傳統(tǒng)的設(shè)備運維方式,如人工巡檢,效率低下且容易出錯。物聯(lián)網(wǎng)設(shè)備運維管理系統(tǒng)具備實時、自動監(jiān)控設(shè)備運行狀態(tài)的能力,它可以通過對數(shù)據(jù)的深度分析,預(yù)測潛在故障,并進(jìn)行遠(yuǎn)程修復(fù)。這大大提高了設(shè)備的運行效率和可靠性。通過這些數(shù)據(jù)分析,企業(yè)可以更加精確地了解設(shè)備的運行狀態(tài)和需求,從而優(yōu)化資源配置,避免資源的浪費。并且基于物聯(lián)網(wǎng)的設(shè)備運維管理系統(tǒng)是智能化發(fā)展的重要組成部分,隨著物聯(lián)網(wǎng)技術(shù)的引入,企業(yè)的設(shè)備運維管理可以變得更加信息化、智能化。通過引入更先進(jìn)的技術(shù),運維人員可以更加高效地完成運維及管理任務(wù),減少了傳統(tǒng)運維方式下可能出現(xiàn)的錯誤。其次,隨著設(shè)備運維的智能化和安全性的加強,企業(yè)在運維方面的成本也會降低。本課題的設(shè)計與實現(xiàn),旨在通過物聯(lián)網(wǎng)技術(shù)和工具,實現(xiàn)企業(yè)設(shè)備運維管理的優(yōu)化,為企業(yè)設(shè)備運維管理的信息化、智能化創(chuàng)造價值。1.3國內(nèi)外研究現(xiàn)狀設(shè)備運維管理是指設(shè)備運行的維護(hù)、維修等管理工作。在正常生產(chǎn)中,設(shè)備運行維護(hù)不到位或者維修把控不及時都會對設(shè)備造成一定影響,進(jìn)而產(chǎn)生安全隱患或者故障維修,只有做好運維管理,及時補償設(shè)備磨損,恢復(fù)設(shè)備性能,才能確保設(shè)備始終處于完好狀態(tài),提升設(shè)備利用率和安全性,保證生產(chǎn)持續(xù)進(jìn)行。因此,設(shè)備運維管理是企業(yè)長久發(fā)展的關(guān)鍵REF_Ref15245\r\h[1]。設(shè)備運維作為企業(yè)十分重要的環(huán)節(jié),其智能化、數(shù)字化得到了國內(nèi)外的高度重視。企業(yè)運行與信息化技術(shù)的應(yīng)用密不可分,所以需要不斷完善運維管理系統(tǒng),提升服務(wù)質(zhì)量,保障企業(yè)的正常生產(chǎn)經(jīng)營[2]。在國內(nèi),基于物聯(lián)網(wǎng)的設(shè)備運維管理得到了廣泛關(guān)注和應(yīng)用。許多企業(yè)開始利用物聯(lián)網(wǎng)技術(shù)實現(xiàn)設(shè)備的遠(yuǎn)程監(jiān)控和管理,以提高設(shè)備的運行效率和降低運維成本。例如,在智能制造領(lǐng)域,物聯(lián)網(wǎng)技術(shù)被廣泛應(yīng)用于生產(chǎn)線的監(jiān)控和故障診斷,實現(xiàn)了設(shè)備的預(yù)測性維護(hù)和遠(yuǎn)程故障排除。此外,在能源、交通、醫(yī)療等領(lǐng)域,基于物聯(lián)網(wǎng)的設(shè)備運維管理也得到了廣泛應(yīng)用。目前,理論研究和技術(shù)方面也有大量成果。國內(nèi)運維系統(tǒng)軟件起步較晚,但隨著信息技術(shù)的飛速發(fā)展,設(shè)備運維軟件設(shè)計在理論研究和技術(shù)方面也有大量成果。北京化工大學(xué)的母俐麗等,以幫助企業(yè)實現(xiàn)低成本且高效率的運維為目標(biāo),結(jié)合其運維特點為中小型企業(yè)設(shè)計了適用的運維系統(tǒng)架構(gòu)[3]。并且對大多數(shù)企業(yè)來言,以下問題比較突出:缺少一套設(shè)備維修記錄實時自動生成、整理和統(tǒng)計的平臺。設(shè)備維修記錄的生成來自于各分廠設(shè)備員人工統(tǒng)計,缺乏實時性、客觀性、準(zhǔn)確性和可靠性,導(dǎo)致該數(shù)據(jù)無法進(jìn)行有效統(tǒng)計和分析。而預(yù)防預(yù)知性維修缺少基礎(chǔ)數(shù)據(jù)會導(dǎo)致重復(fù)性故障發(fā)生,為公司帶來經(jīng)濟損失。缺少一套提醒設(shè)備操作者定期點檢的工具以及點檢完成情況反饋給管理人員的平臺。操作者填寫點檢記錄,管理人員隨機或定期對點檢記錄進(jìn)行檢查。多次出現(xiàn)操作者未按時點檢、集中填寫點檢記錄應(yīng)付檢查的情況,阻礙了設(shè)備故障隱患的及時發(fā)現(xiàn),導(dǎo)致設(shè)備故障率增高、有效利用率下降[4]。而運維管理工作制度不完善是企業(yè)內(nèi)部該項工作開展受限的另一重要因素。設(shè)備運維管理機制的落后,沒有就企業(yè)內(nèi)部設(shè)備運維管理工作形成一套科學(xué)嚴(yán)謹(jǐn)?shù)囊?guī)章制度,這使得實際工作開展較雜亂,后期追責(zé)困難,無法提升企業(yè)內(nèi)部設(shè)備運維管理工作效率[5]。1.4本文的結(jié)構(gòu)框架本文首先對物聯(lián)網(wǎng)的設(shè)備運維現(xiàn)狀進(jìn)行了分析,對物聯(lián)網(wǎng)的設(shè)備運維系統(tǒng)做了需求分析,在此基礎(chǔ)上完成了基于物聯(lián)網(wǎng)的設(shè)備運維系統(tǒng)的設(shè)計與實現(xiàn)。本文總共5章,具體的組織架構(gòu)如下所示:第一章:緒論。本章介紹了本課題的研究背景,明確了研究目的,描述了國內(nèi)外研究現(xiàn)狀,確定了本文的結(jié)構(gòu)框架。第二章:相關(guān)技術(shù)概論。本章介紹了系統(tǒng)使用的大部分技術(shù),如Vue、SpringBoot、MySQL、Modbus等。第三章:系統(tǒng)分析。本章對系統(tǒng)開發(fā)的可行性進(jìn)行了分析,并深入探討了系統(tǒng)各功能模塊的具體需求,以確保系統(tǒng)的設(shè)計與實現(xiàn)能夠精準(zhǔn)滿足實際需求。第四章:系統(tǒng)實現(xiàn)與測試。本章首先詳細(xì)闡述了系統(tǒng)各功能模塊的代碼實現(xiàn)細(xì)節(jié),隨后進(jìn)行了全方位的功能測試,以確保其正常運行和達(dá)到預(yù)期效果。第五章:總結(jié)與展望。本章總結(jié)了本課題的研究過程,分析了本系統(tǒng)的不足,并對系統(tǒng)的改進(jìn)做了一定的展望。1.5本章小結(jié)本章首先介紹了本系統(tǒng)的研究背景,接著闡述了研究意義,然后闡述了國內(nèi)外的研究現(xiàn)狀,總結(jié)出了目前設(shè)備管理的優(yōu)缺點,最后介紹本文的框架及大概內(nèi)容。
第2章相關(guān)技術(shù)2.1框架介紹1、Vue簡介Vue.js是一款前端JavaScript框架,能幫助開發(fā)者快速關(guān)鍵交互的應(yīng)用程序,且其是輕量級易學(xué)易用的框架,并且提供了許多高質(zhì)量的插件和庫,方便開發(fā)人員的開發(fā)REF_Ref12895\r\h[6]。Vue.js的核心庫專注于視圖層,使其易于與其他庫或現(xiàn)有項目集成。2、SpringBoot簡介SpringBoot是由Pivotal團隊提供的全新框架,旨在簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這個框架使用了特定的方式來進(jìn)行配置,使開發(fā)人員不再需要定義樣板化的配置。SpringBoot致力于成為快速應(yīng)用開發(fā)領(lǐng)域的領(lǐng)導(dǎo)者。3、SpringCloud簡介SpringCloud是用于創(chuàng)建分布式系統(tǒng)的開發(fā)框架,它建立在SpringBoot的基礎(chǔ)上,提供了一組工具和組件,以簡化分布式系統(tǒng)中的開發(fā)、部署和管理流程。它可以整合成熟的服務(wù)框架,為開發(fā)者提供一個便捷、易于部署和維護(hù)的分布式系統(tǒng)開發(fā)解決方案。4、MyBatis簡介MyBatis作為一款卓越的持久層框架,其特色在于支持自定義SQL、存儲過程以及高級映射功能。通過MyBatis,開發(fā)者可以極大地減少JDBC代碼的編寫,并避免手動設(shè)置參數(shù)及獲取結(jié)果集的繁瑣操作。5、若依框架簡介若依(Ruoyi)框架是一款基于SpringBoot2.5.5、SpringCloud2020.0、OAuth2與JWT鑒權(quán)等核心技術(shù),同時也支持SpringSecurity、ApacheShiro等多種安全框架,以及Mybatis、JPA等流行持久化框架,提供了許多常用的功能模塊,包括系統(tǒng)管理、監(jiān)控管理、任務(wù)調(diào)度、代碼生成、文件上傳、高德地圖等功能的快速開發(fā)平臺REF_Ref19562\r\h[7]。 2.2MySQL數(shù)據(jù)庫簡介MySQL是當(dāng)下最好且最流行的關(guān)系數(shù)據(jù)庫管理系統(tǒng)之一REF_Ref10955\r\h[8],尤其在WEB應(yīng)用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。2.3Modbus通信協(xié)議簡介MODBUS通信協(xié)議是由美國MODICON公司推出的基于RS485總線的通訊協(xié)議REF_Ref6184\r\h[9]。該協(xié)議專為可編程邏輯控制器(PLC)間通信而設(shè)計,并在工業(yè)領(lǐng)域確立了其作為通信協(xié)議的地位。它廣泛應(yīng)用于各種工業(yè)電子設(shè)備之間的連接,形成高效、穩(wěn)定的通信網(wǎng)絡(luò)。在Modbus協(xié)議中,主從結(jié)構(gòu)是核心機制,即主設(shè)備負(fù)責(zé)發(fā)起請求,而從設(shè)備則負(fù)責(zé)接收、分析并響應(yīng)這些請求。若通信過程中出現(xiàn)問題,從設(shè)備會通過返回異常功能碼的方式,及時通知主設(shè)備。這種設(shè)計不僅確保了通信的可靠性,也降低了通信過程中的錯誤率。2.4MQTT協(xié)議簡介MQTT協(xié)議是ISO標(biāo)準(zhǔn)(ISO/IECPRF20922)下基于主題進(jìn)行訂閱和發(fā)布,為硬件性能低下的遠(yuǎn)程設(shè)備以及相對糟糕的網(wǎng)絡(luò)環(huán)境而設(shè)計的消息協(xié)議REF_Ref23441\r\h[10]。該協(xié)議使用LastWill和Testament特性通知有關(guān)客戶端異常中斷,具有提供一對多消息發(fā)布,解除應(yīng)用程序耦合,TCP/IP提供網(wǎng)絡(luò)連接,對負(fù)載內(nèi)容屏蔽消息傳輸?shù)忍匦訰EF_Ref23676\r\h[11]。其主題是應(yīng)用信息上的附加標(biāo)簽,需要發(fā)揮其作用構(gòu)建發(fā)布和訂閱信息主體間的信息傳輸路徑REF_Ref25910\r\h[12]。2.5ZigBee技術(shù)Zigbee技術(shù)是一種低功耗的個域網(wǎng)協(xié)議,它是基于標(biāo)準(zhǔn)的遠(yuǎn)程監(jiān)控、控制和傳感器網(wǎng)絡(luò)技術(shù),其具有鮮明的優(yōu)點,如技術(shù)難度低、功耗低、時延短、安全性高及成本低等優(yōu)點,一般將Zigbee芯片及外圍電路稱為Zigbee模塊REF_Ref27438\r\h[14]。ZigBee技術(shù)的通信范圍小和傳輸速率低的特點決定了其適應(yīng)低復(fù)雜數(shù)據(jù)傳輸?shù)男阅芴攸cREF_Ref27935\r\h[15]。2.6本章小結(jié)本章詳細(xì)介紹了系統(tǒng)開發(fā)中用到的關(guān)鍵技術(shù)、結(jié)構(gòu)技術(shù)的發(fā)展,為系統(tǒng)的開發(fā)提供了充分的理論知識。
第3章系統(tǒng)分析在本系統(tǒng)開發(fā)前,已經(jīng)對基于物聯(lián)網(wǎng)的設(shè)備運維進(jìn)行了一些需求調(diào)研、系統(tǒng)分析以及相關(guān)技術(shù)的選型,為后續(xù)系統(tǒng)的開發(fā)提供了支持。3.1需求分析3.1.1功能性需求本系統(tǒng)是一個基于PC端的WEB系統(tǒng),用戶類型主要劃分為兩類:管理員、用戶。系統(tǒng)的功能需求包括物聯(lián)網(wǎng)設(shè)備運維系統(tǒng)的搭建,對設(shè)備的管理,對設(shè)備的狀態(tài)進(jìn)行監(jiān)測。物聯(lián)網(wǎng)設(shè)備運維系統(tǒng)的搭建物聯(lián)網(wǎng)設(shè)備運維系統(tǒng)的搭建主要包括對用戶設(shè)備的查看、添加、修改信息以及刪除設(shè)備,查看設(shè)備告警,對設(shè)備分組的查看、添加、修改信息以及刪除設(shè)備分類,查看系統(tǒng)的公告。管理員除此之外還能處理設(shè)備告警、刪除設(shè)備告警,發(fā)布公告以及更改公告。設(shè)備管理設(shè)備管理主要是對設(shè)備的信息進(jìn)行更新和刪除,也可以新增設(shè)備并把它們更新到數(shù)據(jù)庫中,并且可以對設(shè)備的狀態(tài)進(jìn)行監(jiān)測。設(shè)備監(jiān)測設(shè)備監(jiān)測主要是對設(shè)備的狀態(tài)進(jìn)行監(jiān)測并生成設(shè)備日志,并且可以在地圖上查看設(shè)備的位置。系統(tǒng)的用例圖如圖3-1所示。圖3-1系統(tǒng)用例圖3.2.2非功能性需求(1)響應(yīng)時間需求:系統(tǒng)應(yīng)具備快速的響應(yīng)時間,確保用戶在進(jìn)行設(shè)備監(jiān)控、故障診斷、任務(wù)調(diào)度等操作時能夠獲得及時的反饋。(2)系統(tǒng)穩(wěn)定性需求:系統(tǒng)應(yīng)具備高穩(wěn)定性,能夠長時間連續(xù)運行而不出現(xiàn)故障或性能下降的情況。對于可能出現(xiàn)的異常情況,系統(tǒng)應(yīng)具備自動恢復(fù)和容錯機制,確保服務(wù)的持續(xù)性。(3)可維護(hù)性需求:系統(tǒng)應(yīng)詳細(xì)記錄操作日志和審計信息,包括用戶登錄、設(shè)備接入、數(shù)據(jù)傳輸?shù)汝P(guān)鍵操作。這些信息對于故障排查、安全審計和性能優(yōu)化具有重要意義。(4)安全性需求:系統(tǒng)應(yīng)具備完善的訪問控制和權(quán)限管理機制,對不同用戶設(shè)置不同的訪問權(quán)限和操作限制。通過身份驗證和授權(quán)機制確保只有合法用戶才能訪問系統(tǒng)資源和執(zhí)行敏感操作。(5)可擴展性需求:隨著物聯(lián)網(wǎng)設(shè)備數(shù)量的日益增多,系統(tǒng)產(chǎn)生的數(shù)據(jù)量也在持續(xù)攀升。因此,系統(tǒng)應(yīng)具備可擴展的數(shù)據(jù)存儲能力,支持海量數(shù)據(jù)的存儲和高效檢索。3.2系統(tǒng)總體設(shè)計3.2.1系統(tǒng)架構(gòu)本系統(tǒng)采用的是前后端分離架構(gòu),前端使用了Vue+Elementui進(jìn)行搭建,而后端則采用SpringBoot+Mybatis與數(shù)據(jù)庫進(jìn)行交互。后端采用的Controller層、Service層、Dao層、domain層進(jìn)行邏輯處理?;谖锫?lián)網(wǎng)的設(shè)備運維系統(tǒng)的系統(tǒng)架構(gòu)圖如圖3-2所示。圖3-2系統(tǒng)架構(gòu)圖(1)感知層感知層主要由傳感器和觸發(fā)器構(gòu)成,負(fù)責(zé)收集現(xiàn)場數(shù)據(jù)和執(zhí)行控制命令。(2)網(wǎng)絡(luò)層網(wǎng)絡(luò)層負(fù)責(zé)網(wǎng)絡(luò)連接及設(shè)備間的數(shù)據(jù)傳輸與通信。(3)展示層展示層主要采用了Vue.js框架,這是一個用于構(gòu)建用戶界面的JavaScript框架,使得用戶能夠更加直觀地操作系統(tǒng)。(4)業(yè)務(wù)層業(yè)務(wù)層包含了各種管理模塊,如設(shè)備管理、日志管理、用戶管理等,這些模塊負(fù)責(zé)共同處理系統(tǒng)的業(yè)務(wù)邏輯。(5)數(shù)據(jù)層數(shù)據(jù)層,Mybatis提供了數(shù)據(jù)訪問服務(wù),它可以定制SQL、映射關(guān)系以及存儲過程,是的數(shù)據(jù)庫更加靈活高效。(6)持久層在持久層,運用了MySQL數(shù)據(jù)庫,用于存儲系統(tǒng)的結(jié)構(gòu)化數(shù)據(jù)。而Redis則提供了一種非關(guān)系型的數(shù)據(jù)存儲方式,以及作為系統(tǒng)的緩存服務(wù)。(7)運行環(huán)境運行環(huán)境本系統(tǒng)基于java8的環(huán)境運行。其中設(shè)備管理作為本系統(tǒng)的核心功能之一,起到了對設(shè)備的管理、監(jiān)控、預(yù)警等功能。首先利用物聯(lián)網(wǎng)技術(shù)采集到設(shè)備的運行狀態(tài)、收集到的信息參數(shù),對這些數(shù)據(jù)進(jìn)行處理,設(shè)置閾值從而集市發(fā)現(xiàn)異常情況。根據(jù)預(yù)警信息,用戶便能及時維護(hù)設(shè)備。物聯(lián)網(wǎng)產(chǎn)業(yè)由應(yīng)用、云端、網(wǎng)絡(luò)、邊緣、終端五個部分組成。應(yīng)用為AIoT產(chǎn)業(yè)應(yīng)用行業(yè)。云端指物聯(lián)網(wǎng)相關(guān)的云化能力平臺,主要由云端物聯(lián)網(wǎng)平臺承載相關(guān)云服務(wù)包括連接、管理、數(shù)據(jù)、AI、安全、區(qū)塊鏈等等。網(wǎng)絡(luò)則是連接網(wǎng)絡(luò)及相關(guān)產(chǎn)品和服務(wù)。邊緣泛指中心節(jié)點之外的位置。邊緣計算指的是將計算及相關(guān)能力從中心處理節(jié)點下放至邊緣節(jié)點后形成的,靠近終端的計算能力。終端則是物聯(lián)網(wǎng)終端,包括底層的芯片、模組、存儲設(shè)備、感知設(shè)備、AI芯片、操作系統(tǒng)等。物聯(lián)網(wǎng)的技術(shù)架構(gòu)圖如圖3-2所示。圖3-2技術(shù)架構(gòu)圖本系統(tǒng)的設(shè)備接入分為感知層和接入層兩個部分,在感知層包括Modbus設(shè)備和直連設(shè)備,負(fù)責(zé)數(shù)據(jù)采集。通過MQTT協(xié)議傳輸?shù)浇尤雽拥脑凭W(wǎng)關(guān)。而網(wǎng)關(guān)支持TCP、HTTP等多種協(xié)議,將數(shù)據(jù)轉(zhuǎn)發(fā)給用戶。基于物聯(lián)網(wǎng)的設(shè)備運維系統(tǒng)的設(shè)備接入圖如圖3-4。圖3-4設(shè)備接入圖3.2.2系統(tǒng)功能模塊劃分本系統(tǒng)主要分為設(shè)備管理和系統(tǒng)管理兩個模塊,其中設(shè)備管理中包含設(shè)備管理、設(shè)備分組、設(shè)備告警三個子模塊,可以對設(shè)備進(jìn)行管理和監(jiān)測;而系統(tǒng)管理模塊包括了用戶管理、日志管理和公告通知管理三個子模塊。系統(tǒng)的功能模塊圖如圖3-5所示。圖3-5系統(tǒng)功能模塊圖3.2.3數(shù)據(jù)庫設(shè)計本系統(tǒng)采用的是MySQL數(shù)據(jù)庫和InfluxDB數(shù)據(jù)庫。當(dāng)接受到物聯(lián)設(shè)備采集的信息,如溫度、壓力、震感等,這些原始數(shù)據(jù)通常包含異常值、冗余信息等。這些信息首先會儲存在時序數(shù)據(jù)庫InfluxDB中,能夠高效地存儲和查詢大量、高頻率的數(shù)據(jù)。在被長期保存之前,需要對數(shù)據(jù)進(jìn)行清洗,以消去異常值和重復(fù)數(shù)據(jù)。經(jīng)過了數(shù)據(jù)清洗,最后在MySQL進(jìn)行長期儲存。主要儲存的信息有用戶信息、設(shè)備信息、日志信息、通知公告信息等。首先,通過E-R圖表示出實體及其之間的關(guān)系,為數(shù)據(jù)庫設(shè)計提供了基礎(chǔ)。根據(jù)本系統(tǒng)的數(shù)據(jù)模型和數(shù)據(jù)庫設(shè)計原則,確定了基本的數(shù)據(jù)庫結(jié)構(gòu),包括數(shù)據(jù)表、字段列表等。對于時序數(shù)據(jù),由于其具有時間戳唯一性、數(shù)據(jù)連續(xù)性、數(shù)據(jù)量大、高頻率更新等特點,對其進(jìn)行查詢優(yōu)化,將其儲存在InfluxDB數(shù)據(jù)庫中。在設(shè)計數(shù)據(jù)庫表時,選擇了合適的字段,并考慮了表的靈活性,以便用戶可以更便捷高效地進(jìn)行查詢。本系統(tǒng)的E-R圖如圖3-6所示。圖3-6系統(tǒng)E-R圖在數(shù)據(jù)庫設(shè)計中,每一張表都分配了一個主鍵,它是確保數(shù)據(jù)庫設(shè)計的完整性和提高數(shù)據(jù)庫的查詢效率的關(guān)鍵因素。結(jié)合以上提供的E-R圖,從而設(shè)計出了如下數(shù)據(jù)庫表。(1)用戶信息表表3-1用戶信息表sys_user字段名稱數(shù)據(jù)類型長度是否為空字段含義user_idbigint20否用戶IDdept_idbigint20是部門IDuser_namevarchar30否用戶賬號nick_namevarchar30否用戶昵稱user_typevarchar2是用戶類別表3-1(續(xù))用戶信息表sys_useremailvarchar50是用戶郵箱phonenumbervarchar11是用戶電話sexchar1是用戶性別avatarvarchar100是頭像地址passwordvarchar100是密碼create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時間update_byvarchar64是更新者update_timedatetime0是更新時間(2)設(shè)備信息表表3-2設(shè)備信息表iot_device字段名稱數(shù)據(jù)類型長度是否為空字段含義device_idbigint20否設(shè)備IDdevice_namevarchar64否設(shè)備名稱product_idbigint20否產(chǎn)品IDproduct_namevarchar64否產(chǎn)品名稱user_idbigint20否用戶IDuser_namevarchar30否用戶昵稱serial_numbervarchar64否設(shè)備編號statustinyint1否設(shè)備狀態(tài)network_addressvarchar255是設(shè)備所在地址network_ipvarchar32是設(shè)備入網(wǎng)IPcreate_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時間update_byvarchar64是更新者update_timedatetime0是更新時間設(shè)備告警表表3-3設(shè)備告警表iot_alert字段名稱數(shù)據(jù)類型長度是否為空字段含義alert_idbigint20否告警IDalert_namevarchar64否告警名稱alert_leveltinyint11否告警級別product_idbigint20否產(chǎn)品IDproduct_namevarchar64否產(chǎn)品名稱statustinyint1是告警狀態(tài)create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時間update_byvarchar64是更新者表3-3(續(xù))設(shè)備告警表iot_alertupdate_timedatetime0是更新時間產(chǎn)品信息表表3-4產(chǎn)品信息表iot_product字段名稱數(shù)據(jù)類型長度是否為空字段含義product_idbigint20否產(chǎn)品IDproduct_namevarchar64否產(chǎn)品名稱device_typetinyint1是設(shè)備類型statustinyint1是狀態(tài)category_idbigint20否產(chǎn)品分類IDcategory_namevarchar64否產(chǎn)品分類名稱create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時間update_byvarchar64是更新者update_timedatetime0是更新時間通知公告表表3-5通知公告表sys_notice字段名稱數(shù)據(jù)類型長度是否為空字段含義notice_idint4否公告IDnotice_titlevarchar50否公告名稱notice_typechar1否公告類型notice_contentlongblob0是公告內(nèi)容statuschar1是公告狀態(tài)create_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時間update_byvarchar64是更新者update_timedatetime0是更新時間設(shè)備告警日志表表3-6設(shè)備告警日志表iot_alert_log字段名稱數(shù)據(jù)類型長度是否為空字段含義alert_log_idbigint20否告警IDalert_namevarchar64否告警名稱alert_leveltinyint11否告警級別statustinyint11否處理狀態(tài)device_idbigint20是設(shè)備IDtenant_idbigint20否租戶IDtenant_namevarchar30否租戶名稱device_namevarchar64是設(shè)備名稱表3-5(續(xù))設(shè)備告警日志表iot_alert_logcreate_byvarchar64是創(chuàng)建者create_timedatetime0是創(chuàng)建時間update_byvarchar64是更新者update_timedatetime0是更新時間3.3系統(tǒng)模塊設(shè)計3.3.1設(shè)備管理模塊設(shè)計本小節(jié)主要論述設(shè)備管理模塊的設(shè)計。本模塊主要功能有對設(shè)備及其分組的管理、對設(shè)備的監(jiān)測、對設(shè)備的告警等功能。該模塊的實現(xiàn)首先是由DeviceController和ProductController接受前端的請求,然后調(diào)用Service層的相關(guān)處理方法。DeviceServiceImpl和ProductServiceImpl是接口的是具體實現(xiàn)類,負(fù)責(zé)了相關(guān)功能的邏輯實現(xiàn)。DeviceServiceImpl負(fù)責(zé)設(shè)備的管理功能,ProductServiceImpl負(fù)責(zé)產(chǎn)品的管理功能。首先對需要物聯(lián)監(jiān)測的設(shè)備進(jìn)行物模型的定義,在ThingsModelController中編寫了相應(yīng)接口接受前端的請求,然后調(diào)用ThingsModelService來實現(xiàn)對物模型的相關(guān)處理。比如需要監(jiān)測設(shè)備的溫度屬性,需要監(jiān)測設(shè)備的溫度變化,便調(diào)用接口實現(xiàn)對溫度屬性的定義。其次是對設(shè)備的監(jiān)測,首先定義了物模型和設(shè)備對象,物模型能夠清晰的描述設(shè)備的功能和特性,包括了可以執(zhí)行的操作、可以提供的數(shù)據(jù)等。通過物模型,不同的設(shè)備能力都可以進(jìn)行統(tǒng)一的管理,這有利于設(shè)備之間的相互交互,為設(shè)備運維管理和控制提供便利。然后利用傳感器實時采集數(shù)據(jù),如溫度、濕度、壓力等,接著對采集到的數(shù)據(jù)從其他工業(yè)協(xié)議統(tǒng)一轉(zhuǎn)化為modbus協(xié)議儲存在數(shù)據(jù)庫中。根據(jù)定義的物模型,如溫度、震感、濕度等,用戶可以設(shè)定這些監(jiān)測指標(biāo)的預(yù)警閾值,將處理好的數(shù)據(jù)與閾值進(jìn)行對比,并設(shè)計多級預(yù)警,如警告、嚴(yán)重警告等。當(dāng)監(jiān)測指標(biāo)達(dá)到閾值以上,便會觸發(fā)預(yù)警機制,然后生成預(yù)警信息,包括設(shè)備信息、預(yù)警信息、預(yù)警時間等。根據(jù)預(yù)警信息和設(shè)備狀態(tài),用戶可以采取相應(yīng)的處理辦法。當(dāng)數(shù)值恢復(fù)到閾值以下,系統(tǒng)便會發(fā)出告警恢復(fù)的信息,包括設(shè)備信息、恢復(fù)信息、恢復(fù)時間等。設(shè)備管理流程圖如圖3-7所示。圖3-7設(shè)備管理流程圖3.4本章小結(jié)本章對系統(tǒng)的需求進(jìn)行了分析,然后對系統(tǒng)的架構(gòu)及模塊功能進(jìn)行了詳細(xì)的設(shè)計,為系統(tǒng)的開發(fā)提供了保障。第4章系統(tǒng)實現(xiàn)與測試4.1開發(fā)環(huán)境基于物聯(lián)網(wǎng)的設(shè)備運維系統(tǒng)的開發(fā)環(huán)境包括開發(fā)語言、數(shù)據(jù)庫等。表4-1系統(tǒng)開發(fā)環(huán)境工具名稱版本操作系統(tǒng)Windows11開發(fā)語言C++17JavaJDK1.8開發(fā)集成環(huán)境idea2022.2.1關(guān)系型數(shù)據(jù)庫Mysql8.0.12時序數(shù)據(jù)庫InfluxDB2.04.2系統(tǒng)實現(xiàn)4.3.1設(shè)備數(shù)據(jù)采集的實現(xiàn)設(shè)備數(shù)據(jù)采集實現(xiàn)了對設(shè)備監(jiān)測數(shù)據(jù)的采集與存儲。首先利用傳感器讀取需要監(jiān)測的數(shù)據(jù),將讀取到的原始數(shù)據(jù)轉(zhuǎn)換為MQTT協(xié)議可以發(fā)送的格式,然后將轉(zhuǎn)化后的數(shù)據(jù)發(fā)送至MQTTBroker,接收到消息后儲存到InfluxDB。MqttService部分核心代碼如表4-2所示,此段代碼實現(xiàn)了對設(shè)備信息的上報。表4-2MqttService類部分代碼表privatevoidreportDevice(LongproductId,StringdeviceNum,Stringmessage){try{//設(shè)備實體DevicedeviceEntity=deviceService.selectDeviceBySerialNumber(deviceNum);//上報設(shè)備信息Devicedevice=JSON.parseObject(message,Device.class);device.setProductId(productId);device.setSerialNumber(deviceNum);deviceService.reportDevice(device,deviceEntity);//發(fā)布設(shè)備狀態(tài)publishStatus(productId,deviceNum,3,deviceEntity.getIsShadow(),device.getRssi());}catch(Exceptione){logger.error("接收設(shè)備信息,解析數(shù)據(jù)時異常message={}",e.getMessage());}}/***上報屬性**@parammessage*/privatevoidreportProperty(LongproductId,StringdeviceNum,Stringmessage,booleanisShadow){try{List<ThingsModelValueRemarkItem>thingsModelValueRemarkItems=JSON.parseArray(message,ThingsModelValueRemarkItem.class);ThingsModelValuesInputinput=newThingsModelValuesInput();input.setProductId(productId);input.setDeviceNumber(deviceNum);input.setThingsModelValueRemarkItem(thingsModelValueRemarkItems);deviceService.reportDeviceThingsModelValue(input,1,isShadow);}catch(Exceptione){logger.error("接收屬性數(shù)據(jù),解析數(shù)據(jù)時異常message={}",e.getMessage());}}/***上報功能**@parammessage*/privatevoidreportFunction(LongproductId,StringdeviceNum,Stringmessage,booleanisShadow){try{List<ThingsModelValueRemarkItem>thingsModelValueRemarkItems=JSON.parseArray(message,ThingsModelValueRemarkItem.class);ThingsModelValuesInputinput=newThingsModelValuesInput();input.setProductId(productId);input.setDeviceNumber(deviceNum);input.setThingsModelValueRemarkItem(thingsModelValueRemarkItems);deviceService.reportDeviceThingsModelValue(input,2,isShadow);}catch(Exceptione){logger.error("接收功能,解析數(shù)據(jù)時異常message={}",e.getMessage());}}/***上報事件**@parammessage*/privatevoidreportEvent(LongproductId,StringdeviceNum,Stringmessage){try{List<ThingsModelValueRemarkItem>thingsModelValueRemarkItems=JSON.parseArray(message,ThingsModelValueRemarkItem.class);Devicedevice=deviceService.selectDeviceBySerialNumber(deviceNum);for(inti=0;i<thingsModelValueRemarkItems.size();i++){//添加到設(shè)備日志DeviceLogdeviceLog=newDeviceLog();deviceLog.setDeviceId(device.getDeviceId());deviceLog.setDeviceName(device.getDeviceName());deviceLog.setLogValue(thingsModelValueRemarkItems.get(i).getValue());deviceLog.setRemark(thingsModelValueRemarkItems.get(i).getRemark());deviceLog.setSerialNumber(device.getSerialNumber());deviceLog.setIdentity(thingsModelValueRemarkItems.get(i).getId());deviceLog.setLogType(3);deviceLog.setIsMonitor(0);deviceLog.setUserId(device.getUserId());deviceLog.setUserName(device.getUserName());deviceLog.setTenantId(device.getTenantId());deviceLog.setTenantName(device.getTenantName());deviceLog.setCreateTime(DateUtils.getNowDate());//1=影子模式,2=在線模式,3=其他deviceLog.setMode(2);logService.saveDeviceLog(deviceLog);}}catch(Exceptione){logger.error("接收事件,解析數(shù)據(jù)時異常message={}",e.getMessage());}}4.2.2設(shè)備管理模塊的實現(xiàn)設(shè)備管理子模塊負(fù)責(zé)設(shè)備的搜索、添加、刪除和修改等功能的實現(xiàn)。DeviceController中定義了設(shè)備相關(guān)的接口,然后將請求的參數(shù)傳到DeviceServiceImpl中進(jìn)行進(jìn)一步的處理。DeviceController的部分核心代碼如表4-3所示,此段代碼實現(xiàn)了對設(shè)備的新增、修改和刪除功能。通過調(diào)用IDeviceServiceImpl中的方法,對設(shè)備進(jìn)行各種操作,然后通過AjaxResult返回給前端。表4-3DeviceController類部分代碼表publicclassDeviceControllerextendsBaseController{@AutowiredprivateIDeviceServicedeviceService;/***新增設(shè)備*/@PreAuthorize("@ss.hasPermi('iot:device:add')")@Log(title="添加設(shè)備",businessType=BusinessType.INSERT)@PostMapping@ApiOperation("添加設(shè)備")publicAjaxResultadd(@RequestBodyDevicedevice){returnAjaxResult.success(deviceService.insertDevice(device));}/***修改設(shè)備*/@PreAuthorize("@ss.hasPermi('iot:device:edit')")@Log(title="修改設(shè)備",businessType=BusinessType.UPDATE)@PutMapping@ApiOperation("修改設(shè)備")publicAjaxResultedit(@RequestBodyDevicedevice){returndeviceService.updateDevice(device);}/***刪除設(shè)備*/@PreAuthorize("@ss.hasPermi('iot:device:remove')")@Log(title="刪除設(shè)備",businessType=BusinessType.DELETE)@DeleteMapping("/{deviceIds}")@ApiOperation("批量刪除設(shè)備")publicAjaxResultremove(@PathVariableLong[]deviceIds)throwsSchedulerException{returntoAjax(deviceService.deleteDeviceByDeviceId(deviceIds[0]));}/***生成設(shè)備編號*/@PreAuthorize("@ss.hasPermi('iot:device:edit')")@GetMapping("/generator")@ApiOperation("生成設(shè)備編號")publicAjaxResultgeneratorDeviceNum(){returnAjaxResult.success("操作成功",deviceService.generationDeviceNum());}}設(shè)備管理模塊功能圖如圖4-1所示,用戶可以添加設(shè)備、刪除設(shè)備,查看設(shè)備的情況并可以對設(shè)備信息進(jìn)行修改,例如名稱、編號、產(chǎn)品等,還能獲取其地址并在地圖上顯示。圖4-1設(shè)備管理模塊功能圖4.3.3設(shè)備分組模塊的實現(xiàn)設(shè)備分組子模塊實現(xiàn)了對設(shè)備分組的新增、修改和刪除,以及對設(shè)備的關(guān)聯(lián)。本模塊在GroupController中定義了設(shè)備分組的相關(guān)接口,然后在GroupServiceImpl中進(jìn)行邏輯處理。設(shè)備分組的部分核心代碼如表4-4所示,該段代碼實現(xiàn)了對設(shè)備分組的新增、修改和刪除,以及對設(shè)備的關(guān)聯(lián)操作。其中對設(shè)備進(jìn)行關(guān)聯(lián),通過設(shè)備分組對象DeviceGroupInput作為數(shù)據(jù)容器,傳遞分組ID以及設(shè)備ID以進(jìn)行關(guān)聯(lián)。表4-4GroupController類部分代碼表publicclassGroupControllerextendsBaseController{@AutowiredprivateIGroupServicegroupService;/***獲取設(shè)備分組詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:group:query')")@GetMapping(value="/{groupId}")@ApiOperation("獲取分組詳情")publicAjaxResultgetInfo(@PathVariable("groupId")LonggroupId){returnAjaxResult.success(groupService.selectGroupByGroupId(groupId));}/***獲取設(shè)備分組詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:group:query')")@GetMapping(value="/{groupId}")@ApiOperation("獲取分組詳情")publicAjaxResultgetInfo(@PathVariable("groupId")LonggroupId){returnAjaxResult.success(groupService.selectGroupByGroupId(groupId));}/***獲取分組下的所有關(guān)聯(lián)設(shè)備ID數(shù)組*/@PreAuthorize("@ss.hasPermi('iot:group:query')")@GetMapping(value="/getDeviceIds/{groupId}")@ApiOperation("獲取分組下的所有關(guān)聯(lián)設(shè)備ID數(shù)組")publicAjaxResultgetDeviceIds(@PathVariable("groupId")LonggroupId){returnAjaxResult.success(groupService.selectDeviceIdsByGroupId(groupId));}/***更新分組下的關(guān)聯(lián)設(shè)備*@paraminput*@return*/@PreAuthorize("@ss.hasPermi('iot:group:edit')")@Log(title="設(shè)備分組",businessType=BusinessType.UPDATE)@PutMapping("/updateDeviceGroups")@ApiOperation("更新分組下的關(guān)聯(lián)設(shè)備")publicAjaxResultupdateDeviceGroups(@RequestBodyDeviceGroupInputinput){returntoAjax(groupService.updateDeviceGroups(input));}設(shè)備分組模塊功能圖如圖4-2所示,用戶可以對分組進(jìn)行新增、修改、刪除和查看,查看本分組下有哪些設(shè)備,還可以在產(chǎn)品分類下選擇已有的設(shè)備添加。圖4-2設(shè)備分組模塊功能圖4.3.4產(chǎn)品管理模塊的實現(xiàn)產(chǎn)品管理子模塊實現(xiàn)了對產(chǎn)品的查詢、查看、新增以及刪除,以及跳轉(zhuǎn)查看此產(chǎn)品下的設(shè)備。本模塊在ProductController中定義了產(chǎn)品管理的相關(guān)接口,然后在ProductServiceImpl中進(jìn)行邏輯處理。ProductController的部分核心代碼如表4-5所示,其實現(xiàn)了對產(chǎn)品信息的查詢、查看、新增以及刪除等功能。表4-5ProductController類部分代碼表publicclassProductControllerextendsBaseController{@AutowiredprivateIProductServiceproductService;/***查詢產(chǎn)品列表*/@GetMapping("/list")@ApiOperation("產(chǎn)品分頁列表")publicTableDataInfolist(Productproduct){startPage();returngetDataTable(productService.selectProductList(product));}/***獲取產(chǎn)品詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:product:query')")@GetMapping(value="/{productId}")@ApiOperation("獲取產(chǎn)品詳情")publicAjaxResultgetInfo(@PathVariable("productId")LongproductId){returnAjaxResult.success(productService.selectProductByProductId(productId));}/***新增產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:add')")@Log(title="產(chǎn)品",businessType=BusinessType.INSERT)@PostMapping@ApiOperation("添加產(chǎn)品")publicAjaxResultadd(@RequestBodyProductproduct){returnAjaxResult.success(productService.insertProduct(product));}/***修改產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:edit')")@Log(title="產(chǎn)品",businessType=BusinessType.UPDATE)@PutMapping@ApiOperation("修改產(chǎn)品")publicAjaxResultedit(@RequestBodyProductproduct){returntoAjax(productService.updateProduct(product));}/***發(fā)布產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:edit')")@Log(title="更新產(chǎn)品狀態(tài)",businessType=BusinessType.UPDATE)@PutMapping("/status")@ApiOperation("更新產(chǎn)品狀態(tài)")publicAjaxResultchangeProductStatus(@RequestBodyChangeProductStatusModelmodel){returnproductService.changeProductStatus(model);}/***刪除產(chǎn)品*/@PreAuthorize("@ss.hasPermi('iot:product:remove')")@Log(title="產(chǎn)品",businessType=BusinessType.DELETE)@DeleteMapping("/{productIds}")@ApiOperation("批量刪除產(chǎn)品")publicAjaxResultremove(@PathVariableLong[]productIds){returnproductService.deleteProductByProductIds(productIds);}}產(chǎn)品管理模塊功能圖如圖4-3所示,用戶可以產(chǎn)品進(jìn)行新增、修改、刪除和查看,并可以查看本產(chǎn)品下有哪些設(shè)備。圖4-3產(chǎn)品管理模塊功能圖4.3.5產(chǎn)品分類模塊的實現(xiàn)產(chǎn)品分類子模塊實現(xiàn)了對產(chǎn)品分類的查詢、查看、新增、修改和刪除,及其顯示順序。本模塊在CategoryController中定義了產(chǎn)品分類的相關(guān)接口,然后在CategoryServiceImpl中進(jìn)行邏輯處理。如表4-6為設(shè)備分組的部分核心代碼,該段代碼實現(xiàn)了對設(shè)備分組的查詢、查看、新增、修改和刪除功能。表4-6CategoryController類部分代碼表publicclassCategoryControllerextendsBaseController{@AutowiredprivateICategoryServicecategoryService;/***獲取產(chǎn)品分類詳細(xì)信息*/@ApiOperation("獲取分類詳情")@PreAuthorize("@ss.hasPermi('iot:category:query')")@GetMapping(value="/{categoryId}")publicAjaxResultgetInfo(@PathVariable("categoryId")LongcategoryId){returnAjaxResult.success(categoryService.selectCategoryByCategoryId(categoryId));}/***新增產(chǎn)品分類*/@PreAuthorize("@ss.hasPermi('iot:category:add')")@Log(title="產(chǎn)品分類",businessType=BusinessType.INSERT)@PostMapping@ApiOperation("添加分類")publicAjaxResultadd(@RequestBodyCategorycategory){returntoAjax(categoryService.insertCategory(category));}/***修改產(chǎn)品分類*/@PreAuthorize("@ss.hasPermi('iot:category:edit')")@Log(title="產(chǎn)品分類",businessType=BusinessType.UPDATE)@PutMapping@ApiOperation("修改分類")publicAjaxResultedit(@RequestBodyCategorycategory){returntoAjax(categoryService.updateCategory(category));}/***刪除產(chǎn)品分類*/@PreAuthorize("@ss.hasPermi('iot:category:remove')")@Log(title="產(chǎn)品分類",businessType=BusinessType.DELETE)@DeleteMapping("/{categoryIds}")@ApiOperation("批量刪除分類")publicAjaxResultremove(@PathVariableLong[]categoryIds){returncategoryService.deleteCategoryByCategoryIds(categoryIds);}}產(chǎn)品分組模塊功能圖如圖4-4所示,用戶可以對產(chǎn)品分類進(jìn)行新增、修改、刪除和查看。圖4-4產(chǎn)品分組模塊功能圖4.3.6設(shè)備告警模塊的實現(xiàn)設(shè)備告警子模塊實現(xiàn)了對設(shè)備告警信息的獲取,以及對告警信息的查詢、查看、刪除。本模塊在AlertController中定義了部門管理的相關(guān)接口,然后在SysAleServiceImpl中進(jìn)行邏輯處理。AlertController的部分核心代碼如表4-7所示,其實現(xiàn)了對告警信息的查詢、查看、刪除等功能,其中獲取設(shè)備告警信息,是按照設(shè)備的ID在數(shù)據(jù)庫中進(jìn)行查詢后獲取到。表4-7AlertController類部分代碼表publicclassAlertControllerextendsBaseController{@AutowiredprivateIAlertServicealertService;/***獲取設(shè)備告警詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('iot:alert:query')")@GetMapping(value="/{alertId}")publicAjaxResultgetInfo(@PathVariable("alertId")LongalertId){returnAjaxResult.success(alertService.selectAlertByAlertId(alertId));}/***新增設(shè)備告警*/@PreAuthorize("@ss.hasPermi('iot:alert:add')")@Log(title="設(shè)備告警",businessType=BusinessType.INSERT)@PostMappingpublicAjaxResultadd(@RequestBodyAlertalert){returntoAjax(alertService.insertAlert(alert));}/***刪除設(shè)備告警*/@PreAuthorize("@ss.hasPermi('iot:alert:remove')")@Log(title="設(shè)備告警",businessType=BusinessType.DELETE)@DeleteMapping("/{alertIds}")publicAjaxResultremove(@PathVariableLong[]alertIds){returntoAjax(alertService.deleteAlertByAlertIds(alertIds));}}設(shè)備告警模塊功能圖如圖4-5所示,用戶可以告警信息進(jìn)行查看、查找,并對告警信息進(jìn)行處理。圖4-5設(shè)備告警模塊功能圖4.3.7用戶管理模塊的實現(xiàn)用戶管理子模塊實現(xiàn)了對用戶信息的查詢、查看、新增、修改和刪除,以及對用戶信息的導(dǎo)出及導(dǎo)入,另外管理員還能對用戶進(jìn)行授權(quán)管理。本模塊在SysUserController中定義了部門管理的相關(guān)接口,然后在SysUserServiceImpl中進(jìn)行邏輯處理。SysUserController的部分核心代碼如表4-8所示,其實現(xiàn)了根據(jù)用戶編號對用戶信息的查詢、查看、新增、修改和刪除等功能。表4-8SysUsertController類部分代碼表publicclassSysUserControllerextendsBaseController{@AutowiredprivateISysUserServiceuserService;@AutowiredprivateISysRoleServiceroleService;@AutowiredprivateISysPostServicepostService;/***根據(jù)用戶編號獲取詳細(xì)信息*/@PreAuthorize("@ss.hasPermi('system:user:query')")@GetMapping(value={"/","/{userId}"})publicAjaxResultgetInfo(@PathVariable(value="userId",required=false)LonguserId){userService.checkUserDataScope(userId);AjaxResultajax=AjaxResult.success();List<SysRole>roles=roleService.selectRoleAll();ajax.put("roles",SysUser.isAdmin(userId)?roles:roles.stream().filter(r->!r.isAdmin()).collect(Collectors.toList()));ajax.put("posts",postService.selectPostAll());if(StringUtils.isNotNull(userId)){ajax.put(AjaxResult.DATA_TAG,userService.selectUserById(userId));ajax.put("postIds",postService.selectPostListByUserId(userId));ajax.put("roleIds",roleService.selectRoleListByUserId(userId));}returnajax;}/***新增用戶*/@PreAuthorize("@ss.hasPermi('system:user:add')")@Log(title="用戶管理",businessType=BusinessType.INSERT)@PostMappingpublicAjaxResultadd(@Validated@RequestBodySysUseruser){if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))){returnAjaxResult.error("新增用戶'"+user.getUserName()+"'失敗,登錄賬號已存在");}elseif(StringUtils.isNotEmpty(user.getPhonenumber())&&UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))){returnAjaxResult.error("新增用戶'"+user.getUserName()+"'失敗,手機號碼已存在");}elseif(StringUtils.isNotEmpty(user.getEmail())&&UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))){returnAjaxResult.error("新增用戶'"+user.getUserName()+"'失敗,郵箱賬號已存在");}user.setCreateBy(getUsername());user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));returntoAjax(userService.insertUser(user));}/***修改用戶*/@PreAuthorize("@ss.hasPermi('system:user:edit')")@Log(title="用戶管理",businessType=BusinessType.UPDATE)@PutMappingpublicAjaxResultedit(@Validated@RequestBodySysUseruser){userService.checkUserAllowed(user);if(StringUtils.isNotEmpty(user.getPhonenumber())&&UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))){returnAjaxResult.error("修改用戶'"+user.getUserName()+"'失敗,手機號碼已存在");}elseif(StringUtils.isNotEmpty(user.getEmail())&&UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))){returnAjaxResult.error("修改用戶'"+user.getUserName()+"'失敗,郵箱賬號已存在");}user.setUpdateBy(getUsername());returntoAjax(userService.updateUser(user));}/***刪除用戶*/@PreAuthorize("@ss.hasPermi('system:user:remove')")@Log(title="用戶管理",businessType=BusinessType.DELETE)@DeleteMapping("/{userIds}")publicAjaxResultremove(@PathVariableLong[]userIds){if(ArrayUtils.contains(userIds,getUserId())){returnerror("當(dāng)前用戶不能刪除");}returntoAjax(userService.deleteUserByIds(userIds));}/***重置密碼*/@PreAuthorize("@ss.hasPermi('system:user:resetPwd')")@Log(title="用戶管理",businessType=BusinessType.UPDATE)@PutMapping("/resetPwd")publicAjaxResultresetPwd(@RequestBodySysUseruser){userService.checkUserAllowed(user);user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));user.setUpdateBy(getUsername());returntoAjax(userService.resetPwd(user));}用戶管理模塊功能圖如圖4-6所示,管理員可以對用戶進(jìn)行管理,還可以停用用戶,并且可以對用戶信息進(jìn)行導(dǎo)出,以及導(dǎo)入用戶信息。圖4-6用戶管理模塊功能圖4.3.8部門管理模塊的實現(xiàn)部門管理子模塊實現(xiàn)了對部門的查詢、查看、刪除,本模塊在SysDeptController中定義了部門管理的相關(guān)接口,然后在SysDeptServiceImpl中進(jìn)行邏輯處理。SysDeptController的部分核心代碼如表4-9所示,其實現(xiàn)了根據(jù)部門的編號對部門信息的查詢、查看以及刪除等功能。表4-9SysDeptController類部分代碼表publicclassSysDeptControllerextendsBaseController{@AutowiredprivateISysDeptServicedeptService;/***獲取部門列表*/@PreAuthorize("@ss.hasPermi('system:dept:list')")@GetMapping("/list")publicAjaxResultlist(SysDeptdept){List<SysDept>depts=deptService.selectDeptList(dept);returnAjaxResult.success(depts);}/***新增部門*/@PreAuthorize("@ss.hasPermi('system:dept:add')")@Log(title="部門管理",businessType=BusinessType.INSERT)@PostMappingpublicAjaxResultadd(@Validated@RequestBodySysDeptdept){if(UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))){returnAjaxResult.error("新增部門'"+dept.getDeptName()+"'失敗,部門名稱已存在");}dept.setCreateBy(getUsername());returntoAjax(deptService.insertDept(dept));}/***修改部門*/@PreAuthorize("@ss.hasPermi('system:dept:edit')")@Log(title="部門管理",businessType=BusinessType.UPDATE)@PutMappingpublicAjaxResultedit(@Validated@RequestBodySysDeptdept){if(UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))){returnAjaxResult.error("修改部門'"+dept.getDeptName()+"'失敗,部門名稱已存在");}elseif(dept.getParentId().equals(dept.getDeptId())){returnAjaxResult.error("修改部門'"+dept.getDeptName()+"'失敗,上級部門不能是自己");}elseif(StringUtils.equals(UserConstants.DEPT_DISABLE,dept.getStatus())&&deptService.selectNormalChildrenDeptById(dept.getDeptId())>0){returnAjaxResult.error("該部門包含未停用的子部門!");}dept.setUpdateBy(getUsername());returntoAjax(deptService.updateDept(dept));}/***刪除部門*/@PreAuthorize("@ss.hasPermi('system:dept:remove')")@Log(title="部門管理",businessType=BusinessType.DELETE)@Del
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年綠色建筑材料市場推廣策略與政策支持下的綠色建筑市場前景研究報告
- 《競爭法學(xué)第三版》課件1
- 干部關(guān)愛陣地建設(shè)方案(3篇)
- 2025年國際禁毒日禁毒知識競賽題庫及答案(440題)
- 吉林市場管理辦法
- 名稱核準(zhǔn)管理辦法
- 吳江封閉管理辦法
- 員工定位管理辦法
- 售電用戶管理辦法
- 商務(wù)保密管理辦法
- 2024年公共衛(wèi)生消毒監(jiān)測及消毒員崗位技術(shù)知識考試題庫(必刷)
- 營業(yè)執(zhí)照代辦合同協(xié)議
- 2025年中國中煤能源集團有限公司西部分公司招聘筆試參考題庫含答案解析
- 2025-2030中國電鍍行業(yè)發(fā)展分析及投資風(fēng)險預(yù)警與發(fā)展策略研究報告
- 電工安全用電知識
- 小升初數(shù)學(xué)真題卷之阜陽成效中學(xué)入校分班試卷 B卷
- 地理標(biāo)志證明商標(biāo)產(chǎn)品 敖漢小米
- HSE作業(yè)計劃書范文
- 質(zhì)量控制計劃培訓(xùn)
- 納米材料的發(fā)展歷程以及各國納米技術(shù)的發(fā)展現(xiàn)狀
- 2025年浙江寧波市奉化區(qū)農(nóng)商控股集團有限公司招聘筆試參考題庫附帶答案詳解
評論
0/150
提交評論