Java開發進銷存管理系統(三)
五、資料庫與實體設計
在開始開發一個系統之前,首先需要做的就是根據需求分析設計系統的實體物件以及對應的資料庫表結構,這是開發的基礎。
根據前面的需求分析設計的功能模組,實體物件可以分為5個模組,分別是系統模組(system)、基礎模組(base)、採購模組(purchase)、銷售模組(sale)、庫存模組(stock)。下面是實體清單:
有了清單之後,利用PowerDesigner進行資料庫物理模型設計。由於擁有對資料庫的完全控制權,所以不對錶設定約束,所有的約束在程式程式碼中進行控制。下面列出各個實體的屬性即對應的表,具體可參考《資料庫物理模型.pdm》。物理模型設計完成後,建立名為gpss的資料庫,然後建立各個表。
資料庫模型:
六、系統功能實現
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目錄結構:
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 目錄結構:
3.2 lyyzoo-gpss-web
然後是lyyzoo-gpss-web模組,該模組主要是controller層,以及靜態資原始檔、jsp檔案等。com.lyyzoo.gpss.web作為controller層的包,同樣,在web下按系統模組劃分。
lyyzoo-gpss-web 目錄結構:
3.3 靜態資原始檔
lyyzoo-gpss-web/src/main/webapp/static作為靜態檔案的根目錄,static/lib目錄作為三方類庫的根目錄,如ExtJs、jQuery、其它的外掛等。static/css是系統css檔案的根目錄;static/img是圖片的根目錄;static/js是系統js檔案根目錄,/js下同樣按模組劃分。
靜態資原始檔目錄結構:
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目錄結構:
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
(完)
相關文章
- Java開發進銷存管理系統Java
- Java開發進銷存管理系統(二)Java
- 進銷存軟體ERP管理系統開發搭建
- 企業管理系統庫存管理軟體進銷存系統協同辦公系統二次開發
- (javaweb)超市管理系統(商品進銷存系統)JavaWeb
- 基於SSM開發的企業進存銷系統 JAVA MySQLSSMJavaMySql
- wms倉庫管理系統,php進銷存系統PHP
- 進銷存管理系統能解決哪些問題?
- 超市管理系統原始碼 超市進銷存管理系統原始碼 (CS架構)原始碼架構
- 進銷存系統搭建流程
- 客戶管理系統SAAS應用行業軟體系統進銷存CRM管理系統行業
- 簡易進銷存CRM系統
- java 進銷存 銷售報表 庫存管理 商戶管理 springmvc SSM crm 專案JavaSpringMVCSSM
- 基於Java的SSH的超市進銷存管理系統(原始碼+資料庫+論文)Java原始碼資料庫
- 基於java的陶瓷工廠進銷存管理系統的設計與實現Java
- 中小企業如何有效管理進銷存?ERP系統有何作用?
- 條碼追溯系統解決外貿企業進銷存管理
- 進銷存軟體|雲ERP倉庫管理系統軟體原始碼開源可掃碼原始碼
- Java SSM 商戶 管理系統 客戶管理 庫存管理 銷售報表 專案原始碼JavaSSM原始碼
- ERP管理系統是如何進行倉庫管理的呢?ERP管理系統開發
- 微商分銷管理系統開發解決方案
- 這4個行業用進銷存管理系統是肯定不會錯的行業
- Known框架實戰演練——進銷存系統需求框架
- java版工程專案管理系統原始碼+系統管理+系統設定+二次開發Java專案管理原始碼
- java版工程專案管理系統原始碼+系統管理+系統設定+專案管理+合同管理+二次開發Java專案管理原始碼
- 企業工程專案管理系統+spring cloud 系統管理+java 系統設定+二次開發專案管理SpringCloudJava
- 銷售crm客戶管理系統:怎麼進行客戶管理?
- 汽車銷售管理系統(java web)原始碼JavaWeb原始碼
- 基於java jsp的倉庫庫存管理系統JavaJS
- 數商雲分銷管理系統開發,解決傳統企業運營分銷商城系統難點
- (三)Java高併發秒殺系統API之Web層開發JavaAPIWeb
- java crm 進銷存 模組設計方案Java
- 校園圖書管理系統開發-中小學智慧圖書管理系統開發
- pms酒店管理系統功能,酒店管理系統軟體開發
- 中小企業進銷存辦理軟體管理
- 如何透過CRM系統進行銷售機會管理?
- 三軌直銷系統
- 進銷存系統能給企業帶來什麼好處?