999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Spring Boot的競賽設備共享平臺后端開發探析

2023-08-09 07:17:42都霓凱解佳慧蔣杰
中國設備工程 2023年14期
關鍵詞:數據庫用戶設備

都霓凱,解佳慧,蔣杰

(1.四川大學,四川 成都 610000;2.四川核工業技師學院,四川 廣元 628000)

每年都會有大量職業技術學校的老師和學生參加該比賽,展現其突出的實踐能力。參加該比賽,前期需投入一系列競賽相關器材。然而,許多學校由于經費限制,無法購置足夠的競賽器材,導致一部分學生參賽受限;參賽后,購置的競賽器材難有用武之地而被迫閑置,造成極大的浪費。因此,有必要針對參賽機構建立一個競賽設備共享平臺,促成各個機構間閑置競賽設備的流通,以實現資源的充分利用。本項目組給出一種基于Spring Boot與Vue的競賽設備供需平臺的設計與實現。項目完整源代碼在Gitee已上傳,并且成功在服務器上運行供內部成員使用。

1 項目概述

1.1 項目環境

為了方便代碼實現和后期運營維護,本項目采取了前后端分離的工作模式,前端通過ajax調用后端api來完成整個系統的運作。前后端均使用IntelliJ IDEA開發。測試階段,進行本地的前后端代碼結合測試。開發完成后部署在Linux服務器上進行測試和發布。

表1 項目環境表

1.2 關鍵技術說明

(1)Tomcat。是一個輕量級的Web應用服務器,免費使用且開放了源代碼。利用它可以響應HTML頁面的響應請求。而Spring框架中內置了1個tomcat服務器,極大方便了使用者的開發。當在1臺機器上配置好Apache 服務器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat時,它實際上作為一個與Apache 獨立的進程單獨運行的。

(2)Spring Data JPA。JPA即Java Persistence API,由Sun公司官方提出的Java持久化規范。Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規范的基礎上封裝的一套 JPA 應用框架,底層使用了 Hibernate的 JPA 技術實現,可使開發者用極簡的代碼即可實現對數據的訪問和操作,它提供了包括增刪改查等在內的常用功能,且易于擴展。以此項目后端架構為例,DAO層會對JpaRepository繼承,具體規則可以查詢Spring文檔。

圖1 Spring Data Jpa示例

(4)lombok。是一個快捷的Java插件。主要使用其中的@Data注解,在類外加上這個注解之后,可以自動生成get()/set()類內部成員變量的方法,即不需要顯示地定義就可以調用,可節省上百行甚至上千行代碼。

(5)hash算法。hash 算法(散列算法、摘要算法)即把任意長度的輸入映射為固定長度的輸出,比如,密碼 Evanniubi 變成五位的輸出 kchpl,這種算法不可逆,且存在信息損失,對于復雜密碼來說,破解成本極高。加嚴是提高 hash 算法的安全性的一個常用手段。

(6)開箱即用。是Spring Boot框架中非常重要的一個概念,通過在開發過程中,使用約定省去了以往在開發中繁瑣的配置工作,用注解完全省去了XML文件的配置工作。傳統Spring IO平臺飽受非議的一點就是大量的XML配置以及復雜的依賴管理,開發人員需要不斷編寫XML,而且在一些場景中甚至不需要編寫繁瑣的import語句。開箱即用策略使得Spring Boot甚至可以在140個字符內實現可運行的web應用,且沒有代碼的生成,極大得提升了產品的關注度。

2 競賽設備共享平臺設計

2.1 功能模塊設計

由于賬號性質不同,所以系統功能基本分為2個子類:用戶類和管理員類。用戶類下又需要設計增加、修改、查詢、刪除等功能,以及對自己賬號的管理。但是競賽項目的增刪、修改,競賽所需設備的增刪、修改都需要管理員權限,且用戶不能獲取他人賬號所有的信息。查詢也分很多種,需要根據具體需求來設計具體功能。管理員類除了擁有普通用戶的全部功能外,還可以對所有競賽項目、競賽所需設備、共享設備、訂單以及所有賬號進行管理。

2.2 平臺后端設計

后端小組在JetBrain官方網站上申請了學生認證,使用其公司提供的正版IntelliJ IDEA最終版進行開發。借助目前比較熱門的Spring框架搭建項目。框架基本組成已經提供,所以只需要豐富src/main路徑下的內容即可。

后端根據層次劃分共有11層:(1)config包下進行web和shiro的配置,需要定義允許特定請求跨域的方法以及編寫基于URL的過濾器;(2)entity包下將數據庫各實體映射成類,通過@Entity注解表明這個類代表了數據庫中的一個實體表,@Table(name = “”)注解中,name值需要和數據庫中表名相同;(3)DAO包對JpaRepository類進行繼承,實現數據持久化的操作,直接操作數據庫,用于與數據庫的直接交互,定義增刪改查等操作。其中大部分基本函數已經寫好,并且由于Jpa遵循著一套規范,所以想要擴展出我們需要的函數相對容易,只需按照規定的語法編寫函數名稱和返回值即可。具體規范可以參照Spring官方文檔;(4)service包是對DAO包內函數的進一步封裝,實現增刪查改等基本功能,并按照需求實現特殊的功能,負責業務邏輯,跟功能相關的代碼一般寫在這里,編寫、調用各種方法對 DAO 取得的數據進行操作;(5)controller包是最后一層封裝,需要將函數與接口關聯。所謂接口即前端調用的url,負責數據交互,即接收前端發送的數據,通過調用 Service 獲得處理后的數據并返回。在實踐中我們傾向于讓 Controller 顯得清涼一些,以方便代碼的閱讀者尋找分析功能的入口;(6)result包定義了controller包中,函數成功或者失敗的返回數據類型,一般需要code,message,data 3個部分組成;(7)utils包實現需要使用的工具類。例如對字符串的處理方法;(8)error包配置錯誤處理;(9)exception包配置異常處理;(10)filter包實現過濾器方法,即攔截用戶訪問沒有相應權限的網頁,同時不允許用戶未登錄就進入平臺各頁面;(11)realm包為shiro進行用戶認證的核心,這里定義獲取認證與授權信息的方法。

后端中最基本的最重要的層次為DAO-servicecontroller,也是項目開發的主要工作內容。

2.3 數據庫設計

本項目使用MySQL 8.0數據庫,以學生資格認證申請了正版Navicat 16來可視化管理數據庫。數據庫中共有7個實體表:dept(所屬單位)、user(用戶)、order(訂單)、share_eq(共享設備詳情)、equipments(設備種類)、equip_comp(設備、競賽關聯表)、competition(競賽項目)。其中除了主碼約束之外,還有部分屬性使用check約束取值。每個表之間的主碼還有多對一外碼約束。代碼中可以通過 @ManyToOne與@JoinColumn()注解實現。由于competition與equipments是多對多關系,所以直接在數據庫中建立實體表equip_comp來維護關聯。

wmax denotes the size of the region where the boundary between the doped and undoped zones is moved back and forth under the effect of a periodic bias signal. The two basic expressions for this model are:

競賽項目需要分成各等級,competition表的tag屬性存儲了這個信息。需求中還需要各競賽設備由官方給出指導價格,由equipments的guiding體現。2個表中的desc_屬性需要加下劃線,也是因為desc是保留關鍵字。share_eq表中surplus表示剩余量,設備提供方申請入網設備時可能設備數量有多個。需求方預約設備時也不能無限制預約,每個訂單都會讓剩余量減1,余量為0則不能進行預約。刪除訂單后余量重新加1。禁用狀態status則用來判斷是否可以進行預約。被禁用的理由有多種,余量不足時也會將禁用狀態設為false,即禁用。order表中的evaluate屬性用于記錄評分。分值只能由設備借用者在完成訂單之后給出。

各表主碼均為id。其中user表與dept表沒有外碼約束,user表的school屬性應該從dept表的name中取值。但由于SQL的特性,外碼只能參照表的主碼作為約束,所以school與dept之間沒有參照關系,而是由前端的選擇框實現。share_eq表的eid屬性參照equipments表中的id,uid屬性參照user表中的id,均為多對一關系。order表,實際上數據庫中表名為orde,原因是order是java保留關鍵字,使用會報錯,之后論文中均直接稱其為order表。order表的sid參照share_eq表的id,uid參照user表的id。

共有4個位置使用了check約束。user表中對role屬性進行約束check (`role`=`user``adm``provider`),只可以取三者中的一個。這樣的語法在不同版本的MySQL中可能報錯,有的需要將字符串使用雙引號括起來,并使用OR關鍵詞。在dept表中,check(`local`=`川東``川西``川南``川北``川中`),后期可以豐富部門的地址,具體到成都市的某區某街道。目前只能取4種值是為了演示根據地址查詢共享設備的功能。competition表中,check(`tag`=`土木建筑類``裝備制造類``交通運輸類``電子與信息類``財經商貿類``旅游服務類`),即對競賽進行分類,這樣可以根據類別查詢競賽項目。最后是order表中check (status = 1 OR status = 2 OR status = 3),check (evaluate <= 5 AND evaluate>= 0),對status和evaluate進行約束,status為1表示交易開始,2表示正在交易,3代表交易完成。評分則是限制在0.0~5.0范圍內,一位小數,在數據庫中用numeric(2,1)表示。

3 競賽設備共享平臺實現

3.1 登錄模塊

管理員注冊用戶賬號時,輸入密碼(明文),向后臺發送請求,后臺將密碼加上隨機生成的鹽并 hash,再將 hash 后的值作為密碼存入數據庫,鹽也作為單獨的字段存起來,生成隨機的用戶名告知用戶。之后用戶登錄時,輸入用戶名密碼(明文),向后臺發送請求[4],后臺根據用戶名查詢出鹽,和密碼組合并 hash,將得到的值與數據庫中存儲的密碼比對,若一致則通過驗證。

3.2 用戶模塊

/user/myself接口用于獲取個人信息(同時用于驗證登錄),UserUtils.getUser()獲取當前用戶的用戶名之后通過userService.findByUsername()獲取用戶對象即可。

3.3 競賽模塊

所有用戶均可以獲取全部競賽項目信息,/api/user/allProject調用competitionService.list()即可。

管理員可以添加競賽項目。添加之前先判斷該名稱的競賽是否存在,通過調用competitionService.haveName()判斷。competitionService.haveName()則是調用了competitonDAO。existByName()。前端傳的數據除了競賽的信息,還需要提供所需設備的id列表,整個作為Param1對象,方便處理。Param1在utils包下進行了詳細定義。competitionService.add()添加競賽后,使用增強for循環一一在equip_comp表中添加競賽項目id(cid)和競賽設備id(eid)的關聯。

管理員修改競賽項目,同時修改與設備的關聯,先把現有關聯刪除,之后重新添加。同樣使用Param1數據類型,使用增強for循環。

管理員可以刪除競賽項目,通過/api/admin/deleteProject接口。首先需要判斷請求體competition對象是否在數據庫中存在,判斷equipCompService.haveCid (competition.getId()) 的返回值是否為真即可。刪除操作使用的是 competitionService.deleteById(competition.getId())。所以刪除功能中,前端只需要提供正確的id即可,其余信息不需要提供。這個設計十分重要,在之后的各功能模塊中也都有所體現。

3.4 設備模塊

所有用戶都可以查看所有競賽所需要的設備,通過/api/user/allDevice接口,調用equipmentsService.list()。

管理員可以添加設備,判斷請求體是否為空以后,調用equipmentsService.add(equipments.getName(),equipments.getDesc_(), equipments.getGuiding())。

管理員修改設備的接口,調用的 equipmentsService.edit(equipments)的參數表就簡單很多了,直接將前端傳來的equipments對象傳入即可。在service層中,Competition c=get(competition.getId());得到competition對象之后,對其每個屬性進行覆蓋修改,最后competitionDAO.save(c);完成修改設備。

管理員刪除設備時,如果該設備有相關聯的競賽,則無法進行刪除,調用equipCompService.haveEid()實現判斷equip_comp表中是否有該設備id的關聯項。

除了通過id查找設備,名稱模糊查找設備外,還可以通過競賽查找設備。通過名稱模糊查找設備的方法基本和通過名稱模糊查找競賽的方法一致。想要通過競賽查找設備,必然需要通過存儲關聯項的表equip_comp。該功能在controller/equipCompController中實現。用戶還可以查詢自己共享了的設備的信息。根據id查詢到該用戶共享的設備列表,由于shareEq對象內部均含有equipments對象,所以將共享設備列表中共有的設備對象全部提取出來組成新列表。由于其中可能出現重復的設備,所以需要做去重處理。去重最簡單的方法就是新建一個hashset,HashSet hashset = new HashSet(list);將列表中的元素全部導入,hashset則自動做去重,再將元素全部取出組成列表并返回。

3.5 共享模塊

管理員可以刪除任意共享設備,但是用戶只能刪除自己的共享設備。查詢本用戶的共享設備時,只需提取前端傳來用戶對象中的uid,再調用shareEqService.listByUser()即可。

上傳圖片的功能,分為首次上傳圖片和修改共享設備圖片。首次上傳圖片調用api/user/sharecovers接口,以MultipartFile類型傳輸數據,請求參數的value為file。存儲路徑為/share/workspace/img,是Linux系統路徑格式,因為項目部署在Linux服務器上。修改共享設備圖片除了接受MultipartFile數據外,還要提供路徑變量,調用api/user/sharecovers/{id}接口。需要先從數據庫中獲得該共享設備的圖片url,判斷本地磁盤上是否存在該文件,如果存在則刪除舊圖片,將新圖片url存入數據庫之后返回url。

3.6 訂單模塊

添加訂單時,需判斷共享設備是否有余量,如果有則余量減一再添加訂單。默認狀態為1,評分為0.0。相應的,刪除訂單時余量重新加一。

通過調用/api/user/borrow接口,用戶可以查找自己的借用訂單。調用/api/user/lend,用戶查找自己的借出訂單。以上2個功能均需要先驗證當前登錄用戶是否和請求體用戶對象相同。

3.7 訪問攔截模塊

完成了用戶登錄認證之后,還需要考慮完善的訪問攔截。如果用戶登錄了一次,關閉瀏覽器后,sessionId就會消失,再次發送請求,shiro就會認為用戶已經變更。但有時我們需要保持登錄狀態,不然每次都要重新登錄,所以shiro提供了rememberMe機制。rememberMe機制不是單純地設置cookie存活時間,而是又單獨保存了一種新的狀態。之所以這樣設計,也是出于安全性考慮,把“記住我”的狀態與實際登錄狀態做出區分,這樣,就可以控制用戶在訪問不太敏感的頁面時無需重新登錄,而訪問類似于購物車、訂單之類的頁面時必須重新登錄。除了rememberMe機制外,還需要一個基于URL的路徑過濾器,URLPathMatchingFilter。filterChainDefinitionMap.put(“/api/admin/**”,“url”);表示所有以/api/admin/為前綴的接口都需要有管理員權限才能訪問。filterChainDefinitionMap.put(“/api/user/password”,“authc”);表示這個接口需要登錄才能訪問。

4 測試和部署

本項目采取了多種測試方法結合。首先后端開發過程中,通過學生資格認證申請正版Postman軟件進行測試后端接口,測試結果全部通過。在Postman上需要提供測試的接口url,以及正確輸入請求體格式、類型、數據內容。部分接口只接受單個參數,設置param即可。還有部分接口需要傳輸Map之類的特殊類型,則需要選擇content-type為application/json,然后寫明原始json格式的數據進行測試。之后在IDEA同時啟動前端和后端做結合測試,本地計算機作為服務器,瀏覽器訪問http://localhost:8080/index,測試前端按鈕和后端接口的交互。最后項目在服務器端部署之后,也持續不斷進行測試,發現問題后及時修改優化,主要是Linux系統文件路徑問題。后端jar包版本已經迭代13次。目前已經能穩定運行,使用瀏覽器訪問ip地址即可使用。

服務器使用的是華為云Linux服務器,通過學生認證申請的正版Xshell軟件遠程連接服務器,使用命令行操作文件系統。首先sudo apt-get install lrzsz安裝rz,sz,之后選擇文件傳輸中的ZModem傳輸本地文件至遠程服務器。在此之前,后端內容需要通過mevan打包成jar文件包,上傳至服務器之后,以nohup java -jar項目名.jar &命令運行jar包,即可在關閉服務器連接之后進程仍然運行。

最終用瀏覽器訪問服務器的ip地址即可看到界面,開始使用本競賽設備共享平臺。

猜你喜歡
數據庫用戶設備
諧響應分析在設備減振中的應用
基于MPU6050簡單控制設備
電子制作(2018年11期)2018-08-04 03:26:08
數據庫
財經(2017年2期)2017-03-10 14:35:35
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
數據庫
財經(2016年15期)2016-06-03 07:38:02
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
500kV輸變電設備運行維護探討
工業設計(2016年12期)2016-04-16 02:52:00
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
主站蜘蛛池模板: 日本精品视频| 四虎成人免费毛片| 91成人免费观看| 亚洲精品男人天堂| 欧美天堂在线| 国产精品免费p区| 欧美日韩亚洲国产| 日韩资源站| 狠狠操夜夜爽| 精品小视频在线观看| 青青极品在线| 免费人欧美成又黄又爽的视频| 国产视频久久久久| 91av成人日本不卡三区| 亚洲中文字幕久久无码精品A| 久久中文电影| 日韩欧美中文| 无码啪啪精品天堂浪潮av| 亚洲最大综合网| 国产一级小视频| 国产精品美女在线| 啪啪国产视频| 国产成人无码久久久久毛片| 中日韩一区二区三区中文免费视频| 精品剧情v国产在线观看| 高清欧美性猛交XXXX黑人猛交 | 国产在线拍偷自揄拍精品| 伊人五月丁香综合AⅤ| 51国产偷自视频区视频手机观看| 亚洲国产成人精品无码区性色| 91色老久久精品偷偷蜜臀| 免费一级成人毛片| 久热99这里只有精品视频6| 国产va在线| 国产区免费精品视频| 精品国产一二三区| 日本午夜影院| 欧美亚洲另类在线观看| 中文字幕乱码中文乱码51精品| 亚洲欧美国产视频| h网址在线观看| 高清无码手机在线观看| 91亚洲国产视频| 欧美va亚洲va香蕉在线| 国产AV无码专区亚洲A∨毛片| 奇米影视狠狠精品7777| 毛片网站在线看| 一级毛片基地| 亚洲中文字幕23页在线| 中文字幕有乳无码| 91麻豆精品国产高清在线| 国产在线精品香蕉麻豆| 青青草一区| 国产哺乳奶水91在线播放| 国产又黄又硬又粗| 久久毛片免费基地| 成色7777精品在线| 97在线公开视频| 精品丝袜美腿国产一区| 色偷偷男人的天堂亚洲av| 中文字幕 91| 久久精品一卡日本电影| 97国产成人无码精品久久久| 亚洲高清无码精品| 久久综合成人| 亚洲av无码成人专区| 久久久久人妻一区精品色奶水| 国产精品妖精视频| 国产成人a在线观看视频| 国产乱人免费视频| 午夜国产不卡在线观看视频| 亚洲自拍另类| аⅴ资源中文在线天堂| 91精品啪在线观看国产| 毛片一区二区在线看| 九色91在线视频| 欧美有码在线| 9啪在线视频| 免费一级毛片完整版在线看| 亚洲天堂在线视频| 国产自无码视频在线观看| 国产精品精品视频|