Java開發進銷存管理系統(三)

Java團長_發表於2018-11-26

五、資料庫與實體設計

  

在開始開發一個系統之前,首先需要做的就是根據需求分析設計系統的實體物件以及對應的資料庫表結構,這是開發的基礎。

  

根據前面的需求分析設計的功能模組,實體物件可以分為5個模組,分別是系統模組(system)、基礎模組(base)、採購模組(purchase)、銷售模組(sale)、庫存模組(stock)。下面是實體清單:

  640

  

有了清單之後,利用PowerDesigner進行資料庫物理模型設計。由於擁有對資料庫的完全控制權,所以不對錶設定約束,所有的約束在程式程式碼中進行控制。下面列出各個實體的屬性即對應的表,具體可參考《資料庫物理模型.pdm》。物理模型設計完成後,建立名為gpss的資料庫,然後建立各個表。

  

資料庫模型:

  640


六、系統功能實現


1. 建立工程

  

需求分析做完了,技術沒問題,底層架構也設計好了,資料庫設計好了,前面的所有準備工作做完了,下面就要進行燃氣管進銷存系統的編碼實現了。首先要做的工作就是建立工程,專案名擬為gpss,即燃氣管進銷存(Gas Purchase Sale Stock)的縮寫,工程名則為lyyzoo-gpss。

  

在IDEA中建立lyyzoo-gpss的maven工程,繼承lyyzoo。同時,在lyyzoo-gpss下建立兩個子模組,分別為lyyzoo-gpss-base和lyyzoo-gpss-web,base模組包含了系統的dao、entity、service等層次,主要為java檔案;web則包含了controller層、jsp、js等web相關資原始檔。

  

lyyzoo-gpss目錄結構:


  640

  

lyyzoo-gpss > pom.xml:


1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

3   <modelVersion>4.0.0</modelVersion>
4   <parent>
5     <groupId>com.lyyzoo</groupId>
6     <artifactId>lyyzoo</artifactId>
7     <version>1.0-SNAPSHOT</version>
8   </parent>
9   <groupId>com.lyyzoo.gpss</groupId>
10   <artifactId>lyyzoo-gpss</artifactId>
11   <name>lyyzoo :: gpss</name>
12   <packaging>pom</packaging>
13
14   <modules>
15     <module>lyyzoo-gpss-base</module>
16     <module>lyyzoo-gpss-web</module>
17   </modules>
18
19   <profiles>
20     <!-- 開發環境 -->
21     <profile>
22       <id>dev</id>
23       <activation>
24         <property>
25           <name>env</name>
26           <value>dev</value>
27         </property>
28       </activation>
29     </profile>
30     <!-- 線上環境 -->
31     <profile>
32       <id>online</id>
33       <activation>
34         <property>
35           <name>env</name>
36           <value>online</value>
37         </property>
38       </activation>
39     </profile>
40   </profiles>
41   <build>
42     <plugins>
43       <plugin>
44         <groupId>com.juvenxu.portable-config-maven-plugin</groupId>
45         <artifactId>portable-config-maven-plugin</artifactId>
46         <version>1.1.5</version>
47         <executions>
48           <execution>
49             <goals>
50               <goal>replace-package</goal>
51             </goals>
52           </execution>
53         </executions>
54         <configuration>
55           <portableConfig>src/main/resources/portable/config-${env}.xml</portableConfig>
56         </configuration>
57       </plugin>
58     </plugins>
59   </build>
60
61 </project>


lyyzoo-gpss-base主要是dao層、service層、model層的整合,所以需要依賴於底層lyyzoo-starter-jpa、lyyzoo-starter-web。

  

lyyzoo-gpss-base > pom.xml:


1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

3     <modelVersion>4.0.0</modelVersion>
4     <parent>
5         <groupId>com.lyyzoo.gpss</groupId>
6         <artifactId>lyyzoo-gpss</artifactId>
7         <version>1.0-SNAPSHOT</version>
8     </parent>
9     <artifactId>lyyzoo-gpss-base</artifactId>
10     <name>lyyzoo :: gpss :: base</name>
11     <packaging>jar</packaging>
12
13     <dependencies>
14         <dependency>
15             <groupId>com.lyyzoo</groupId>
16             <artifactId>lyyzoo-starter-jpa</artifactId>
17         </dependency>
18         <dependency>
19             <groupId>com.lyyzoo</groupId>
20             <artifactId>lyyzoo-starter-web</artifactId>
21         </dependency>
22     </dependencies>
23
24 </project>


lyyzoo-gpss-web是web相關,是controller層所在。依賴於lyyzoo-gpss-base、lyyzoo-starter-base等。

  

lyyzoo-gpss-web > pom.xml:


1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

3     <modelVersion>4.0.0</modelVersion>
4     <parent>
5         <groupId>com.lyyzoo.gpss</groupId>
6         <artifactId>lyyzoo-gpss</artifactId>
7         <version>1.0-SNAPSHOT</version>
8     </parent>
9     <artifactId>lyyzoo-gpss-web</artifactId>
10     <name>lyyzoo :: gpss :: web</name>
11     <packaging>war</packaging>
12
13     <dependencies>
14         <dependency>
15             <groupId>com.lyyzoo.gpss</groupId>
16             <artifactId>lyyzoo-gpss-base</artifactId>
17             <version>${project.version}</version>
18         </dependency>
19         <dependency>
20             <groupId>com.lyyzoo</groupId>
21             <artifactId>lyyzoo-starter-base</artifactId>
22         </dependency>
23         <dependency>
24             <groupId>com.lyyzoo</groupId>
25             <artifactId>lyyzoo-starter-jpa</artifactId>
26         </dependency>
27         <dependency>
28             <groupId>com.lyyzoo</groupId>
29             <artifactId>lyyzoo-starter-web</artifactId>
30         </dependency>
31         <dependency>
32             <groupId>com.lyyzoo</groupId>
33             <artifactId>lyyzoo-starter-test</artifactId>
34         </dependency>
35
36
37     </dependencies>
38
39
40     <build>
41         <finalName>gpss</finalName>
42         <outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
43     </build>
44
45 </project>


2. 系統配置

  

工程建好後,首要要做的就是系統的配置工作了,如web.xml,這應該算是web專案的起點了。進入lyyzoo-gpss-web/src/main/webapp/WEB-INF/web.xml,進行web的配置,主要的一些配置有載入系統的配置檔案、Spring、字元過濾器、SpringMVC等配置。

  

一些基礎的配置如下:


1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

6          version="3.0">

7
8   <display-name>lyyzoo :: gpss</display-name>
9
10   <!-- 載入配置檔案 -->
11   <context-param>
12     <param-name>contextConfigLocation</param-name>
13     <param-value>classpath*:/spring/spring-base*.xml</param-value>
14   </context-param>
15
16   <!-- Spring -->
17   <listener>
18     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
19   </listener>
20
21   <!-- 編碼過濾器 -->
22   <filter>
23     <filter-name>encodingFilter</filter-name>
24     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
25     <init-param>
26       <param-name>encoding</param-name>
27       <param-value>UTF-8</param-value>
28     </init-param>
29     <init-param>
30       <param-name>forceEncoding</param-name>
31       <param-value>true</param-value>
32     </init-param>
33   </filter>
34   <filter-mapping>
35     <filter-name>encodingFilter</filter-name>
36     <url-pattern>/*</url-pattern>
37   </filter-mapping>
38
39   <!-- 訪問控制 -->
40   <filter>
41     <filter-name>VisitFilter</filter-name>
42     <filter-class>com.lyyzoo.gpss.filter.VisitFilter</filter-class>
43   </filter>
44   <filter-mapping>
45     <filter-name>VisitFilter</filter-name>
46     <url-pattern>/admin/*</url-pattern>
47   </filter-mapping>
48
49   <!-- Spring MVC -->
50   <servlet>
51     <servlet-name>SpringMVC</servlet-name>
52     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
53     <init-param>
54       <param-name>contextConfigLocation</param-name>
55       <param-value>classpath*:/spring/spring-web*.xml</param-value>
56     </init-param>
57     <load-on-startup>1</load-on-startup>
58   </servlet>
59   <servlet-mapping>
60     <servlet-name>SpringMVC</servlet-name>
61     <url-pattern>/</url-pattern>
62   </servlet-mapping>
63
64   <!-- 錯誤頁面 -->
65   <error-page>
66     <error-code>404</error-code>
67     <location>/error/404</location>
68   </error-page>
69   <error-page>
70     <error-code>500</error-code>
71     <location>/error/500</location>
72   </error-page>
73   <error-page>
74     <exception-type>java.lang.Throwable</exception-type>
75     <location>/error/500</location>
76   </error-page>
77
78   <!-- 首頁 -->
79   <welcome-file-list>
80     <welcome-file>/</welcome-file>
81   </welcome-file-list>
82
83 </web-app>


接著,配置系統將會用到的一些屬性,如JDBC驅動、資料庫使用者名稱和密碼等。在lyyzoo-gpss-web/src/main/resources/config下,建立config.properties配置檔案,這個配置檔案中的屬性將會被底層spring配置的檔案所引用。

  

比如JDBC的屬性:


1 ####################################
2 #            DATABASE
3 ####################################
4 # local_db
5 jdbc.driver=net.sf.log4jdbc.DriverSpy
6 jdbc.url=jdbc:log4jdbc:mysql://localhost:3306/gpss?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
7 jdbc.username=root
8 jdbc.password=root
9
10 # 初始化連線
11 c3p0.initialPoolSize=5
12 # 連線池保留最小連線數
13 c3p0.minPoolSize=5
14 # 連線池保留最大連線數
15 c3p0.maxPoolSize=15
16 # 最大空閒時間
17 c3p0.maxIdleTime=600
18
19 #hibernate
20 hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
21 hibernate.show.sql=false
22 hibernate.hbm2ddl.auto=update


但是上面的配置只是本機的一個開發環境,如果我將專案釋出到生產環境,那就至少需要重新修改資料庫地址、使用者名稱和密碼。這樣是比較麻煩的,所以,在lyyzoo-gpss-web/src/main/portable下建立兩個xml檔案,分別為開發環境和生產環境的:config-dev.xml和config-online.xml。

  

config-online.xml:


1 <?xml version="1.0" encoding="utf-8" ?>
2
3 <portable-config>
4     <config-file path="WEB-INF/classes/config/config.properties">
5
6         <!-- JDBC -->
7         <replace key="jdbc.driver"><![CDATA[com.mysql.jdbc.Driver]]></replace>
8         <replace key="jdbc.url"><![CDATA[jdbc:mysql://192.168.1.91:30112/fff2f025c2b04?useUnicode=true&characterEncoding=utf-8]]></replace>
9         <replace key="jdbc.username">a6564a1169d94</replace>
10         <replace key="jdbc.password">d3e6d1aea5e04</replace>
11
12         <!-- hibernate -->
13         <replace key="hibernate.show.sql">false</replace>
14         <replace key="hibernate.hbm2ddl.auto">none</replace>
15
16         <!-- debug -->
17         <replace key="app.debug">false</replace>
18         <replace key="app.env">online</replace>
19         <replace key="logback.level">INFO</replace>
20         <replace key="jdbc.resultsettable">ERROR</replace>
21
22
23     </config-file>
24 </portable-config>


然後配置一個“不同環境打包”的maven外掛——“portable-config-maven-plugin”,通過該外掛,就可以在打包的時候加上需要打包的環境,例如指定online環境,在打包時就會將config-online.xml中的屬性替換到config.properties裡,這樣一來就不必我們手動去替換了。配置好之後,我們在打包時可以使用命令[mvn clean package –Denv=online]打包線上環境的war包。

  

maven環境配置,在lyyzoo-gpss > pom.xml中配置兩個環境:


1 <profiles>
2   <!-- 開發環境 -->
3   <profile>
4     <id>dev</id>
5     <activation>
6       <property>
7         <name>env</name>
8         <value>dev</value>
9       </property>
10     </activation>
11   </profile>
12   <!-- 線上環境 -->
13   <profile>
14     <id>online</id>
15     <activation>
16       <property>
17         <name>env</name>
18         <value>online</value>
19       </property>
20     </activation>
21   </profile>
22 </profiles>


不同環境打包外掛(portable-config-maven-plugin)的配置:


1 <build>
2   <plugins>
3     <plugin>
4       <groupId>com.juvenxu.portable-config-maven-plugin</groupId>
5       <artifactId>portable-config-maven-plugin</artifactId>
6       <version>1.1.5</version>
7       <executions>
8         <execution>
9           <goals>
10             <goal>replace-package</goal>
11           </goals>
12         </execution>
13       </executions>
14       <configuration>
15         <portableConfig>src/main/resources/portable/config-${env}.xml</portableConfig>
16       </configuration>
17     </plugin>
18   </plugins>
19 </build>


3. 模組分層

  

3.1 lyyzoo-gpss-base

  

工程建好後,建立包的結構。按照一般的分層方式,分為dao層、entity層、service層,同時,每層下按模組劃分為system、base、purchase、sale、stock。然後在entity下根據表設計建立實體類。

  

lyyzoo-gpss-base 目錄結構:

  640

  

3.2 lyyzoo-gpss-web

  

然後是lyyzoo-gpss-web模組,該模組主要是controller層,以及靜態資原始檔、jsp檔案等。com.lyyzoo.gpss.web作為controller層的包,同樣,在web下按系統模組劃分。

  

lyyzoo-gpss-web 目錄結構:

  640

  

3.3 靜態資原始檔

  

lyyzoo-gpss-web/src/main/webapp/static作為靜態檔案的根目錄,static/lib目錄作為三方類庫的根目錄,如ExtJs、jQuery、其它的外掛等。static/css是系統css檔案的根目錄;static/img是圖片的根目錄;static/js是系統js檔案根目錄,/js下同樣按模組劃分。

  

靜態資原始檔目錄結構:


640


3.4 JSP檔案

  

jsp檔案不能直接讓使用者訪問,需要放到/WEB-INF下,與配置的spring檢視解析器相對應,所有的jsp檔案放到/WEB-INF/view目錄下,view目錄下按模組劃分,index.jsp是系統的登入頁面。/WEB-INF/layout/目錄下,將jsp中需要引入的一些資源等做了整合,如ExtJs的檔案、meta描述資訊、taglib等,整合後,jsp中如果需要引入整合jsp即可,可減少很多重複的工作。

  

taglib.jsp中引入了標籤和設定了資源的路徑:


1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2
3 <%-- 引入標籤 --%>
4 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
5 <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
6 <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
7 <%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
8
9 <%-- 資源路徑 --%>
10 <c:set var="CTX" value="${pageContext.request.contextPath}" />
11 <c:set var="STATIC_CTX_URL" value="${CTX}/static" />
12 <c:set var="LIB" value="${STATIC_CTX_URL}/lib" />
13 <c:set var="JS" value="${STATIC_CTX_URL}/js"/>
14 <c:set var="CSS" value="${STATIC_CTX_URL}/css"/>
15 <c:set var="IMG" value="${STATIC_CTX_URL}/img"/>


meta.jsp中主要設定了一些meta描述資訊和ICO圖示:


1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 <%@ include file="/WEB-INF/layout/taglib.jsp" %>
3
4 <meta charset="utf-8">
5 <meta http-equiv="X-UA-Compatible" content="IE=9,chrome=1">
6
7 <meta name="description" content="">
8 <meta name="author" content="">
9 <meta name="renderer" content="webkit">
10 <%-- 圖示 --%>
11 <link type="image/x-icon" href="${IMG}/favicon.ico" rel="icon">


extjs-neptune.jsp則引入了ExtJs相關的css和js檔案,以及jQuery等: 


1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 <%@ include file="/WEB-INF/layout/taglib.jsp" %>
3
4 <link rel="stylesheet" type="text/css" href="${LIB}/ext/4.2.2/theme/ext-theme-neptune/ext-theme-neptune-all.css"/>
5 <link rel="stylesheet" type="text/css" href="${LIB}/ext/4.2.2/icons/icon.css"/>
6
7 <script type="text/javascript" src="${LIB}/ext/4.2.2/ext-all.js"></script>
8 <script type="text/javascript" src="${LIB}/ext/4.2.2/locale/ext-lang-zh_CN.js"></script>
9 <script type="text/javascript" src="${LIB}/jquery/2.1.1/jquery.js"></script>
10 <script type="text/javascript" src="${JS}/Global.js"></script>
11
12 <script type="text/javascript">
13     window.CTX             = "${CTX}";
14     window.STATIC_CTX_URL  = "${STATIC_CTX_URL}";
15     window.LIB             = "${LIB}";
16     window.JS              = "${JS}";
17     window.CSS             = "${CSS}";
18     window.IMG             = "${IMG}";
19
</script>


WEB-INF目錄結構:


  640

  

3.4 登入實現舉例

  

首先建立一個BaseController,BaseController繼承底層的BaseController,增加了HttpSession,以及獲取當前登入使用者的方法,這樣其它的controller繼承該BaseController後,就可以非常方便的獲得當前session和登入使用者了。

  

BaseController程式碼如下:


1 package com.lyyzoo.gpss.web;
2
3 import com.lyyzoo.gpss.entity.system.User;
4 import org.springframework.beans.factory.annotation.Autowired;
5
6 import javax.servlet.http.HttpSession;
7
8 /**
9  *
10  * <p>
11  *
12  * @author bojiangzhou
13  * @date 2017-04-02
14  */

15 public class BaseController extends com.lyyzoo.web.BaseController {
16
17     @Autowired
18     protected HttpSession session;
19
20     public User getCurrentUser(){
21         return (User) session.getAttribute("currentUser");
22     }
23
24     public Long getCurrentUserId(){
25         return getCurrentUser().getId();
26     }
27
28     public String getCurrentUserAccount(){
29         return getCurrentUser().getAccount();
30     }
31
32 }


建立HomeController作為登入和主頁的處理器。主要包含的方法有訪問登入頁面,訪問登入後的主頁,以及登入處理等。Controller需要加上@Controller標註該類為controller,使用@RequestMapping()支援訪問rest形式的地址訪問。HomeController中注入UserService,用於處理使用者登入相關的業務。

  

使用者進入登入介面,jsp頁面以<img src=” ${CTX}/vcode”>的形式請求驗證碼,驗證碼使用工具類生成,以流的形式輸出,生成的驗證碼儲存到session中。使用者輸入登入賬號、密碼和驗證碼登入系統。首先前臺會檢測輸入是否為空等,傳到後臺,從session中取出驗證碼判斷驗證碼是否正確,不正確則重新整理驗證碼並且需要使用者重新輸入驗證碼。驗證碼通過後,使用登入賬號和密碼查詢資料庫,如果有,則將該使用者儲存到session中,跳轉到管理頁面,登入成功。否則提示使用者名稱或密碼錯誤。

  

HomeController程式碼如下:


1 package com.lyyzoo.gpss.web;
 2
 3 import com.lyyzoo.gpss.entity.system.User;
 4 import com.lyyzoo.gpss.service.system.UserService;
 5 import com.lyyzoo.gpss.util.VCodeGenerator;
 6 import com.lyyzoo.util.Cryptos;
 7 import com.lyyzoo.util.Strings;
 8 import org.springframework.beans.BeanUtils;
 9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.stereotype.Controller;
11 import org.springframework.web.bind.annotation.PathVariable;
12 import org.springframework.web.bind.annotation.RequestMapping;
13 import org.springframework.web.bind.annotation.RequestMethod;
14
15 import javax.imageio.ImageIO;
16 import javax.servlet.http.HttpServletResponse;
17 import javax.servlet.http.HttpSession;
18 import java.awt.image.BufferedImage;
19 import java.io.IOException;
20
21 /**
22  * <p>
23  *
24  * @author bojiangzhou
25  * @date 2017-03-29
26  */

27 @Controller
28 @RequestMapping("")
29 public class HomeController extends BaseController {
30
31     @Autowired
32     private UserService userService;
33
34     /**
35      * 到首頁/登入頁面
36      */

37     @RequestMapping(value = {"", "/", "/index", "/login"})
38     public String index(){
39         return "/index";
40     }
41
42     /**
43      * 管理員主頁
44      */

45     @RequestMapping("/admin/home")
46     public String toHome(){
47         return "/home/home";
48     }
49
50     /**
51      * 登入
52      */

53     @RequestMapping(value = "/login", method = RequestMethod.POST)
54     public String login(String account, String password, String vcode, HttpSession session){
55         String redirect = REDIRECT("/login");
56         //基本驗證
57         if(Strings.isNullOrEmpty(account)){
58             session.setAttribute("errorMsg", "賬號必須填寫!");
59             return redirect;
60         }
61         if(Strings.isNullOrEmpty(password)){
62             session.setAttribute("errorMsg", "密碼必須填寫!");
63             return redirect;
64         }
65         if(Strings.isNullOrEmpty(vcode)){
66             session.setAttribute("errorMsg", "驗證碼必須填寫!");
67             return redirect;
68         }
69         //驗證碼
70         String sessionVcode = (String) session.getAttribute("vcode");
71         if(!vcode.equalsIgnoreCase(sessionVcode)){
72             session.setAttribute("errorMsg", "驗證碼錯誤!");
73             return redirect;
74         }
75         //驗證使用者名稱和密碼
76         password = Cryptos.encryptMd5(password);
77         User loginUser = userService.login(account, password);
78         if(loginUser == null){
79             session.setAttribute("errorMsg", "賬號或密碼錯誤!");
80             return redirect;
81         }
82         if(loginUser.getIsLocked() == User.IsLocked.YES){
83             session.setAttribute("errorMsg", "賬號已鎖定,不能登入!");
84             return redirect;
85         }
86
87         //儲存到session的時候清除密碼
88         User currentUser = new User();
89         BeanUtils.copyProperties(loginUser, currentUser);
90         currentUser.setPassword(null);
91
92         //登入成功
93         session.setAttribute("currentUser", currentUser);
94
95         return REDIRECT("/admin/home");
96     }
97
98     /**
99      * 獲取驗證碼
100      */

101     @RequestMapping("/vcode")
102     public void getVCode(HttpSession session, HttpServletResponse response) throws IOException {
103         //建立驗證碼生成器物件
104         VCodeGenerator vcGenerator = new VCodeGenerator();
105         //生成驗證碼
106         String vcode = vcGenerator.generatorVCode();
107         //將驗證碼儲存在session域中,以便判斷驗證碼是否正確
108         session.setAttribute("vcode", vcode);
109         //生成驗證碼圖片
110         BufferedImage vImg = vcGenerator.generatorRotateVCodeImage(vcode, true);
111         //輸出影像
112         ImageIO.write(vImg, "gif", response.getOutputStream());
113     }
114
115     /**
116      * 退出系統
117      */

118     @RequestMapping("/logoff")
119     public String logoff(HttpSession session){
120         session.invalidate();
121         return REDIRECT("/");
122     }
123
124     @RequestMapping("/function")
125     public String function(){
126         return "/home/function";
127     }
128
129     @RequestMapping("/welcome")
130     public String welcome(){
131         return "/home/welcome";
132     }
133
134     /**
135      * 錯誤頁面
136      * @param code
137      * @return
138      */

139     @RequestMapping("/error/{code}")
140     public String error(@PathVariable String code) {
141         return "/error/" + code;
142     }
143
144
145
146 }


UserService中根據使用者名稱和密碼獲取使用者:


1 package com.lyyzoo.gpss.service.system;
2
3 @Service
4 public class UserService extends BaseService<User> {
5     @Autowired
6     private UserDao userDao;
7     /**
8      * 獲取登入使用者
9      */

10     public User login(String account, String password){
11         Map<String, Object> filter = new HashMap<>();
12         filter.put("account", account);
13         filter.put("password", password);
14         filter.put("state", Applications.Flag.YES);
15
16         User loginUser = get(filter);
17         return loginUser;
18     }
19 }


七、系統的除錯與部署


1. 測試

  

系統開發完成後,首先需要在本地整體測試,從登入開始,每個模組,每個功能,每個流程具體的去測試。

  

首先測試如果未登入,使用者是不能訪問管理頁面的,直接在位址列輸入訪問地址看是否跳轉到登入頁面。然後至少測試各個角色相關的賬號登入是否正常,登入後,每個角色擁有的選單是否顯示正常。

  

其它模組的測試,使用各個角色對應的賬號,登入系統,進行相應功能的測試。如管理員進入系統錄入基礎資料,商品資訊、倉庫資訊等。採購管理員錄入供應商資訊,錄入採購訂單,提交稽核。銷售管理員錄入客戶資訊,錄入銷售訂單,提交稽核。庫存管理員稽核採購訂單,稽核通過,則庫存增加;稽核銷售訂單,稽核通過,則庫存減少。檢視庫存資訊,相應的操作之後,庫存量是否正確。測試結果可檢視系統測試截圖。

  

系統容錯性測試,主要是測試輸入一些錯誤的資料型別以及超出範圍的數值測試系統在異常條件下的行為。系統在這方面做得比較好,如果使用者輸入了一些非法的資料,會立即提醒使用者輸入正確的資料。首先會在前臺判斷使用者輸入的資料的合法性、是否必須輸入等,資料傳到後臺後,還會在程式碼裡判斷一次資料是否正確,才會儲存到資料庫。而系統使用的Jdbc也能在一定程度上防止SQL隱碼攻擊等問題。如果系統發生一些無法預測的異常,也會以友好的介面提示使用者,以便技術員及時維護系統。

  

總體來說,整個的測試過程比較順利,也存在一些小問題,就立即修復了。功能全部實現了,該系統能滿足一個基本的進銷存流程,以後也還可以擴充套件。


2. 部署

  

我這裡使用磨泊雲來部署專案,磨泊雲使用簡單且在一定限度內免費,部署測試比較合適。首先在磨泊雲上建立名為gpss的Java應用,接著建立mysql服務,並將其繫結到該java應用,複製資料庫連線到配置檔案中。匯出本地的gpss資料庫,匯入到建立的mysql應用裡。然後在IDEA中使用mvn clean package –Denv=online命令打包線上環境的war包,將war包釋出到磨泊雲上。啟動專案,然後訪問,測試,一些都正常。可訪問域名http://gpss.butterfly.mopaasapp.com/檢視,由於沒處理好ext的相容性問題,建議使用谷歌瀏覽器檢視。後面再學學如何部署到像阿里雲等雲上。


八、github地址


https://github.com/bojiangzhou/lyyzoo-gpss


(完)

相關文章