葛萌 王穎
(咸陽師范學院 計算機學院,陜西 咸陽712000)
某家具企業(yè)隨著經(jīng)營規(guī)模的擴大,目前利用Excel 進行進銷存方面的數(shù)據(jù)管理已經(jīng)顯得力不存心,希望借助Web 技術利用網(wǎng)絡處理進銷存方面的數(shù)據(jù)管理,提高企業(yè)的運行效率[1]。同時希望項目能夠快速上線并且后期由企業(yè)專人進行維護升級。
本文針對該企業(yè)的實際需求,考慮系統(tǒng)的開發(fā)效率和可維護性,采用SpringBoot 進行系統(tǒng)開發(fā),利用SSM框架進行分層構建,框架各司其職負責處理某一層的業(yè)務,層與層之間解耦合。避免了傳統(tǒng)Web 開發(fā)中存在的表示層數(shù)據(jù)與后臺Java 代碼耦合、開發(fā)效率低、難于維護等問題。
Spring Boot 通過自動裝配功能和“約定大于配置”的開發(fā)理念能夠極大的提高Java EE 項目的開發(fā)效率[2],主要表現(xiàn)在以下方面:
(1)無需定義XML 配置文件。(2)將所有資源打成一個jar包,創(chuàng)建獨立應用的Spring 項目。(3)利用各種starter 啟動器來簡化Maven 的配置,減少對依賴資源的配置。(4)提供生產(chǎn)就緒型功能,如指標,健康檢查和外部配置。(5)提供更多的應用開發(fā)模塊及功能。(6)內嵌Web 服務器,項目的發(fā)布無需再提供war 包。(7)大量使用注解進行開發(fā)。
SSM框架是Spring + Spring MVC + Mybatis 的整合,是標準的MVC 模式。其中SpringMVC 分離了控制器、模型對象、分派器以及處理程序對象的角色,使其更容易進行定制[3]。Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架,供表現(xiàn)層調用,充當了表現(xiàn)層與持久層間的接口[4]。Mybatis 主要負責數(shù)據(jù)的持久化操作,支持普通SQL 查詢、存儲過程和高級映射,通過對象關系映射將Java 對象與數(shù)據(jù)庫中的數(shù)據(jù)記錄相互轉換,通過開源框架配置文件中的引用與項目中的依賴包的導入,即可將三個框架整合起來實現(xiàn)完整的前后端通信流程[5],整合架構如圖1 所示。
圖1 SSM 架構圖
SSM框架中各配置文件的主要內容如下:
在springMVC.xml 中使用注解模式,掃描所有包中的注解,根據(jù)用戶請求,進圖控制器找到相應的RequestMapping 方法,進行邏輯處理;配置靜態(tài)資源;配置視圖解析器。
在applicationContext.xml 中配置數(shù)據(jù)源,連接數(shù)據(jù)庫;加載mybatis 中的xml 文件,xml 文件在dao 層中,每個實體類對應一個mapper.xml 文件對數(shù)據(jù)庫進行操作;配置Spring 事務管理器。在web.xml 中加載spring 容器,設置spring 容器加載配置文件的路徑;加載springMVC 的配置;配置防止Spring 內存溢出監(jiān)聽器;配置編碼問題。
由于系統(tǒng)是Web 架構,存在多個銷售員和進貨員同時對系統(tǒng)進行操作的場景。為了提高系統(tǒng)的響應速度,使用Redis 內存數(shù)據(jù)庫來滿足高并發(fā)的要求。在需要對某一商品入庫或出庫時,查詢到該商品的庫存量放入到Redis 中,在用戶請求對該商品出庫時,需要先在Redis 中查詢庫存量是否大于0,若滿足,服務器才能對該請求響應,否則直接響應“當前庫存為0”。每一個員工相當于一個線程,在系統(tǒng)中將系統(tǒng)響應邏輯放入同步塊中,完成高并發(fā)的出入庫操作。
根據(jù)系統(tǒng)需求分析,系統(tǒng)的總體功能模塊如圖2 所示。
圖2 系統(tǒng)功能模塊圖
(1)員工管理:管理員用來創(chuàng)建員工賬號、初始密碼及角色等信息,可對其進行查詢和刪除操作。員工自身可對密碼、基本信息等進行修改。(2)商品管理:管理員可以對商品進行添加、查詢、修改及刪除操作。也可以對商品按類別、名稱、ID 等進行快速查。(3)入庫管理:管理員或進貨員輸入要入庫的商品號,對其進行入庫操作(若未找到該商品,則需先增加該商品),也可以查看所有的入庫信息和修改某一入庫信息。(4)出庫管理:管理員或售貨員輸入要入庫的商品號,對其進行出庫操作(沒有入庫的商品不能進行出庫操作),以及查看所有的出庫信息或修改某一出庫信息。(5)提醒信息管理:用戶可查看自己已發(fā)送、已接收的提醒信息,也可以給其他人發(fā)送、回復提醒信息。(6)智能推薦:管理員可查看某時間段內推薦或不推薦的前十商品,推薦依據(jù)為該時間段內商品的銷售數(shù)量。(7)報表:管理員可按時間、工廠查看相應的商品報表,主要展示時間段內某一廠家商品的營業(yè)額及利潤,并將結果以圖表形式展示。(8)數(shù)據(jù)備份:管理員可對部分核心數(shù)據(jù)保存到Excel 文件,提高安全性。
根據(jù)需求分析創(chuàng)建系統(tǒng)需要的相應實體類及其屬性,各實體類創(chuàng)建相應數(shù)據(jù)庫表存儲數(shù)據(jù)。創(chuàng)建的表名稱分別為jxc_goods、jxc_manager、jxc_message、jxc_stockin 及 jxc_stockout。員工信息表中的字段:id(員工編號)為主鍵 自增、username(用戶名)、password(用戶密碼) 使用encode 函數(shù)進行加密及decode 函數(shù)進行解密、role(角色)分為管理員、進貨員、售貨員,用來控制進入系統(tǒng)的不同界面。商品信息表中的字段:id(商品ID)為主鍵,是出入庫表中的外鍵。入庫信息表中的字段:id(入庫編號ID)為主鍵 自增、operator(操作員)為當前登錄系統(tǒng)的員工名稱、time(入庫時間)實在提交入庫信息時獲取的本地時間(日期)。出庫信息表中的字段:id(出庫編號ID)為主鍵 自增、operator(操作員)為當前登錄系統(tǒng)的員工名稱、time(出庫時間)實在提交出庫信息時獲取的本地時間(日期)。站內信表中的字段:message_id(信息編號ID)為主鍵 自增、sender(發(fā)送者)為當前登錄系統(tǒng)的員工名稱、time(發(fā)送時間)是在提交信息時獲取的本地時間。
本系統(tǒng)中manager 表對應各員工信息,每個員工根據(jù)角色不同可進行出入庫操作,也可對其他員工發(fā)送信息。出入庫的商品信息需預先存儲在goods 表中,可由多個員工進行多次出入庫。各表間關系如圖3 所示。
圖3 數(shù)據(jù)庫表關系圖
除登錄頁面外不允許有其他頁面或后臺路徑進入到本系統(tǒng)中。用戶通過正常登錄操作將登錄信息保存到session 中,在進行其他操作(如入庫、出庫、回復信息等)都需要從session 中獲取當前登錄用戶信息。如果在session 中沒有發(fā)現(xiàn)登錄用戶信息表明該操作沒有通過登錄,需要將請求重定向到登錄頁面;
否則才執(zhí)行當前的請求。利用過濾器實現(xiàn)上述要求,主要包括定義過濾器實現(xiàn)doFilter 方法和配置過濾器兩個步驟。自定義過濾器類繼承Filter 類,實現(xiàn)其doFilter 方法,核心代碼如下:
通過編碼方式來配置過濾器。 定義WebConfig 類,添加Configuration 注解, 將自定義的過濾器配置到FilterRegistrationBean 中,SpringBoot 在啟動時會創(chuàng)建FilterRegistrationBean 對象從而使過濾器生效,如下代碼所示。
財務報表分析不僅對于企業(yè)財務管理活動有重要意義,對于企業(yè)上一周期生產(chǎn)經(jīng)營活動的評估以及未來企業(yè)戰(zhàn)略規(guī)劃會產(chǎn)生同樣重要的影響[6]。報表是該系統(tǒng)中最重要的一個模塊,主要依據(jù)數(shù)據(jù)庫中一張入庫表及一張出庫表。表中分別記錄商品的出入庫價格、數(shù)量、時間及操作人員,報表就是根據(jù)這兩張表中的數(shù)據(jù)進行計算,從而得到銷售額、利潤等其他信息。
報表分為時間報表及廠家報表,時間報表是通過拿到頁面中管理員輸入的開始時間及結束時間,查找指定時間范圍內所有商品的進貨數(shù)、售貨數(shù)、進貨金額、售貨金額、退貨數(shù)、返廠數(shù)及利潤并按照利潤降序,顯示在前端頁面,拿到需要顯示在頁面中的數(shù)據(jù)選取幾條重要的數(shù)據(jù)如銷售金額、利潤等,使用echart 技術將重要信息顯示在柱狀圖中。在sql 語句中首先連接入庫及商品表查詢商品信息及該商品在指定時間內的總進價及總進貨數(shù)、連接出庫及商品表查詢商品信息及該商品在指定時間內的總售價及總售貨數(shù),將查詢到的兩個結果集進行左連接,在得到的結果集中通過不同字段間的計算得到該行商品對應的利潤、庫存等信息。在連接時如果某結果集無結果則對應字段顯示為空,若為數(shù)字類型則顯示為0,得到最終的結果集按利潤降序排序;廠家報表是查找本店在所有廠家中購入的商品數(shù)量、商品類型、總進價、利潤等數(shù)據(jù),按利潤降序,顯示柱狀圖方式與時間報表相同。時間報表的sql 語句如下:
系統(tǒng)前端采用JSP 視圖技術,并結合多個JS 及CSS 文件對頁面進行布局,完成折疊面板及時間選擇控件的顯示。使用EL表達式顯示Controller 放入到Model 中的數(shù)據(jù)。對于頁面中需顯示的靜態(tài)資源,在該頁面發(fā)送請求時不攔截靜態(tài)資源路徑,使用${pageContext.request.contextPath}獲取上下文環(huán)境訪問靜態(tài)資源,也可在springMVC.xml 中配置靜態(tài)資源,js 文件的配置如下:
在springMVC.xml 中使用注解模式,掃描所有包中的注解。編寫ActionController.java 及BackUpController.java 文件,使用@Controller 注解。前臺頁面發(fā)來的請求,可通過注解找到請求對應的控制器中的使用@RequestMapping 注解的某一方法,在該方法中接收前臺頁面?zhèn)鬟f的參數(shù)并對請求進行邏輯處理,通過調用業(yè)務邏輯層實現(xiàn)對數(shù)據(jù)的增、刪、改、查等操作,方法的返回類型為String,返回頁面名稱。通過springMVC.xml 中配置的視圖解析器返回到該路徑下的相應頁面。注解模式使編程更加簡潔,代碼更加清晰。
業(yè)務邏輯層中包含每一個實體類的接口,通過實現(xiàn)接口方法完成每個實體類的邏輯處理,例如系統(tǒng)中商品實體需完成增、刪、改、查及快速查詢操作,應在業(yè)務邏輯層GoodsService.java 接口中定義操作方法,在GoodsServiceImpl.java 中實現(xiàn)GoodsService.java 接口中的方法,在方法中調用數(shù)據(jù)持久層并編寫處理邏輯代碼完成頁面的請求。
使用MyBatis 連接數(shù)據(jù)庫存儲及變更數(shù)據(jù)。 在applicationContext.xml 中配置數(shù)據(jù)源連接數(shù)據(jù)庫。每一實體類需要對應的mapper.xml 文件,本系統(tǒng)中包含七個實體類的七個映射文件,在映射文件中完成不同操作的sql 語句編寫,可直接對數(shù)據(jù)庫進行操作。 在 applicationContext.xml 中配置sqlSessionfactory 自動掃描加載dao 層中mapper.xml 文件。從而將頁面?zhèn)鱽淼恼埱髷?shù)據(jù)通過控制器、業(yè)務邏輯層處理后在該層對數(shù)據(jù)庫操作,達到本次請求的目的。
利用SpringBoot+SSM 框架設計并實現(xiàn)了一個中小型企業(yè)的家具進銷存管理系統(tǒng),使用SSM框架完成該系統(tǒng)控制層、業(yè)務邏輯層和持久層的功能,并達到松散耦合的目的。系統(tǒng)完成了相關的業(yè)務功能,達到了企業(yè)實際應用的要求。通過實踐表明,本文所使用的整合架構能夠提高Java EE 系統(tǒng)的開發(fā)效率和可維護性。