手机进销存系统/供应链管理系统
花了將近兩個月的時間學習了一個企業級進銷存項目,已經結束了兩周多,現在終于有時間來對這個項目的學習做個總結了!
一、首先介紹下這個項目
(注:本人目前大三,專業為信息管理,與編程沾邊不多。而我對編程很感興趣,從大一下期開始主要通過看書和視頻自學學習java編程!)。
項目名稱:手機進銷存系統(Mobile SCM)
主要開發技術:Struts2+Spring+ibatis+jQuery
數據庫:MySql5.1(Navicat客戶端管理工具)
服務器:tomcat7.0
建模工具:ER/Studio
運行系統:Linux
其他技術:報表應用iReport+jasperReport技術,應用jxl進行excel導出。
項目介紹(視頻原話):本系統由某手機貿易企業定制開發,合同價格9.8萬元,開發周期3個月,5人開發完成。本系統既具有一般進銷存系統功能,又有客戶獨有的需求,通過學習本課程,可以全面了解進銷存類項目。
視頻評價:
①.這是我在網上找的一套視頻教程,總共80集,每集60分鐘左右(需要很大的耐心啊!)。項目有點老,大概是12年左右錄制的,但是學到的東西很多。
②.這是我看的視頻中總時間最長的一套視頻了,雖然有80集之多,但仍有很多模塊功能的實現沒有在視頻中展現出來。但是,這套視頻已經把該講的都講了,而且講的很全面,學到了很多東西。
③.這套視頻是基于現有的、企業實際在使用的系統來講解,從售前的與客戶溝通->開發階段->售后維護階段,讓我了解到了公司項目開發流程。不過這套視頻的著重點是在開發階段,主要講解了系統設計、建模工具的使用、主要模塊功能實現等;像與客戶溝通、具體參與項目需求分析、團隊分工合作等還是得工作后具體參與其中才能真正有所體會。
④.視頻講解的內容也非常詳細,就一個功能而言,詳細地講解了JS,頁面構成,代碼編寫,文件配置等等,所以也能學到很多細節性的東西,某些內容會在后面寫出來。作為一個開發人員,最主要的是需要了解項目的需求,根據需求來完成代碼的編寫。
實際學習:
①.首先,視頻中的持久層框架使用的是iBatis,我因為在學習這套視頻之前不久剛學習過了MyBatis框架,所以將iBatis換成了MyBatis,ibatis、mybatis和hibernate后面會具體說一說。總的來說,框架的使用感覺是非常簡單的,在此之前就已經學習過了S2SH(Struts2+Spring+Hibernate),SSM(SpringMVC+Spring+MyBatis),學框架就是學配置!。
②.在實際學習時,視頻中講解系統設計等內容時是跟著視頻認真聽的,涉及到代碼的編寫等內容大部分是先了解模塊功能的需求后,先自行編寫代碼實現功能后再快進地看視頻,代碼編寫相對簡單,主要還是業務需求。代碼寫多了之后會發現(剛剛統計了下代碼量<僅統計了.java和.jsp>,到現在為止,已超過11W行啦(∩_∩)),無非就是增刪改查,要說難一點的就是將需求轉換為邏輯實現。
③.因為是練習,加上學校時間也比較緊,實際編寫代碼時,部分類似于表單驗證的就沒有具體做了;到后面部分模塊也沒有具體去實現了,因為基本都是些重復的工作了,在以前的學習和項目中代碼寫得夠多的啦~\(≧▽≦)/~,而且視頻總的來說也只實現了一半不到的功能,因為視頻講的非常詳細,所以想要80集講完所有功能不可能,也沒有必要!!
④.因為講得很詳細,所以學到了以前很多沒注意到的細節;在學習這套視頻的同時,一方面學到了很多新知識,類似于建模工具ER/Studio的使用;另一方面也復習了以前的知識,并更加熟練地加以運用。在這期間,有些新的知識點或者解決的問題寫了幾篇新的博客(可以看之前的博客),有些則會在接下來的篇幅中進行總結!
?
二、項目相關截圖展示
1.登錄頁面
?2.首頁
?3.功能展示
菜單管理
權限管理
供應商業務
?
4.虛擬機運行效果(Linux)
?5.工程目錄結構
?6.項目相關文件
?
?三、項目學習總結
?1.進銷存系統概述
?進銷存系統也稱作供應鏈管理系統(Supply Chain Management, SCM)。SCM基本內容:計劃(決策管理層,主要體現在報表上)、采購、[制造(跟生產有關的企業)]、庫存、銷售、退換貨管理。SCM總體為兩大流程:物品流、財務流。
?百度百科解釋:進銷存系統是對企業生產經營中進貨、出貨、批發銷售、付款等進行全程跟蹤管理,從接獲訂單合同開始,進入物料采購、入庫、領用到產品完工入庫、交貨、回收貨款、支付原材料款等,每一步都為您提供詳盡準確的數據。有效輔助企業解決業務管 ?理、分銷管理、存 ?貨管理、營銷計劃的執行和監控、統計信息的收集等方面的業務問題。
?系統總流程圖:
?
?2.項目組成員及分工(企業開發):我想剛進公司的新人則處于開發工程師這個階段,然后一步步往上走!
?項目經理(PM):與客戶溝通、進度、成本、質量的控制、資源(人力資源)協調等。
?系統分析師(SA)[架構設計師/技術經理]:技術帶頭人,需求分析、架構設計、指導開發、重要功能開發等。
?開發工程師(SE):具體模塊的設計與實現。
?測試工程師(Test Engineer):測試用例編寫、執行測試提交BUG列表。
?3.項目開發流程
?需求分析 -> 系統設計 -> 開發 -> 測試 -> 實施及試運行 -> 客戶培訓 -> 維護
?項目開發流程圖:
?4.系統設計主要工作內容:
?①分析需求、了解環境及限制等
?②總體設計、完成子系統劃分,并確定子系統間關聯及通信方式
?③對每個子系統進行模塊及子模塊劃分,并確定之間關聯
?④每個模塊輸入、處理流程、輸出
?⑤設計數據結構
?⑥設計用戶界面
?⑦完成《概要設計說明書》
5.概要設計說明書(主要內容參考《概要設計說明書主要的內容.doc》)
概要設計的目的就是希望一個從來沒有接觸過的人一看就能從各個方面都對系統的作用,功能,實現方面有一個大概的了解,并為以后的各類詳細設計文檔提供一個指引和方向。
6.《需求規格說明書》作用及主要內容(可具體參考《LSD-軟件需求規格說明書.doc》)
作用:
①項目組成員、測試人員、公司審核部門的一個參照標準
②客戶驗收標準
主要內容:
①標題、編號、版本、作者、時間等信息
②變更記錄
③項目概況、編寫目的、目標讀者、系統用戶與環境等
④系統模塊、總流程圖等
⑤功能性需求
⑥性能性需求
7.模塊設計
①分析模塊流程
②根據需求確定輸入、輸出及處理邏輯
③設計用戶界面
④面向對象的設計方法[UML(統一建模語言),時序圖,狀態圖,類圖等]
⑤以數據為中心的設計方法(數據建模)
8.MVC與分層設計(具體可網上查閱)
①MVC(Model-View-Controller):MVC是一種架構型模式,它本身并不引入新的功能,只是用來指導我們改善應用程序的架構,使得應用的模型和視圖相分離,從而達到更好的開發和維護效率。在MVC模式中,應用程序被劃分成模型(Model)、視圖(View)和控制器(Controller)三個部分。其中,模型部分包含了應用程序的業務邏輯和業務數據;視圖部分封裝了應用程序的輸出形式(頁面、界面);而控制器部分負責協調模型和視圖,根據用戶請求來選擇要調用哪個模型來處理業務,以及最終由哪個視圖為用戶做出應答。MVC模式的這三個部分的職責非常明確,而且相互分離,每個部分都可以獨立的改變而不影響其他部分,大大提高了應用的靈活性和重用性。
②為什么分層:便于重用、維護。
③三層結構及各層次的結構:業務邏輯層(Service):不要出現直接的數據訪問;傳進來一組數據,根據傳進來的參數和業務邏輯的要求把業務邏輯實現,最后把要顯示的數據傳遞出去。業務邏輯層是重用性最高的一層,是核心。
④這里想說一下Struts2的MVC:推薦一篇博客:Struts2與MVC基礎入門
9.ER/Studio(專業的數據建模工具):
ERStudio:ERStudio是優秀的數據庫建模軟件,它不僅可以建立表、視圖等模型,還可以建立多表間各種關系的模型,另外還可以根據模型生成表到數據庫。
使用體會:在這次的學習中,使用頻率較多的一個軟件就是ERStudio了。在此之前每次做項目時,因為數據量都比較小,基本10張表左右,因此都沒有使用過建模工具,一個初步的分析后就開始直接建表;之前一直會遇到的問題是在開發中對表結構的修改是比較麻煩的,就算只有10張表左右,比如修改了某張表名后,與其相關聯的表都要去修改,比較麻煩;而且很難看出表與表之間的聯系,容易遺漏東西。而在這種中大型項目中(在這個項目中只做了三個模塊就已經有30張表了),如果沒有提前進行一個好的表結構設計的話,對后面的維護將是災難性的。所以如果有一個好的建模工具就可以解決這些問題了。
表關聯設計:如果我們對數據庫擁有完全的控制權限,創建數據庫時,可以不用考慮表之間的關聯,因為數據庫維護關聯關系會消耗一定的資源。我們可以通過程序來維護即可。
可以看看下圖使用ERStudio建立的邏輯模型:我們可以通過圖形界面很清晰的了解模塊劃分、表結構、表之間的關聯(這里并沒有很嚴謹的設計表之間的關聯,主要通過程序來維護)等等。我們如果需要臨時修改一個字段或是關聯關系等,可以很容易的修改。而且最方便的是可以直接將該邏輯模型生成物理模型并導出sql文件,直接導入數據庫就可以使用了。ERStudio連上數據庫后,還可以把數據庫中的表拉到可視化建模界面顯示,表與表之間的聯系能夠清晰地展現出來。
10.編碼的一些技巧
①可直接使用Spring的字符編碼過濾器來設置UTF-8格式,雖然以前學過,但在實際使用時就忘了Spring還有這個功能,每次都是自己建立一個過濾器來設置字符編碼。
1 <filter> 2 <filter-name>CharacterEncodingFilter</filter-name> 3 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>UTF-8</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping> 10 <filter-name>CharacterEncodingFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>②寫一個系統初始化類實現ServletContextListener來加載系統初始化需要的數據以及啟動一個定時器來定時清除系統日志等功能。系統公用的東西(如系統標題)可寫在配置文件里,系統初始化時就加載進來。
③系統用戶表一般會設置一個用戶狀態,如啟動,停用,刪除等狀態。一般來說,刪除用戶不會真正刪除用戶信息,而是設置其狀態為刪除狀態。角色也是一樣,會有一個狀態信息,如果停用了就要禁止該角色下的權限。
④如果我們對數據庫擁有完全的控制權限,創建數據庫時,可以不用考慮表之間的關聯,因為數據庫維護關聯關系會消耗一定的資源。我們可以通過程序來維護即可。
⑤權限系統獨立出來成一個模塊或項目,以方便以后可以重用。
⑥寫一個BaseAction來放置一些常用的request,resposne等等,其它的action類如果要用到這些資源可以直接繼承BaseAction。
?
⑦利用好struts的標簽庫。<%@ taglib uri="/struts-tags" prefix="s"%>
?可以用其來按需求顯示某些數據或者模塊。比如:<s:if test=" ">...</s:if> ?<s:elseif test=" ">...</s:elseif>
?以及利用好c標簽來做頁面的一些判斷處理。比如:<c:choose><c:when test="${status.first}">...</c:when><c:otherwise>...</c:otherwise></c:choose>
1 <c:url value="${ctx}/mobileBasic_delete.action" var="delUrl"> 2 <c:param name="table" value="basic_config"></c:param> 3 <c:param name="id" value="${config.id}"></c:param> 4 </c:url> 5 <a href="${delUrl}" onclick="return confirm('確定要刪除嗎?');">刪除</a> 6 //這種方式也可以對中文進行編碼⑧測試的時候記得經常清空瀏覽器緩存(尤其是js文件更改后),否則某些數據一直測試不正常。以及,測試的時候個人覺得最好還是用火狐瀏覽器,用好火狐的firebug能節省很多時間。
⑨以前一般點擊某些功能簡單的按鈕時,會用js來實現。現在才意識到還可以這樣:
例如使用input按鈕來簡單跳轉頁面:<input type="button" class="btn cancel" value="取消" οnclick="location='menu_menuDetail.action?menu.id=${menu.id}'"/>
⑩不要忘了可以自定義標簽來處理某些問題,代替某些js代碼以及<%= %>。與jsp頁面整體統一。自定義標簽一是可以自定義類繼承SimpleTagSupport,在doTag方法里實現邏輯處理,此種方式需要在xml中配置tag。另一種方式是在靜態類中寫一個靜態方法處理邏輯,此種方式需要在xml中配置function,前臺的書寫方式則是:${my:dateFormat(beginDate)}
可參考個人博客:JSP自定義標簽/自定義標簽打包
以及,自定義注解、自定義攔截器、自定義標簽等配合使用能更方便的編程。
?字符串處理時,StringBuilder速度更快,但是線程不安全的。SringBuffer是線程安全的,速度相比較慢。
?在類似于easyui這類框架下,我們點擊菜單按鈕跳轉的頁面往往是跳轉到一個iframe中,但如果有這么一個業務需求:修改密碼/退出系統,需要返回到首頁,但如果直接讓struts的result跳轉到首頁時,首頁則顯示到iframe中了,我們的需求是整個窗口刷新。這里有三種方法:
⑴js獲取該按鈕,利用ajax來實現,在action中處理后,返回時利用window.top.location = “”; 即可。
⑵使用一個臨時頁面,result配置轉到該頁面后,立即跳轉。
⑶還有一種則是,臨時生成一個腳本代碼跳轉:這種方式就非常簡單了,以前怎么就沒想到呢,反正都是通過js來跳轉。
out.print(“<script type=’text/javascript’>top.location=index.action</script>”);
out.close();
?注銷與退出系統的區別:注銷系統:清除用戶信息,返回首頁;退出系統:清除用戶信息,關閉瀏覽器。
?利用mybatis-generator自動生成javabean,sqlMap,dao等,就像利用HIbernate反向生成一樣。我們使用建模工具建好邏輯模型后,生成物理模型,導出sql文件,再導入數據庫,然后利用這個插件就可以自動生成javabean,sqlMap,dao等,極其方便。具體怎么安裝插件和使用,這里給出一個百度鏈接:mybatis generator eclipse插件的安裝
?日期:我們選擇日期如2016-05-03 這個代表的是5月3日0時,即5月2日一整天,所以邏輯上我們如果獲取5月3日的數據時,還需要加上一天的時間。
?使用Navicat查詢創建工具完成復雜SQL構建:
?項目完成后可以將工具類留存。
?
11.遇到的一些小問題
①mybatis聯合查詢(association)的配置問題及某些細節:查看個人博客:MyBatis關聯查詢 (association) 時遇到的某些問題/mybatis映射
②一次偶然的斷網條件下,啟動系統發現報了如下錯誤:
1 DEBUG - Loaded schema mappings: {http://mybatis.org/schema/mybatis-spring-1.2.xsd=org/mybatis/spring/config/mybatis-spring-1.2.xsd, 2 http://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd, 3 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd=org/springframework/web/servlet/config/spring-mvc-3.1.xsd, 4 ....................................網上查了下,原因是斷網后,applicationContext.xml配置文件中指定的xsd文件讀取不到了——也就是說xsd每次都是從網上讀取的?
當然這是不怎么可取的,具體解決辦法參考這個博客:Spring如何加載XSD文件。我這里出錯的原因是版本不一致導致的。
③一定要將action配置@Scope(value="prototype"),配置成原型模式的,否則就算你重定向也會有意向不到的問題,會將原來的數據帶到新的頁面去。
④MyBatis的<foreach ></foreach>標簽:
當collection為List<Map<String,Object>>的時候,而且我們要使用map的key和value,如下使用item:
<foreach collection="mapList" item="item" separator=",">
(#{item.key},#{item.value})
</foreach>
當遍歷的集合collection為Map<String, Object>時,要使用key和value,如下使用:
<foreach collection="map" index="key" item="value" separator=",">
(#{key},#{roleId},#{value})
</foreach>
⑤登出系統時,要清空session所有信息。request.getSession().invalidate();//注:此處必須使用原始的session,不能使用框架的Map<> session,那只是個映射.
⑥表單設置為disabled="disabled"時,將無法提交該表單數據,可以設置為readonly
<input type="text" readonly="readonly" name="supplier.id" value="${supplier.id}"/>
⑦Jstl標簽可以用在js中,但只能在jsp文件的js中,外部js文件不可用。
1 <c:forEach items="${mobileTypeList}" var="mobType"> 2 if("${mobType.id}" == mobileTypeId){ 3 $("#refPrice").html("¥${mobType.buyPrice}"); 4 } 5 </c:forEach>?
12.關于JSON使用的一些問題
①從服務端返回的json格式數據 鍵/值都必須用雙引號(無論是json文件,還是json數據),不要用單引號,否則會出現一些意想不到的問題,像數據解析不正確等。
看官網的說明:
正確格式:JSON數據格式
?②Spring的json插件:
以前一直都是使用JSONObject,JSONArray來得到json格式數據。這次發現還可以直接添加一個json插件,就可以很輕松的返回json數據了。
步奏:
⑴添加struts2-json-plugin-2.3.28.jar包
⑵修改配置文件(注意綠色的地方)
1 <package name="dev" namespace="/" extends="json-default"> 2 <action name="menu_*" class="menuAction" method="{1}"> 3 <result name="menuTree" type="json"></result> 4 </action> 5 </package>⑶Action中將要轉化成json的數據放在全局中(成員變量)。不必在方法內像JSONObject那樣轉成字符串再輸出。
//使用JSONObject轉換數據 JSONObject jsonObject = new JSONObject(); //將data轉換為json格式數據 String result = jsonObject.fromObject(data).toString(); //返回 response.write(result);⑷在前臺獲取的時候,注意需要從data里面取出來,因為此時的data中可能包含多個數據:
function(data){
?? var json= [data.key];
}
⑸插件原理:在返回到前臺時,框架會自動將有get方法的成員變量轉換成json格式數據返回(所以在action中不要將具體邏輯方法名帶get,還有Action中的service成員也不要設置get方法,否則極容易出錯。如果非要帶get,可以在這個方法上加注解;@JSON(serialize=false),使其不要序列化,就不會轉成json了)。
這種插件方式比使用JSONObject雖然更方便,但不容易控制,JSONObject可以控制具體輸出的類容。
1 JSONObject jsonObject = new JSONObject(); 2 //json配置 3 JsonConfig config = new JsonConfig(); 4 //設置需要過濾掉的字段 5 config.setExcludes(new String[]{"subMenuList"}); 6 //得到json數據 7 String result = jsonObject.fromObject(menuTree, config).toString();而且使用JsonConfig可以注冊轉換器,比如將Date對象轉換成字符串。
注冊轉換器:config.registerDefaultValueProcessor(target, defaultValueProcessor);
13.switch…case…
變量的使用:
?
switch(此處數據類型):switch后面的括號里面只能放int(byte,short,char)類型和String類型的數據
case后的數據類型不能為Integer:
?
14.MyBatis、iBatis、Hibernate:具體區別百度
ibatis:半自動ORM框架,需手動寫sql語句;開發效率相對于hibernate較低,但是更靈活,適應性更廣泛(在企業開發中,我們可能不能完全去控制數據庫結構 );
mybatis:MyBatis 最強大的特性之一就是它的動態語句功能。其前身就是ibatis。
Hibernate:由hibernate自動生成sql語句;hibernate則需要在符合一定規范(如數據庫結構必須規范)下才能發揮它的最大效用。
15.mybatis緩存:默認情況下是沒有開啟緩存的,除了局部的 session 緩存(一級緩存),可以增強變現而且處理循環依賴也是必須的。要開啟二級緩存,需要在你的 SQL 映射文件中添加一行:<cache/>
?
?
四、項目相關資料
項目打包文件:手機進銷存系統
視頻分享:北風網-手機進銷存系統?
注意所有視頻及資料僅供學習使用!!!
然后,說一下此時此刻的感受,通過自學學習的東西雖然有點多,但也比較雜,不能形成一套系統性的知識鏈;而且,越是到后面就越不想再學下去,主要是現在所學的東西沒能有地方使用,有點類似于一身武藝沒有用武之地的感覺。以前一直礙于學校的課程和其它的瑣事沒有找工作,雖然有做過一些課程上的小項目,但都不能滿足我。大三馬上就結束了,所以還是盡快找個工作,也只有在工作中才能用我所學,也能學到更多新東西,學習才更有動力、更有激情!
?
轉載于:https://www.cnblogs.com/chiangchou/p/project-mobilescm.html
總結
以上是生活随笔為你收集整理的手机进销存系统/供应链管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程的单元测试工具 - GroboUt
- 下一篇: Stream学习过程中遇到的一个问题记录