基于java 企业进销存管理系统设计(含源文件)
歡迎添加微信互相交流學(xué)習(xí)哦!
項目源碼:https://gitee.com/oklongmm/biye
?企業(yè)進銷存管理系統(tǒng)
?
摘要
【摘要】
進銷存管理系統(tǒng)是一個基于Internet的應(yīng)用系統(tǒng),它是一個面對當前的進銷存管理工作基本還處于手工和半信息自動化處理狀態(tài)而應(yīng)運而生的一個基于Internet的一個完全信息自動化的系統(tǒng),整個系統(tǒng)從符合操作簡便、界面友好、靈活、實用、安全的要求出發(fā),完成進貨、銷售、庫存管理的全過程。
企業(yè)單位只需具備訪問Internet的條件即可在系統(tǒng)發(fā)布的站點上進行進銷存的管理。在圖型化的人機界面中完成日常的進銷存管理工作.一方面擺脫了時間和空間的限制,另一方面有效的解決的數(shù)據(jù)共享的問題。
經(jīng)過實際使用證明,本文所設(shè)計的企業(yè)進銷存管理系統(tǒng)可以滿足企業(yè)進貨、銷售管理方面的需要。
【關(guān)鍵詞】庫存 銷售 企業(yè)進銷存管理系統(tǒng)
?
目錄
摘要?? ?1
0 ?引言?? ?1
1 ?系統(tǒng)分析?? ?2
1.1 ?需求分析?? ?2
1.2 ?可行性分析?? ?2
2 ?總體設(shè)計?? ?2
2.1 ?項目規(guī)劃?? ?2
2.2 ?系統(tǒng)功能結(jié)構(gòu)圖?? ?3
3 ?系統(tǒng)設(shè)計?? ?3
3.1 ?設(shè)計目標?? ?3
3.2 ?開發(fā)及運行環(huán)境?? ?4
3.3 ?數(shù)據(jù)庫設(shè)計?? ?4
4 ?JavaBean的編寫?? ?5
4.1 ?數(shù)據(jù)庫操作的JavaBean的編寫?? ?5
4.2 ?中文亂碼處理的JavaBean的編寫?? ?7
4.3 ?客戶基本信息的JavaBean的編寫?? ?7
4.4 ?提交客戶信息的JavaBean的編寫?? ?8
4.5 ?查詢、分頁JavaBean的編寫(QuestString.java)?? ?9
4.6 ?顯示系統(tǒng)時間的JavaBean的編寫?? ?14
5 ?用戶登錄模塊設(shè)計?? ?15
6 ?系統(tǒng)首頁設(shè)計?? ?16
7 ?基礎(chǔ)信息管理主要功能模塊設(shè)計?? ?18
7.1 ?客戶信息管理設(shè)計?? ?18
7.2 ?客戶信息查詢設(shè)計?? ?19
8 ?庫存管理主要功能模塊設(shè)計?? ?22
8.1 ?商品入庫信息設(shè)計?? ?23
8.2 ?商品價格調(diào)整設(shè)計?? ?26
附錄A ?參考文獻?? ?
附錄B ?數(shù)據(jù)表?? ?
附錄C ?文件架構(gòu)圖?? ?
?
0 ?引言
隨著中國電子商務(wù)、互聯(lián)網(wǎng)業(yè)務(wù)的迅猛發(fā)展,國內(nèi)許多企業(yè)已跨入電腦網(wǎng)絡(luò)管理時代,并因此提高了管理效率和市場競爭力。但目前仍有部分企業(yè)還停留在原始計賬管理階段。而隨著全球經(jīng)濟信息化的進程和WTO的成功實現(xiàn),企業(yè)面臨著前所未有的機遇和挑戰(zhàn),在如此激變的社會形勢和激烈的市場競爭下,愈來愈多的企業(yè)管理者意識到效率管理和科學(xué)管理的重要性,以及增強市場競爭力的迫切性,因此建立科學(xué)、規(guī)范、高效的管理制度和秉承富有競爭力的經(jīng)營理念是每一個企業(yè)管理者的渴望,企業(yè)采用電腦管理進貨、庫存、銷售等諸多環(huán)節(jié)也已成為趨勢及必然。
在進貨、庫存、銷售環(huán)節(jié)中,由于商品種類繁多、業(yè)務(wù)量大、庫存管理復(fù)雜,使用手工操作的工作量很大,在操作過程中也很容易出現(xiàn)各種錯誤。而采用計算機管理則可以大大提高日常工作的效率,不僅將原來由手工操作的進貨、出貨及銷售這一整套流程用計算機進行全程管理,而且消除了手工操作中可能存在的不確定因素,達到進銷存管理流程清晰,從而能夠比較徹底地貫徹經(jīng)營者的管理模式。
?
1 ?系統(tǒng)分析
1.1 ?需求分析
通過調(diào)查研究,要求系統(tǒng)滿足以下功能:
??? ?由于操作人員的計算機知識水平有限,因此要求系統(tǒng)具有良好的人機界面。
??? ?如果系統(tǒng)的使用對象較多,則要求有較好的權(quán)限管理。
??? ?方便的數(shù)據(jù)查詢功能,并支持多條件查詢。
??? ?在各種單據(jù)中根據(jù)輸入的基礎(chǔ)數(shù)據(jù)自動計算金額,盡量減少人工干預(yù)。
??? ?對客戶或供應(yīng)商的往來賬目進行有效管理,絕不存在假賬、漏賬、差賬等情況。
??? ?通過計算機,能夠直接“透視”倉庫存儲情況。
??? ?對某一時間段內(nèi)的某種商品的銷售情況按數(shù)量或金額進行升序或降序排行。
??? ?圖表分析年銷售額。
1.2 ?可行性分析
通過計算機網(wǎng)絡(luò)系統(tǒng)對企業(yè)進行全面的管理,滿足了企業(yè)的現(xiàn)代化管理的要求。
??? ?經(jīng)濟性
當前許多中小型企業(yè)都使用人工管理方式(即紙和筆)來管理企業(yè)的進銷存,這樣的管理方式既困難又浪費時間和成本,并且容易出現(xiàn)漏賬、差賬的情況,因此中小企業(yè)應(yīng)該向大型企業(yè)那樣采用先進的管理方式,提高企業(yè)效率、降低企業(yè)運營成本。
??? ?技術(shù)性
企業(yè)進銷存管理系統(tǒng)從中小企業(yè)的實際出發(fā),可有效地管理企業(yè)的進銷存情況,并降低企業(yè)運營成本、及時調(diào)整營銷策略、提高庫房的利用率。
2 ?總體設(shè)計
2.1 ?項目規(guī)劃
企業(yè)進銷存管理系統(tǒng)是一個典型的數(shù)據(jù)庫開發(fā)應(yīng)用程序,由基礎(chǔ)信息管理、庫存管理、商品銷售、查詢統(tǒng)計、往來管理、系統(tǒng)設(shè)置6部分組成。
??? ?基礎(chǔ)信息管理
該模塊主要是對企業(yè)的客戶信息、商品信息、供應(yīng)商信息進行有效管理,并可實現(xiàn)按不同條件對這些數(shù)據(jù)進行查詢。
??? ?庫存管理
該模塊主要是對商品的入庫及入庫退貨信息進行有效管理,對商品的價格進行調(diào)整,同時可按不同條件查詢庫存商品。
??? ?商品銷售
該模塊主要是對商品的銷售及銷售退貨信息進行有效管理。
??? ?查詢統(tǒng)計
該模塊主要實現(xiàn)按不同條件查詢商品的入庫信息及銷售信息,并可對某一時間段內(nèi)某種商品的銷售情況按數(shù)量或金額進行升序或降序排行,同時可對某一年度的銷售額進行圖表分析。
??? ?往來管理
該模塊主要實現(xiàn)對商品的入庫結(jié)賬、入庫退貨結(jié)賬、銷售結(jié)賬、銷售退貨結(jié)賬信息進行有效管理,同時可實現(xiàn)銷售結(jié)賬信息及入庫結(jié)賬信息的查詢操作。
??? ?系統(tǒng)設(shè)置
訪模塊主要實現(xiàn)對操作員及操作員密碼進行有效管理。
2.2 ?系統(tǒng)功能結(jié)構(gòu)圖
企業(yè)進銷存管理系統(tǒng)的功能結(jié)構(gòu)如圖1所示。
?
圖1 ?系統(tǒng)功能結(jié)構(gòu)圖
3 ?系統(tǒng)設(shè)計
3.1 ?設(shè)計目標
本系統(tǒng)針對中小型企業(yè)進銷存管理現(xiàn)狀,通過網(wǎng)絡(luò)對企業(yè)的進銷存進行有效管理。本系統(tǒng)主要實現(xiàn)如下目標:
??? ?系統(tǒng)采用人機對話方式,界面美觀友好,信息查詢靈活、方便、快捷、準確,數(shù)據(jù)存儲安全可靠。
??? ?實現(xiàn)企業(yè)內(nèi)一些基礎(chǔ)信息的設(shè)置及查詢。
??? ?商品的入庫、入庫退貨、銷售、銷售退貨流程清晰。
??? ?數(shù)據(jù)計算自動完成,提高工作效率。
??? ?與供應(yīng)商和客戶之間的賬目清晰。
??? ?以圖表形式對年銷售額進行分析。
??? ?實現(xiàn)多條件查詢。
??? ?可方便快捷地查詢庫存信息,并可對商品價格進行調(diào)整。
??? ?對某一時間段內(nèi)的某種商品按照銷售數(shù)量或銷售金額進行銷售升序排行或降序排行。
??? ?操作員可以隨時修改自己的口令。
??? ?對用戶輸入的數(shù)據(jù),系統(tǒng)進行嚴格的數(shù)據(jù)檢驗,盡可能排除人為的錯誤。
??? ?系統(tǒng)最大限度地實現(xiàn)了易維護性和易操作性。
??? ?系統(tǒng)運行穩(wěn)定、安全可靠。
3.2 ?開發(fā)及運行環(huán)境
硬件平臺:
??? ?CPU:P41.8GHz。
??? ?內(nèi)存:256MB以上。
軟件平臺:
??? ?操作系統(tǒng):Windows 2000。
??? ?數(shù)據(jù)庫:SQL Server 2000。
??? ?開發(fā)工具包:JDK Version1.4.2。
??? ?JSP服務(wù)器:Tomcat。
??? ?瀏覽器:IE5.0,推薦使用IE6.0。
??? ?分辨率:最佳效果1024×768像素。
3.3 ?數(shù)據(jù)庫設(shè)計
本系統(tǒng)采用SQL Server 2000數(shù)據(jù)庫,系統(tǒng)數(shù)據(jù)庫名稱為db_shopping。數(shù)據(jù)庫db_shopping中包含17張表。關(guān)于數(shù)據(jù)庫中的數(shù)據(jù)表請參見附錄B。
4 ?JavaBean的編寫
根據(jù)系統(tǒng)的需求編寫需要的JavaBean。下面將給出企業(yè)進銷存管理系統(tǒng)中所需要的JavaBean的編寫過程。
4.1 ?數(shù)據(jù)庫操作的JavaBean的編寫
數(shù)據(jù)庫連接的JavaBean的編寫代碼如下:
package com.mingri.dbconn;
import java.sql.*;
import javax.naming.*;
import javax.sql.DataSource;
public class DBConn
{
? public static synchronized Connection getConnection() throws Exception{
? ? try{
? ? ? Context initCtx=new javax.naming.InitialContext(); ? ? ?//獲得JNDI初始上下文對象
//在JNDI命名空間java:comp/env段里獲得上下文對象
? ? ? Context envCtx=(Context)initCtx.lookup("java:comp/env");?
? ? ? DataSource ds=(DataSource)envCtx.lookup("jdbc/mingri"); ? ? ?//通過JNDI名獲得數(shù)據(jù)源對象
? ? ? return ds.getConnection();
? ? }
? ? catch(SQLException e){
? ? ? throw e;
? ? }
? ? catch(NamingException e){
? ? ? throw e;
? ? }
? }
}
數(shù)據(jù)庫操作的JavaBean的編寫代碼如下:
package com.mingri.dbconn;
import java.sql.*;
import com.mingri.dbconn.DBConn;
public class DBResult
{
? private Connection con;
? public ?DBResult(){
? ? this.con=DBConn.getConnection();
? }
? /**
? ?* 用于獲得執(zhí)行SQL語句的ResultSet對象
? ?*/
? public ResultSet getResult(String sql){
? ? try{
? ? ? Statement stmt=con.createStatement();
? ? ? ResultSet rs=stmt.executeQuery(sql);
? ? ? return rs;
? ? }
? ? catch(Exception e){}
? ? return null;
? }
? /**
? ?* 用于執(zhí)行SQL語句沒有返回值
? ?*/
? public void doExecute(String sql){
? ? try{
? ? ? Statement stmt=con.createStatement();
? ? ? stmt.executeQuery(sql);
? ? }catch(Exception e){}
? }
? /**
? ?* 用于獲得執(zhí)行SQL語句的PreparedStatement(預(yù)處理)對象
? ?*/
? ? public PreparedStatement getPreparedStatement(String sql){
? ? try{
? ? ? PreparedStatement pstmt=con.prepareStatement(sql);
? ? ? return pstmt;
? ? }
? ? catch(Exception e){}
? ? return null;
? }
? /**
? ?* 關(guān)閉連接
? ?*/
? ? public void closeCon(){
? ? try{
? ? ? ? this.con.close();
? ? }catch(Exception e){
? ? ? ? e.printStackTrace(); ? ?} ?}
}
4.2 ?中文亂碼處理的JavaBean的編寫
在JSP開發(fā)中,經(jīng)常出現(xiàn)亂碼問題,我們可以指定編碼方式,以消除亂碼。
package com.mingri.chinese;
import java.io.*;
public class ToChinese
{
? public String trans(String chi){
? ? String result=null;
? ? byte temp[];
? ? try{
? ? ? temp=chi.getBytes("iso-8859-1");
? ? ? result=new String(temp);
? ? }
? ? catch(UnsupportedEncodingException e){
? ? ? System.out.println(e.toString());
? ? }
? ? return result;
? }
? ?}
4.3 ?客戶基本信息的JavaBean的編寫
這段代碼用來封裝客戶的基本信息,并對每個屬性提供setXXX()和getXXX()方法,來對其進行操作。
package com.mingri.info;
public class KhinfoBean
{
? private String khname; ? ? ? ?//客戶全稱
? private String khjc; ? ? ? ? ? //客戶簡稱
? private String address; ? ? ? ?//地址
? private String postcode; ? ? ? //郵政編碼
? private String tel; ? ? ? ? ? ?//電話
? private String fax; ? ? ? ? ? //傳真
? private String lxr; ? ? ? ? ? //聯(lián)系人
? private String lxrtel; ? ? ? ? //聯(lián)系人電話
? private String email; ? ? ? ? //電子郵箱
? private String khyh; ? ? ? ? //開戶銀行
? private String yhzh; ? ? ? ? //銀行賬號
? public String getKhname() {
? ? return khname;
? }
? public void setKhname(String khname) {
? ? this.khname = khname;
? }
? ……//省略部分代碼
}
4.4 ?提交客戶信息的JavaBean的編寫
在填寫完客戶基本信息后,就應(yīng)該向數(shù)據(jù)庫中執(zhí)行插入操作。這個類中有兩個方法setKhinfo()和Regist()。其中setKhinfo(KhinfoBean khinfo)方法是用來設(shè)置該類中的屬性khinfo,其值為參數(shù)傳遞來的KhinfoBean的對象。然后執(zhí)行預(yù)處理語句,并通過預(yù)處理對象pstmt的setString()方法來設(shè)置準備要插入數(shù)據(jù)庫的內(nèi)容,最后通過execute()來執(zhí)行插入的操作。具體代碼如下:
package com.mingri.info;
import com.mingri.dbconn.DBResult;
import java.sql.*;
public class KhRegist
{
? private KhinfoBean khinfo;
? DBResult rst=new DBResult();
? public void setKhinfo(KhinfoBean khinfo){
? ? this.khinfo=khinfo;
? }
? public void regist() throws Exception{
? ? String reg="insert into tb_customer values(?,?,?,?,?,?,?,?,?,?,?)";
? ? try{
? ? ? PreparedStatement pstmt=rst.getPreparedStatement(reg); ?//創(chuàng)建一個預(yù)處理語句,然后設(shè)置他們的參數(shù)
? ? ? pstmt.setString(1,khinfo.getKhname());
? ? ? pstmt.setString(2,khinfo.getKhjc());
? ? ? pstmt.setString(3,khinfo.getAddress());
? ? ? pstmt.setString(4,khinfo.getPostcode());
? ? ? pstmt.setString(5,khinfo.getTel());
? ? ? pstmt.setString(6,khinfo.getFax());
? ? ? pstmt.setString(7,khinfo.getLxr());
? ? ? pstmt.setString(8,khinfo.getLxrtel());
? ? ? pstmt.setString(9,khinfo.getEmail());
? ? ? pstmt.setString(10,khinfo.getKhyh());
? ? ? pstmt.setString(11,khinfo.getYhzh());
? ? ? //執(zhí)行更新操作
? ? ? pstmt.executeUpdate();
? ? }
? ? catch(Exception e){
? ? ? e.printStackTrace();
? ? ? throw e;
? ? }
? }
}
4.5 ?查詢、分頁JavaBean的編寫(QuestString.java)
該系統(tǒng)中主要的方法分為兩部分:一部分是根據(jù)用戶提交的不同請求調(diào)用不用的方法來獲取SQL語句;另一部分是用于分頁顯示。用于完成分頁顯示的方法有:
??? ?void setQuerySql(String httpfile,String pages,String strCount):通過參數(shù)傳遞來設(shè)置Bean中的屬性。
??? ?void querySql(String countSql):執(zhí)行SQL語句,獲得分頁顯示時的各個屬性。
??? ?String pageFooter():用來動態(tài)的給出一個表單該表單用來進行分頁和統(tǒng)計頁面間的跳轉(zhuǎn)。
這部分代碼是本系統(tǒng)中查詢部分的骨架,所有涉及到查詢操作的代碼部分全都調(diào)用了該Bean 中相應(yīng)的方法,并完成了分頁顯示。代碼如下:
package com.mingri.info;
import com.mingri.dbconn.DBResult;
import java.sql.*;
import java.io.*;
public class QuestString
{
? private int curPage; ? ? ? ? ? //當前頁數(shù)
? private int maxPage; ? ? ? ? ?//最大頁數(shù)
? private int maxRowCount; ? ? //總記錄數(shù)(即從數(shù)據(jù)庫中查出的所有記錄)
? private int pageSize=2; ? ? ? ?//每頁要顯示的記錄數(shù)
? private DBResult db; ? ? ? ? //記錄集對象
? private String httpFile; ? ? ? ?//當前地址欄的文件,即具體的JSP文件
? private String cif; ? ? ? ? ? ?//選擇的查詢字段
? private String ccif; ? ? ? ? ? //選擇的查詢運算符
? private String qvalue; ? ? ? ? //查詢關(guān)鍵字
? private String countSql=null; ? ? ?//用來存儲select count (*) ……語句
? private String topSql=null; ? ? ? ?//用來存儲 select top 2……語句
? private String nowPage=null; ? ? ?//初始化當前頁curPage變量,即獲取當前頁的具體頁號
? private String str_parameter; ? ? ?//在做翻頁時,傳遞除pages以外的其他參數(shù)
? private String andor; ? ? ? ? ? ?//查詢的與/或條件
? private String sdate; ? ? ? ? ? ?//查詢起始時間,即從什么日期開始查詢
? private String edate; ? ? ? ? ? ?//查詢結(jié)束時間,即到什么日期結(jié)束
? private String orderby; ? ? ? ? ?//排序條件,即按什么排序
? private String paixu; ? ? ? ? ? ?//排序方法,即升序或降序
? public QuestString(){ ? ? ? ? ? //構(gòu)造方法,用來設(shè)置db為一個DBResult()對象
? ? db=new DBResult();
? }
? public int getCurPage() {
? ? return curPage;
? }
? public void setCurPage(int curPage) {
? ? this.curPage = curPage;
? }
? ?//省略了對Bean中其他屬性設(shè)置的部分代碼
? ……
/**
? ?* 通過參數(shù)傳遞來設(shè)置Bean中的屬性
? ?*/
? public void setQuerySql(String httpfile,String pages,String strCount){
? ? this.nowPage=pages; ? ? ? //將表單提交過來的參數(shù)pages(第幾頁)的值傳遞給變量nowPage保存
? ? this.httpFile=httpfile; ? ? ? //用來動態(tài)設(shè)置處理表單請求的JSP文件
? ? this.countSql=strCount; ? ? //用來設(shè)置執(zhí)行select count(*)……的SQL語句
? ? try{
? ? ? querySql(countSql); ? ? ?//調(diào)用querySql方法,并將參數(shù)countSql傳遞到該方法中
? ? }catch(Exception e){
? ? ? e.printStackTrace();
? ? }
? }
? /**
? ?* 執(zhí)行SQL語句,獲得分頁顯示時的各個屬性
? ?*/
? public void querySql(String countSql) throws SQLException{
? ? //在setQuerySql方法中已經(jīng)設(shè)置了nowPage的值,其值就是pages
? ? if(this.nowPage==null){ ? ? ?//如果nowPage的值為空,也就是傳遞pages的值為空
? ? ? this.curPage=1; ? ? ?//那么就將當前頁的值設(shè)為1;
? ? }
? ? else{
? ? ? this.curPage=Integer.parseInt(this.nowPage);
? ? ? if(this.curPage<1){ ? ? ? //如果當前頁小于1,那么就將當前頁的值設(shè)為1
? ? ? ? this.curPage = 1;
? ? ? }
? ? }
? ? ResultSet rsCount=db.getResult(countSql); ? ? ? //執(zhí)行SQL語句獲得記錄總數(shù)
? ? if(rsCount.next()){
? ? ? this.maxRowCount=rsCount.getInt(1); ? ? ?//獲取記錄總數(shù),即所要查詢記錄的總行數(shù)
? ? }
? ? //獲取總頁數(shù),即如果當總記錄數(shù)除以每頁顯示的記錄的余數(shù)為0時,總頁數(shù)就等于兩數(shù)整除的結(jié)果
? ? //如果余數(shù)不等于0,那么總頁數(shù)就等于兩數(shù)整除的結(jié)果加1
this.maxPage=(this.maxRowCount%this.pageSize==0)?(this.maxRowCount/this.pageSize):(this.maxRowCount/this.pageSize+1);
? ? if(this.curPage>this.maxPage){ ? ? ?//如果當前頁大于總頁數(shù),則當前頁等于總頁數(shù)
? ? ? this.curPage=this.maxPage; ? ? ?//那么當前頁就是最大頁
? ? }
? ? rsCount.close(); ? ? ? //關(guān)閉總記錄數(shù)的結(jié)果集
? }
? /**
? ?* 一個字符串,用來動態(tài)的給出一個表單
? ?* 該表單用來進行分頁和統(tǒng)計頁面間的跳轉(zhuǎn)
? ?*/
? public String pageFooter()
? {
? ? //創(chuàng)建一個表單
? ? String str = "<form action=" + this.httpFile + " name=formBean methord=post>";
? ? int prev = this.curPage- 1; ? ? ? //向前翻頁,即當前頁減1
? ? int next = this.curPage +1; ? ? ?//向后翻頁,即當前頁加1
? ? str = str + "<font style='font-size: 10pt'>總計<font color='red'>" + this.getMaxRowCount() +?
? ? ? ? ? ? ? ? ?"</font>條記錄," + "【共<font ?color='red'>" + this.getMaxPage()+ "</font>頁】";
? ? str = str + "【 <font color='red'>" + this.pageSize + "</font>條/頁】 當前第<font color='red'>" +?
? ? ? ? ? ? ? ? ?this.getCurPage() + "</font>頁 ";
? ? if(this.curPage > 1)
? ? ? str = str + " <A href=" + this.httpFile + "?pages=1" + str_parameter + ">首頁</A> ";
? ? else
? ? ? str = str + " 首頁 ";
? ? if(this.curPage > 1)
? ? ? str = str + " <A href=" + this.httpFile + "?pages=" + prev + str_parameter + ">上一頁</A> ";
? ? else
? ? ? str = str + " 上一頁 ";
? ? if(this.curPage < this.maxPage)
? ? ? str = str + " <A href=" + this.httpFile + "?pages=" + next + str_parameter + ">下一頁</A> ";
? ? else
? ? ? str = str + " 下一頁 ";
? ? if(this.maxPage > 1 && this.curPage!= this.maxPage)
? ? ? str = str + " <A href=" + this.httpFile + "?pages=" + this.maxPage + str_parameter + ">尾頁</A>";
? ? else
? ? ? str = str + " 尾頁</font>";
? ? //在頁面跳轉(zhuǎn)間設(shè)置隱藏表單,來保存不同的請求
? ? str = str + "轉(zhuǎn)到<input type ='text' name='pages' size='2'>頁"+
? ? ? ? ? ? ? ? ? ? "<input type='hidden' name='ccif' value='"+this.ccif+
? ? ? ? ? ? ? ? ? ? "'><input type ='hidden' name='cif' value='"+this.cif+
? ? ? ? ? ? ? ? ? ? "'><input type ='hidden' name='qvalue' value='"+this.qvalue+
? ? ? ? ? ? ? ? ? ? "'><input type ='hidden' name='andor' value='"+this.andor+
? ? ? ? ? ? ? ? ? ? "'><input type ='hidden' name='sdate' value='"+this.sdate+
? ? ? ? ? ? ? ? ? ? "'><input type ='hidden' name='edate' value='"+this.edate+
? ? ? ? ? ? ? ? ? ? "'><input type ='hidden' name='orderby' value='"+this.orderby+
? ? ? ? ? ? ? ? ? ? "'><input type ='hidden' name='paixu' value='"+this.paixu+
? ? ? ? ? ? ? ? ? ? "'><input type='submit' name='sumbmit' value='go'></form>";
? ? return str;
? }
? /**
? ?* 根據(jù)不同條件來獲取不同的查詢前N條的SQL語句
? ?*/
? public String getString(String table){
? if(ccif.equals("="))
? {
? ?String strSql="select top "+this.pageSize*this.curPage+" * from "+table+
? ? ? ? ? ? ? ? ?" where"+" "+cif+"="+"'"+qvalue+"'";
? ?return strSql;
? }
? else if(ccif.equals("LIKE"))
? {
? ?String strSql="select top "+this.pageSize*this.curPage+" * from "+table+?
? ? ? ? ? ? ? ? ?" where"+" "+cif+" "+"like"+" "+"'%"+qvalue+"%'";
? ?return strSql;
? }
? else if(ccif.equals("ALL"))
? {
? ?String strSql="select top "+this.pageSize*this.curPage+" * from "+table;
? ?return strSql;
? }
? else if(ccif.equals("<"))
? {
? ?String strSql="select top "+this.pageSize*this.curPage+" * from "+table+?
? ? ? ? ? ? ? ? ?" where "+cif+" < '"+qvalue+"'";
? ?return strSql;
? }
? return null;
?}
?/**
? * 根據(jù)不同條件來獲得不同的計算記錄總數(shù)的SQL語句
? */
?public String getCount(String table){
? if(ccif.equals("="))
? {
? ?String strSql="select count(*) from "+table+" where"+" "+cif+"="+"'"+qvalue+"'";
? ?return strSql;
? }
? else if(ccif.equals("LIKE"))
? {
? ?String strSql="select count(*) from "+table+" where"+" "+cif+" "+"like"+" "+"'%"+qvalue+"%'";
? ?return strSql;
? }
? else if(ccif.equals("ALL"))
? {
? ?String strSql="select count(*) from "+table;
? ?return strSql;
? }
? else if(ccif.equals("<"))
? {
? ?String strSql="select count(*) from "+table+" where "+cif+" < '"+qvalue+"'";
? ?return strSql;
? }
? return null;
?}
?/**
? * 根據(jù)不同條件和不同的起始日期和結(jié)束日期來獲得不同的計算記錄總數(shù)的SQL語句
? */
?public String getDateCount(String table){
? ?if(ccif.equals("=")) ? ? ?//在sdate到edate時間段中進行精確查詢
? ?{
? ? String strSql="select count(*) from "+table+" where "+cif+" = '"+qvalue+"'"+
? ? ? ? ? ? ? andor+" xsdate between '"+sdate+"' and '"+edate+"'";
? ? return strSql;
? ?}
? ?else if(ccif.equals("LIKE")) ? ? ? //在sdate到edate時間段中進行模糊查詢
? ?{
? ? String strSql="select count(*) from "+table+" where "+cif+" like '%"+qvalue+"%'"+
? ? ? ? ? ? ? andor+" xsdate between '"+sdate+"' and '"+edate+"'";
? ? return strSql;
? ?}
? ?else if(ccif.equals("ALL")) ? ? //取出表中所有記錄
? ?{
? ? String strSql="select count(*) from "+table;
? ? return strSql;
? ?}
? ?return null;
?}
?/**
? * 根據(jù)不同條件和不同的起始日期和結(jié)束日期來獲得不同的查詢,前N條的SQL語句
? */
?public String getDateString(String table){
? if(ccif.equals("="))
? {
? ? String strSql="select top "+this.pageSize*this.curPage+" * from "+table+
? ? ? ? ? ? ? ? ? " where "+cif+" = '"+qvalue+"'"+andor+
? ? ? ? ? ? ? ? ? " xsdate between '"+sdate+"' and '"+edate+"'";
? ? return strSql;
? }
? else if(ccif.equals("LIKE"))
? {
? ? String strSql="select top "+this.pageSize*this.curPage+" * from "+table+
? ? ? ? ? ? ? ? ? " where "+cif+" like '%"+qvalue+"%'"+andor+
? ? ? ? ? ? ? ? ? " xsdate between '"+sdate+"' and '"+edate+"'";
? ? return strSql;
? }
? else if(ccif.equals("ALL"))
? {
? ?String strSql="select top "+this.pageSize*this.curPage+" * from "+table;
? ?return strSql;
? }
? return null;
?}
?/**
? * 子查詢中得到從起始日期到結(jié)束日期這段時間所有不重復(fù)的spid(商品id),并返回不重復(fù)的spid的總數(shù)
? */
?public String getOrderCount(String table){
? ?String strSql="select count(*) from (select spid from "+table+
? ? ? ? ? ? ? " where xsdate between '"+sdate+"' and '"+edate+
? ? ? ? ? ? ? "' group by spid) as aa";
? ?return strSql;
?}
?/**
? * 聯(lián)合查詢查詢出某一表中從起始到結(jié)束日期間所有不重復(fù)的spid(商品id)
? * 并且將所有相同spid下的sl(數(shù)量)和je(金額)求和,即計算出某一商品在
? * 某一時間段內(nèi)的總銷售數(shù)量和銷售總額
? * 最后通過聯(lián)合查詢在tb_brand表(商品信息表)中將該spid所對應(yīng)商品的其他一些信息查詢出來
? */
?public String getOrderString(String table){
? ?String strSql="select top "+ this.pageSize*this.curPage+
? ? ? ?"* from tb_brand a inner join (select spid,sum(sl) as sl,sum(je) as je"+
? ? ? ?" from "+table+" where ?xsdate between '"+sdate+"' and '"+edate+"' group by spid ) as b"+
? ? ? ?" on a.id=b.spid order by "+orderby+" "+paixu;
? ?return strSql;
?}
}
4.6 ?顯示系統(tǒng)時間的JavaBean的編寫
在本系統(tǒng)中,商品的入庫編號、銷售票號等都是由“2位英文字母+系統(tǒng)時間+5位數(shù)字”自動生成的,所以我們將系統(tǒng)時間封裝到Bean中,這樣可以很好的將這部分代碼重用。具體代碼如下:
package com.mingri.showtime;
import java.util.*;
public class ShowTime
{
? private Date date=null;
? private int yy; ? ? ? //保存由Date類中g(shù)etYear()方法返回的整型數(shù)值
? private int mm; ? ? ?//保存由Date類中g(shù)etMonth()方法返回的整型數(shù)值
? private int dd; ? ? ? //保存由Date類中g(shù)etDate()方法返回的整型數(shù)值
? private String sy;
? private String sm;
? private String sd;
? public ShowTime(){
? ? date=new Date();
? ? yy=date.getYear()+1900; ? ? ? //只有加上1900才是系統(tǒng)當前的年份
? ? mm=date.getMonth()+1; ? ? ? //只有加上1才識系統(tǒng)當前的月份
? ? dd=date.getDate();
? ? sy=String.valueOf(yy); ? ? ? ?//將整型yy轉(zhuǎn)化為字符串類型
? ? sm=String.valueOf(mm); ? ? ?//將整型mm轉(zhuǎn)化為字符串類型
? ? sd=String.valueOf(dd); ? ? ? ?//將整型dd轉(zhuǎn)化為字符串類型
? ? //如果月份是1位數(shù)在前面加上"0",即如果是1月份那么顯示的就是"01"
if(sm.length()==1){
? ? ? sm="0"+sm;}
? ? if(sd.length()==1){
? ? ? sd="0"+sd; ?}
? }
? public String getDateString(){
? ? return sy+sm+sd; ?}
? public String getDate(){
? ? return sy+"-"+sm+"-"+sd;
? }
}
5 ?用戶登錄模塊設(shè)計
用戶通過登錄頁面,進入企業(yè)進銷存管理系統(tǒng)首頁。該模塊主要用于驗證用戶的身份及密碼,其運行結(jié)果如圖3所示。
?
圖3 ?用戶登錄頁面的運行結(jié)果
在登錄頁面中利用JavaScript腳本語言編寫檢測用戶輸入信息是否合法的函數(shù),并通過單擊【登錄】按鈕調(diào)用該函數(shù),判斷用戶名或密碼是否為空,如果為空,系統(tǒng)將給予提示。當用戶輸入合法信息后,提交該表單。
用戶登錄頁面中涉及的HTML表單元素如表1所示。
表1 ? ? ? ? ? ? ? ? ? ? ?用戶登錄頁面涉及的HTML表單元素
名稱?? ?類型?? ?含義?? ?重要屬性
form1?? ?form?? ?表單?? ?action="login.asp" method="post"
username?? ?text?? ?用戶名?? ?
password?? ?password?? ?密碼?? ?
submit?? ?button?? ?【登錄】按鈕?? ?onClick="check()"
reset?? ?reset?? ?【取消】按鈕?? ?class="btn_grey" value="取消"
用戶登錄頁面中驗證用戶輸入合法性的主要JavaScript代碼如下:
……//省略部分代碼
<script language="javascript">
? function check(){
? ?if(form1.username.value==0){
? ? ?alert("請輸入用戶名");form1.username.focus();return;
? ?}
? ?if(form1.password.value==0){
? ? ?alert("請輸入密碼");form1.password.focus();return;
? ?}
? ?form1.submit();
? }
</script>
當用戶輸入合法信息后,就由表單屬性action所指定的JSP文件來對這些信息進行驗證。當驗證通過后,進入到系統(tǒng)的主頁面進行操作;否則給予信息提示,并返回到登錄頁面重新登錄。關(guān)鍵代碼如下:
<%@ page contentType="text/html;charset=gb2312" language="java"%>
<%@ page import="java.io.*,java.sql.*"%>
<jsp:useBean id="rst" scope="page" class="com.mingri.dbconn.DBResult"/>
<%
? ?request.setCharacterEncoding("gb2312"); ? ? ? ?//對請求進行統(tǒng)一編碼,能正常接受到中文
? ?String username=request.getParameter("username"); ? ? ? //接收表單中的username屬性
? ?String password=request.getParameter("password"); ? ? ? //接收表單中的password屬性
? ?String str="select * from tb_user where "+
? ? ? ? ? ? ? ?"username='"+username+"' and password='"+password+"'";
? ?ResultSet rs=rst.getResult(str); ? ? ?//執(zhí)行SQL語句獲得結(jié)果集對象
? ?//判斷用戶是否登錄,當isLog的屬性為0時,說明用戶并沒有登錄
? ?session.setAttribute("isLog",new String("0"));
? ?if(!rs.next()){ ? ? ?//結(jié)果集沒有找到所要查找的行
? ? out.println("<script language='javascript'>alert('用戶名或密碼錯誤');"+
? ? ? ? ? ? ? ? "parent.location.href='login.html';</script>"); ? }
? ?else{
? ? ?session.setAttribute("username",rs.getString("username")); ? ? ? //保存登錄信息到session對象中
? ? ?session.setAttribute("password",rs.getString("password"));
? ? ?session.setAttribute("isLog",new String("1")); ? ? ? ?//將isLog屬性設(shè)置為1
? ? ?rst.getResult(strUpdate); ? ? //執(zhí)行SQL語句
? ? ?response.sendRedirect("chat.jsp"); ? ? ? //登錄成功后轉(zhuǎn)到系統(tǒng)主頁面 ? }
%>
6 ?系統(tǒng)首頁設(shè)計
為了能夠在同一頁面中管理多個頁,本系統(tǒng)首頁的設(shè)計采用了框架技術(shù)將整個首頁分成以下3部分。
??? ?頁面顯示區(qū)(top.jsp):主要用于顯示網(wǎng)站的旗幟廣告條。
??? ?頁面導(dǎo)航區(qū)(left.jsp):主要用于管理功能導(dǎo)航。
??? ?頁面操作區(qū)(main.jsp):主要用于完成各種管理功能。
首頁設(shè)計的完整代碼如下:
<html>
<head>
<title>企業(yè)進銷存框架</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<frameset rows="179,*" cols="*" frameborder="NO" border="0" framespacing="0">
? <frame src="top.jsp" name="topFrame" scrolling="NO" noresize>
? <frameset rows="*" cols="231,*" framespacing="0" frameborder="NO" border="0">
? ?? ?<frame src="left.jsp" name="leftFrame" frameborder="no" scrolling="AUTO" noresize>
? ? <frame src="main.jsp" name="mainFrame" frameborder="no" scrolling="AUTO" noresize marginwidth="1" marginheight="1" bordercolor="#CCCCCC">
? </frameset>
</frameset>
<noframes>
<body>
</body>
</noframes>
</html>
總結(jié)
以上是生活随笔為你收集整理的基于java 企业进销存管理系统设计(含源文件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse远程连接hadoop_ha
- 下一篇: 【干货】JS版汉字与拼音互转终极方案,附