企业仓库管理系统(数据库设计与开发)

本文档详述了一个商场仓库管理系统的设计与实现,旨在通过自动化管理提高效率,减少人工错误。系统涵盖需求分析、数据库设计(概念、逻辑、物理结构)、数据库实施以及详细设计与实现,采用SQL Server 2012作为数据库,Java作为编程语言,Eclipse作为开发环境,Windows 10作为操作系统。系统功能包括管理员管理、基本信息维护、库存管理和出库入库操作,具备用户角色如仓库管理员、客户和生产车间。开发过程中,解决了界面设计、监听事件编写、窗口布局等问题,提升了面向对象编程能力。
摘要由CSDN通过智能技术生成

第一章  引言

1.1系统开发的背景

随着计算机的发展,生活中仅仅依靠人工管理商场里面大量的的商品会浪费大部分的人力物力,还会造成较高的人工失误,所以有必要开发一个商场库存管理系统来很大程度上减少失误和不必要的浪费。实现信息数字化管理,提高管理效率,降低经营成本。利用商场库存管理系统可以提高商场的运营,提高总体效率。

1.2系统开发的意义与目的

仓库在现实生活中用途十分广泛,各种商城、超市要利用仓库存放物资,药房、医院等要利用仓库存放药品,企业、工厂等要利用仓库存放原材料、生产成品,因此仓库的管理成了一项十分重要的工作。人工管理仓库既费时又费力,而且容易造成混乱,严重时会影响商城、企业的正常运作,造成恶劣的后果。随着计算机技术的发展,如何快速,高效,便捷的管理仓库受到了高度的关注。本系统模拟仓库管理,系统主要针对于日常库存信息的管理,包括物资管理、仓库管理、入库操作、入库査询统计、出库操作、出库查询统计、库存查询统计等处理情況。用户可以通过相应的模块,对仓库里的物品的基本情况和库存数量进行查询,管理员通过简单的操作即可轻松的管理仓库,查询各项相关信息,并能进行入库和出库操作等。通过仓库管理系统的设计与实现,使我们巩固和加深对数据库基础理论和基本知识的理解,进一步掌握了使用数据库进行软件设计的基本思想和方法,提高了运用数据库理论解决实际问题的能力,锻炼了实际动手能力、创新能力,培养了调查研究、查阅技术文献、资料、手册以及编写文档的能力。

1.3开发工具简介

1.3.1数据库系统SQL Servers012:

作为新一代的数据平台产品,SQL Server 2012 不仅延续现有数据平台的强大能力,全面支持云技术与平台,并且能够快速构建相应的解决方案实现私有云与公有云之间数据的扩展与应用的迁移。SQL Server 2012 提供对企业基础架构最高级别的支持—专门针对关键业务应用的多种功能与解决方案可以提供最高级别的可用性及性能。在业界领先的商业智能领域,SQL Server 2012 提供了更多更全面的功能以满足不同人群对数据以及信息的需求,包括支持来自于不同网络环境的数据的交互,全面的自助分析等创新功能。针对大数据以及数据仓库,SQL Server 2012 提供从数 TB 到数百 TB 全面端到端的解决方案。作为微软的信息平台解决方案,SQL Server 2012 的发布,可以帮助数以千计的企业用户突破性地快速实现各种数据体验,完全释放对企业的洞察力。SQL Server 2012包含企业版(Enterprise)、标准版(Standard),另外新增了商业智能版(Business Intelligence)。微软表示,SQL Server 2012发布时还将包括Web版、开发者版本以及精简版。

1.3.2程序编写语言:JAVA

JAVA是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承指针等概念,因此JAVA语言具有功能强大和简单易用两个特征。JAVA语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。JAVA具有简单性、面向对象、分布式健壮性安全性、平台独立与可移植性、多线程、动态性等特点。JAVA可以编写桌面应用程序Web应用程序分布式系统嵌入式系统应用程序等。

1.3.3集成开发环境:Eclipse

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计算机语言比如C++和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE

1.3.4操作系统 Windows 10

Windows 10是美国微软公司研发的跨平台及设备应用的操作系统。是微软发布的最后一个独立Windows版本。

2014年10月1日,微软在新品发布会上,对外展示了该系统。2015年7月29日,微软发布Windows 10正式版。Windows 10共有7个发行版本,分别面向不同用户和设备。截止至2018年5月9日,Windows 10正式版已更新至春季创意者10.0.17134.48版本,预览版已更新至秋季创意者10.0.17666版本 。

1.4开发计划

3~5 周:完成数据库需求分析

5~8 周:完成E-R图等概念模式

8~9 周:完成数据库模块分类

9~10周:完成数据库基本程序编写

11~13周:数据库的实施阶段(建立数据库,数据表,设置完整性,添加数据,建立视图,索引)

13~16周:完成数据库维护和前台连接

17周:参加答辩

人员分工:

   需求分析,概念模式,模块分类,E-R图绘制,java子界面由组员甲完成。

   查找资料,程序编写,数据库修改和添加信息,java的主界面由组员乙完成。

   数据流图,数据字典,数据库维护和前台连接由组员甲乙两人共同完成。

 

第二章 系统的需求及其基本功能

2.1用户需求分析

仓库管理员:使用系统对仓库进行管理,进行商品的更新以及增、删、改、查等操作。

   客户:使用系统提交订单购买产品。

   生产车间:使用系统向仓库提交成品单和废料单,接收仓库的原料单。

2.2处理对象分析

系统要处理的对象包括员工基本信息、客户基本信息、仓库基本信息、产品基本信息、库存基本信息、出入库基本信息六个方面,各个对象包含信息如下:

1.员工基本信息:员工编号、员工户姓名、员工类型、联系电话、居住地址、入职时间、薪水,方便人员调动和工作分配。

2.客户基本信息:客户姓名、客户性别、客户编号、客户类型、联系人、联系电话、通信地址,熟知客户信息,更好服务,同时方便管理

3.仓库基本信息:仓库编号、仓库名称、仓库位置、库存情况,方便管理者及时更新数据,以防空间浪费,堵塞。

4.生产车间基本信息:生产车间编号、生产车间名称、生产车间位置、生产类型,对原料进行加工,把原料和产品的库存信息返回给仓库管理。

5.原料基本信息:原料编号、原料名称、原料类型、参考价格、入库单价、入库数量,对原料进行记录

6.产品基本信息:产品编号、产品名称、产品规格、参考价格、数量上限、数量下限,生产日期、生产车间、对于各种信息详细记录、备份

7.库存基本信息:存储编号、产品编号、仓库编号、产品入库单价、产品数量、生产日期、保质期,保证产品可以及时更新。

8.出入库信息:出入库操作类型、出入库产品编号、生产日期、出入库产品单价、出入库产品数量、客户编号、仓库编号、操作人员、出入库日期、出入库标记。

2.3功能需求分析

对于一个库存管理系统,首先就是要对库存进行管理,对库存信息进行收集

和统计,以使后日查验。在功能设计方使要符合行业的实际,充分考虑用户的水

平,用最简使的操作方法实现需要的功能。对于一个管理信息系统来说,也应该

有必要的安全性,保证数据只被需要的人看到。

根据该企业的具体情况,系统主要功能有:

1、管理员管理:管理员的权限管理,管理员密码修改。

2、基本信息维护:客户、产品、仓库以及生产车间的基本信息的增、删、改、查。

3、库存管理:出库、入库、库存信息的修改,库存信息的查询。

2.4数据流图

标题

 

 

 

标题

2.5数据字典

2.5.1数据项

名称:员工

编号:Y01

简述:唯一标识一个采购员

别名:employees

类型:char

取值含义:字母表示采购员,后三位为顺序排列的数字

名称:仓库

编号:SR011

简述:唯一标识一个仓库

别名:warehouse

类型:char

取值含义:第一位表示仓库,后三位为顺序排列的数字

名称:生产车间

编号:WK01

简述:唯一标识一个生产车间

别名:workshop

类型:char

取值含义:第一位表示生产车间,中间三位为顺序排列的数字。

名称:原料

编号:RM01

简述:唯一标识一个原料

别名:material

类型:char

取值含义:第一位表示原料,中间一位表示零件种类,后三位为顺序排列的数字

名称:产品

编号:P01

简述:唯一标识一个产品

别名:product

类型:char

取值含义:第一位表示产品,中间一位表示产品种类,后三位为顺序排列的数字

名称:客户

编号:C01

简述:唯一标识一个客户

别名:customer

类型:char

取值含义:第一位表示客户,后三位为顺序排列的数字

2.5.2数据结构

名称:员工信息表

编号:Y01

简述:包含所有员工的基本信息

组成:员工编号+员工姓名+员工类型+联系电话+居住地址+入职时间+薪水

名称:仓库信息表

编号:SR01

简述:包含所有仓库的基本信息

组成:仓库编号+仓库名称+仓库位置+库存情况+存储上限

名称:生产车间信息表

编号:WK01

简述:包含所有生产车间的基本信息

组成:生产车间编号+生产车间名称+生产车间位置+生产类型

名称:原料信息表

编号:LA001

简述:包含所有原料的基本信息

组成:原料编号+原料名称+原料类型+参考价格+入库单价+入库数量

名称:产品信息表

编号:P01

简述:包含所有求购信息

组成::产品编号+产品名称+产品规格+参考价格+数量上限+数量下限+生产日期+生产车间

名称:客户信息表

编号:C01

简述:包含所有客户的信息

组成:客户姓名+客户性别+客户编号+客户类型+联系人+联系电话+通信地址

2.5.3数据流:

编号:

L1

名称:

原料采购入库

简述:

采购员提交采购单

来源:

采购员

去向:

原料入库表

组成:

员工编号+原料编号+价格+数量

编号:

L2

名称:

原料出库

简述:

向车间输送原料

来源:

仓库

去向:

原料出口表

组成:

原料编号+价格+数量

编号:

L3

名称:

产品入库

简述:

产生的产品入库

来源:

车间

去向:

产品入库表

组成:

产品编号+价格+数量

编号:

L4

名称:

购买订单

简述:

提交购买的信息

来源:

顾客

去向:

产品出库表

组成:

产品编号+价格+数量

编号:

L5

名称:

产品出库

简述:

向顾客发送产品

来源:

仓库

去向:

产品出库表

组成:

产品编号+价格+数量

2.5.4处理逻辑

编号:

A001

名称:

原料出入库管理

简述:

员工以及生产车间向仓库提供原料出入库的数据

输入的数据流:

原料出入库单

处理:

系统通过员工以及生产车间提供的数据进行处理

输出的数据流:

原料出入库报表

处理频率:

一天一次

编号:

A002

名称:

产品出入库管理

简述:

生产车间以及销售要根据自己的产品及销售提供可供清单

输入的数据流:

产品出入库单

处理:

系统通过顾生产车间以及销售提供的数据进行处理

输出的数据流:

产品出入报表

处理频率:

一周一次

编号:

A003

名称:

销售管理

简述:

系统通过信息汇总对销量进行统计

输入的数据流:

销售信息

处理:

系统对销量进行统计形成销售报表

输出的数据流:

销售统计

处理频率:

一月一次

2.5.5数据存储

编号:

C1

名称:

原料出入库

简述:

记录原料的名称、单价、库存数量等信息

组成:

原料+数量+单价+出库/入库

编号:

C2

名称:

产品出入库

简述:

记录产品的产量、售出、退回

组成:

产品+数量+单价+出库/入库

编号:

C3

名称:

员工信息

简述:

记录员工的基本信息

组成:

员工编号+姓名+年龄+性别+职位+薪资

编号:

C4

名称:

客户信息

简述:

记录客户的基本信息

组成:

客户编号+姓名+年龄+性别+会员级别

编号:

C5

名称:

车间信息

简述:

记录车间的基本信息

组成:

车间编号+名称+位置+生产类型

编号:

C6

名称:

仓库信息

简述:

记录仓库的基本信息

组成:

仓库编号+名称+位置+库存情况

编号:

C7

名称:

原料信息

简述:

记录原料的基本信息

组成:

原料编号+名称+类型+价格+单价+数量

编号:

C8

名称:

产品信息

简述:

记录产品的基本信息

组成:

产品编号+名称+类型+价格+单价+数量+规格

 第三章 总体设计方案

3.1 系统功能框架图

  •  

第四章数据库设计

4.1概念结构设计

4.1.1原料出入库ER模型图

标题

4.1.2产品出库ER图

标题

4.1.3全局ER图

标题

4.2逻辑结构设计

4.2.1将E-R图转换为关系模型

4.2.1.1“员工”,“原料”,“车间”的模式转换

标题

其关系模式设计如下:

员工关系模式 (员工编号,类型,年龄,性别,姓名,联系方式,入职时间,薪水)

原料关系模式(原料编号,名称,类型,参考价格,数量上限,入库数量,生产车间

车间关系模式(仓库编号,名称,地址,仓库情况)

原料入库关系模式(原料编号,车间编号,数量,价格)

4.2.1.2“车间”,“产品”,“客户”的模式转换

标题

其关系模式设计如下:

车间关系模式(车间编号,名称,地址,类型)

产品关系模式(产品编号,产品名称,种类,出库价格,生产时间,生产车间)    

产品出库关系模式(生产车间编号,产品编号,客户编号)

4.3物理结构设计

4.3.1索引

标题
标题
标题

 

标题

 

标题

 

4.3.2视图

标题
标题

 

第五章数据库实施

5.1 数据库的建立

use master

go

IF EXISTS(SELECT * FROM sysdatabases WHERE name='CKGL')

DROP DATABASE CKGL

CREATE DATABASE CKGL

on(NAME=CKGL,

 FILENAME='D:\DATA1\CKGL.mdf',

 SIZE=5,

 FILEGROWTH=1

)

LOG ON

(NAME=JXGL_log,

 FILENAME='D:\DATA1\CKGL_log.ldf',

 SIZE=2,

 MAXSIZE=20,

 FILEGROWTH=10%

)

GO

5.2 表的建立

5.2.1客户表的建立

USE CKGL

GO

CREATE TABLE C

(CNO NCHAR(3) NOT NULL       --编号

CONSTRAINT PK_CNO PRIMARY KEY CLUSTERED,

CHECK(CNO LIKE 'C[0-9][0-9]'),     -- 检查约束

CNAME NCHAR(8) NOT NULL,           -- 名称

sex nchar(1) not null,

POST NCHAR(6) NOT NULL,    --客户类型

YNO NCHAR(3) NOT NULL,  --交易员工

FOREIGN KEY(YNO) REFERENCES Y(YNO),  --外键约束

PHONEUMBER NCHAR(12) NOT NULL,--电话

HOME NCHAR(6) NOT NULL,  --居住地

PNO NCHAR(3) NOT NULL,

FOREIGN KEY(PNO) REFERENCES P(PNO),

)

5.2.2产品表

USE CKGL

GO

CREATE TABLE P

(PNO NCHAR(3) NOT NULL       --编号

CONSTRAINT PK_PNO PRIMARY KEY CLUSTERED,

CHECK(PNO LIKE 'P[0-9][0-9]'),     

PNAME NCHAR(8) NOT NULL,           -- 名称

POST NCHAR(6) NOT NULL,    --规格

CKPRICE SMALLINT NULL,--参考价格

PTIME NCHAR(12)NOT NULL,  --生产日期

WKNO NCHAR(4) NOT NULL,  --生产车间

FOREIGN KEY(WKNO) REFERENCES WK(WKNO),

)

5.2.3员工表

USE CKGL

GO

CREATE  TABLE Y       

(YNO NCHAR(3) NOT NULL            -- 编号号字段,非空约束  

CONSTRAINT PK_SNO PRIMARY KEY CLUSTERED        -- 主键约束   

CHECK(YNO LIKE 'Y[0-9][0-9]'),     -- 检查约束

YNAME NCHAR(8) NOT NULL,           -- 姓名字段,非空约束

SEX CHAR(1) NULL,                  -- 性别字段

INTIME NCHAR(12) NOT NULL,             -- 入职时间字段

POST NCHAR(5) NULL,               -- 职务字段

HOME NCHAR(15) NULL,               --居住地

SALARY NCHAR(8) NOT null,              --薪水

PHONENUMBER NCHAR(15) NOT null,        --联系电话

)

5.2.4原料表

USE CKGL

GO

CREATE TABLE RM

(RMNO NCHAR(4) NOT NULL       --编号

CONSTRAINT PK_RMNO PRIMARY KEY CLUSTERED,

CHECK(RMNO LIKE 'RM[0-9][0-9]'),     

RMNAME NCHAR(8) NOT NULL,           -- 名称

POST NCHAR(6) NOT NULL,    --类型

CKPRICE SMALLINT NOT NULL,--参考价格

INPRICE SMALLINT NOT NULL,  --入库价格

INNUMBER SMALLINT NOT NULL,  --入库数量

SRNO NCHAR(4) NOT NULL,       --管理仓库

FOREIGN KEY(SRNO) REFERENCES SR(SRNO),

)

5.2.5仓库表

USE CKGL

GO

CREATE TABLE SR

(SRNO NCHAR(4) NOT NULL       --编号

CONSTRAINT PK_SRNO PRIMARY KEY CLUSTERED,

CHECK(SRNO LIKE 'SR[0-9][0-9]'),     -- 检查约束

SRNAME NCHAR(20) NOT NULL,           -- 名称

HOME NCHAR(20) NOT NULL,    --位置

STA NCHAR(30)NOT NULL,             -- 库存情况

)

5.2.6车间表

USE CKGL

GO

CREATE TABLE WK

(WKNO NCHAR(4) NOT NULL       --编号

CONSTRAINT PK_WKNO PRIMARY KEY CLUSTERED,

CHECK(WKNO LIKE 'WK[0-9][0-9]'),     

WKNAME NCHAR(8) NOT NULL,           -- 名称

HOME NCHAR(15) NOT NULL,    --位置

STAMODE NCHAR(12)NOT NULL,             -- 运行状态

)

5.3表间关系图

标题

第六章详细设计与实现

6.1Java

6.1.1登录界面设计

6.1.1.1实验代码

package Start;

import java.awt.*;

import javax.swing.*;

import src.index;

import java.awt.event.*;

public class Start extends JFrame {

JPanel pn1, pn2, pn3;

JButton bt1, bt2;

JLabel lb1, lb2;

JTextField nameTextField;

JPasswordField pwdPasswordField;

public Start() {

super();

pn1 = new JPanel();

pn2 = new JPanel();

pn3 = new JPanel();

lb1 = new JLabel("用户名");

lb2 = new JLabel("密  码");

bt1 = new JButton("登录");

bt2 = new JButton("取消");

nameTextField = new JTextField(10);

pwdPasswordField = new JPasswordField(10);

Init();

}

void Init() {

this.setLayout(new GridLayout(3, 1));

pn1.add(lb1);

pn1.add(nameTextField);

pn2.add(lb2);

pn2.add(pwdPasswordField);

pn3.add(bt1);

pn3.add(bt2);

this.add(pn1);

this.add(pn2);

this.add(pn3);

this.setTitle("登录");

this.setSize(230, 150);

this.setLocation(650, 300);

this.setResizable(false);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

bt2.addActionListener(new bt2Clicked(this));

bt1.addActionListener(new bt1Clicked(this));

nameTextField.setText("zxc");

pwdPasswordField.setText("123");

nameTextField.addMouseListener(new UserNameListener(this));

}

public JTextField getNameTextField() {

return nameTextField;

}

public JPasswordField getPasswordField() {

return pwdPasswordField;

}

class UserNameListener extends MouseAdapter{

private Start login;

public UserNameListener(Start l) {

login = l;

}

public void mouseClicked(MouseEvent e) {

this.login.getNameTextField().setText("");

}

}

class bt2Clicked implements ActionListener {

private Start login;

 

public bt2Clicked(Start l) {

login = l;

}

@Override

public void actionPerformed(ActionEvent e) {

login.dispose();

}

}

 

class bt1Clicked implements ActionListener {

private Start login;

 

public bt1Clicked(Start l) {

login = l;

}

 

@Override

public void actionPerformed(ActionEvent e) {

String userName = login.getNameTextField().getText().trim();

String userPwd = new String(login.getPasswordField().getPassword()).trim();

if (userName.equals("zxc") && userPwd.contentEquals("123")) {

JOptionPane.showMessageDialog(null, "欢迎使用本系统,使用者:"+userName , "登陆成功", JOptionPane.INFORMATION_MESSAGE);

index i=new index();

return;

}

JOptionPane.showConfirmDialog(null, "用户名或密码错误", "登录失败", JOptionPane.WARNING_MESSAGE);

}

}

public static void main(String aargs[]) {

new Start();

}

}

 

6.1.1.2界面展示

      

标题

 

标题

6.1.2主界面设计

6.1.2.1实验代码

package src;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

import javax.swing.table.TableModel;

public class index extends JFrame implements ActionListener{

JPanel pn1,pn2,pn3;  //面板

JLabel label;

JButton bt1,bt2,bt3, bt4, bt5, bt6, bt7,bt8;   //按钮

JTable table;

JScrollPane scrollPane;

public index() {

super();

pn1=new JPanel();

pn2=new JPanel();

label=new JLabel("查看表中信息:");

bt1=new JButton("员工");

bt1.addActionListener(this);

bt1.setActionCommand("y");

bt2=new JButton("客户");

bt2.addActionListener(this);

bt2.setActionCommand("k");

bt3=new JButton("原料");

bt3.addActionListener(this);

bt3.setActionCommand("l");

bt4=new JButton("产品");

bt4.addActionListener(this);

bt4.setActionCommand("c");

bt5=new JButton("仓库");

bt5.addActionListener(this);

bt5.setActionCommand("p");

bt6=new JButton("车间");

bt6.addActionListener(this);

bt6.setActionCommand("j");

pn1.add(label);

pn1.add(bt1);pn1.add(bt2);pn1.add(bt3);

pn1.add(bt4);pn1.add(bt5);

pn1.add(bt6);

table=new JTable();

scrollPane = new JScrollPane(table);

 

this.add(pn1, "North");

this.add(scrollPane);

this.setTitle("CKGL系统");

this.setSize(800,500);

this.setLocation(400,200);

this.setResizable(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

@Override

public void actionPerformed(ActionEvent e) {

if (e.getActionCommand().equals("y")) {

new YStoreManager();

}else if (e.getActionCommand().equals("k")) {

new CManager();

}

else if (e.getActionCommand().equals("l")) {

new RManager();

}

else if (e.getActionCommand().equals("c")) {

new PManager();

}

else if (e.getActionCommand().equals("p")) {

new SRManager();

}

else if (e.getActionCommand().equals("j")) {

new WKManager();

}

}

}

 

6.1.2.2界面展示

 

标题

6.1.2功能模块设计

6.1.2.1 类的定义(以客户为例)

   CAdd.java            客户信息添加类

   CAlter.java           客户信息修改类

   CManger.java         客户信息调用以及删除类

   CTable.java           客户信息界面类

   SeqTest.java           数据库连接

 

6.1.2.2类的主要方法(以客户为例)

CAdd()                   进按钮等对象的添加

     addActionListener()    事件监听类

setActionCommend()     给一个JButton设置一个属性的字符串值

SetLayout ()           设置布局

SetSize  ()              设置组件的长度和宽度

SetLocation()            设置组件的定位

SetString()              封装

6.1.2.3主要代码(以客户为例)

6.1.2.3.1客户的信息添加

package src;

import javax.swing.JDialog;

import javax.swing.JFrame;

import java.awt.*;

import java.awt.event.*;

import java.sql.*;

import java.util.*;

import javax.swing.*;

 

class CAdd extends JDialog implements ActionListener{

   JLabel lb1,lb2,lb3,lb4,lb5,lb6,lb7,lb8;

   JTextField tf1,tf2,tf3,tf4,tf5,tf6,tf7,tf8;

   JButton bt1,bt2;

   JPanel pn1,pn2,pn3,pn4,pn5,pn6,pn7,pn8;

   public CAdd(Frame owner,String title,Boolean modal){

   super(owner,title,modal);//JDialog的带参构造,父窗口、窗口标题、是否能移动

   lb1=new JLabel("               编号      ");

   lb2=new JLabel("               姓名      ");

   lb3=new JLabel("               性别     ");

   lb4=new JLabel("               类别     ");

   lb5=new JLabel("               负责人员     ");

   lb6=new JLabel("               电话号码     ");

   lb7=new JLabel("               联系地址     ");

   lb8=new JLabel("               仓库编号     ");

   

   tf1=new JTextField(8);   tf2=new JTextField(8);

   tf3=new JTextField(8);   tf4=new JTextField(8);

   tf5=new JTextField(8);   tf6=new JTextField(8);  

   tf7=new JTextField(8);   tf8=new JTextField(8);

   bt1=new JButton("添加");         

   bt1.addActionListener(this);

   bt1.setActionCommand("add");//设置按钮名称

   bt2=new JButton("取消");         

   bt2.addActionListener(this);

   bt2.setActionCommand("cancel");//设置按钮名称

   pn1=new JPanel();    pn2=new JPanel();     pn3=new JPanel();

   pn4=new JPanel();    pn5=new JPanel();     pn6=new JPanel();

   pn7=new JPanel();    pn8=new JPanel();

   

   pn1.setLayout(new GridLayout(8,1));

   pn2.setLayout(new GridLayout(8,1));

   

   pn1.add(lb1);  pn1.add(lb2);  pn1.add(lb3);

   pn1.add(lb4);  pn1.add(lb5);  pn1.add(lb6);

   pn1.add(lb7);  pn1.add(lb8);

   

   pn2.add(tf1);  pn2.add(tf2);  pn2.add(tf3);

   pn2.add(tf4);  pn2.add(tf5);  pn2.add(tf6);

   pn2.add(tf7);  pn2.add(tf8);

   

   pn3.add(bt1);  pn3.add(bt2);

   this.add(pn1,BorderLayout.WEST);

   this.add(pn2);

   this.add(pn3,BorderLayout.SOUTH);

   this.add(pn4,BorderLayout.EAST);

   this.add(pn5,BorderLayout.NORTH);

   this.add(pn6,BorderLayout.NORTH);

   this.add(pn7,BorderLayout.NORTH);

   this.add(pn8,BorderLayout.NORTH);

     

  this.setSize(370,270);

  this.setLocation(401,281);

  this.setResizable(false);

  this.setVisible(true);   

   }

   public void actionPerformed(ActionEvent e){

   if(e.getActionCommand().equals("add")){//按下添加按钮连接数据库并插入记录

   PreparedStatement ps=null;

   Connection ct=null;

   ResultSet rs=null;

   String  url= "jdbc:sqlserver://localhost:1433;DatabaseName=CKGL;";

   try {

  ct=DriverManager.getConnection(url,"sa","sa");

  String s=("insert into C values(?,?,?,?,?,?,?,?)");

  ps=ct.prepareStatement(s);

  ps.setString(1,tf1.getText());

  ps.setString(2,tf2.getText());

  ps.setString(3,tf3.getText());

  ps.setString(4,tf4.getText());

  ps.setString(5,tf5.getText());

  ps.setString(6,tf6.getText());

  ps.setString(7,tf7.getText());

  ps.setString(8,tf8.getText());

  ps.executeUpdate();

           this.dispose();  

  } catch (Exception e2){   }

   finally{

    try {

    if(rs!=null){    rs.close();   }

    if(ps!=null){   ps.close();   }

    if(ct!=null){    ct.close();   }

    } catch (Exception e3){    }

    }

 }

   else if(e.getActionCommand().equals("cancel")){

    this.dispose();

   }

   }

}

6.1.2.3.2客户的信息修改

package src;

import java.awt.*;

import java.awt.event.*;

import java.sql.*;

import java.util.*;

import javax.swing.*;

class CAlter extends JDialog implements ActionListener{

JLabel lb1,lb2,lb3,lb4,lb5,lb6,lb7,lb8;

JTextField tf1,tf2,tf3,tf4,tf5,tf6,tf7,tf8;

JButton bt1,bt2;

JPanel pn1,pn2,pn3,pn4,pn5,pn6,pn7,pn8;

   public CAlter(Frame owner,String title,Boolean modal,CTable table,int row){

   super(owner,title,modal);

   lb1=new JLabel("               编号      ");

   lb2=new JLabel("               姓名      ");

   lb3=new JLabel("               性别     ");

   lb4=new JLabel("               类别     ");

   lb5=new JLabel("               负责人员     ");

   lb6=new JLabel("               电话号码     ");

   lb7=new JLabel("               联系住址     ");

   lb8=new JLabel("               仓库编号     ");

   

   tf1=new JTextField(8);

   tf1.setText((String)table.getValueAt(row,0));//获得指定行、第一列的单元格值SNO

   tf1.setEditable(false);//设置为不可修改

   tf2=new JTextField(8);

   tf2.setText((String)table.getValueAt(row,1));//获得指定行、第二列的单元格值SNAME

   tf3=new JTextField(8);

   tf3.setText((String)table.getValueAt(row,2));//获得指定行、第三列的单元格值SEX

   tf4=new JTextField(8);

   tf4.setText((String)table.getValueAt(row,3).toString());

   //获得指定行第四列的单元格值,即AGE字段的值要转成字符串类型

   tf5=new JTextField(8);

   tf5.setText((String)table.getValueAt(row,4));//获得指定行、第五列的单元格值,COLLEGE

   tf6=new JTextField(8);

   tf6.setText((String)table.getValueAt(row,5));

   tf7=new JTextField(8);

   tf7.setText((String)table.getValueAt(row,6));

   tf8=new JTextField(8);

   tf8.setText((String)table.getValueAt(row,7));

   bt1=new JButton("修改");

   bt1.addActionListener(this);

   bt1.setActionCommand("edit");

   bt2=new JButton("取消");

   bt2.addActionListener(this);

   bt2.setActionCommand("cancel");

   

   pn1=new JPanel();    pn2=new JPanel();       pn3=new JPanel();

   pn4=new JPanel();    pn5=new JPanel();       pn6=new JPanel();

   pn7=new JPanel();    pn8=new JPanel();

   

   pn1.setLayout(new GridLayout(8,1));

   pn2.setLayout(new GridLayout(8,1));

   pn1.add(lb1);  pn1.add(lb2);  pn1.add(lb3);

   pn1.add(lb4);  pn1.add(lb5);  pn1.add(lb6);

   pn1.add(lb7);  pn1.add(lb8);

   

   pn2.add(tf1);  pn2.add(tf2);  pn2.add(tf3);

   pn2.add(tf4);  pn2.add(tf5);  pn2.add(tf6);

   pn2.add(tf7);  pn2.add(tf8);

   

   pn2.add(tf1);  pn2.add(tf2);  pn2.add(tf3);

   pn2.add(tf4);  pn2.add(tf5);  pn2.add(tf6);

   pn2.add(tf7);  pn2.add(tf8);

   pn3.add(bt1);  pn3.add(bt2);

   this.add(pn1,BorderLayout.WEST);

   this.add(pn2);

   this.add(pn3,BorderLayout.SOUTH);

   this.add(pn4,BorderLayout.EAST);

   this.add(pn5,BorderLayout.NORTH);

   this.add(pn6,BorderLayout.NORTH);

   this.add(pn7,BorderLayout.NORTH);

   this.add(pn8,BorderLayout.NORTH);

     

   this.setSize(370,270);

   this.setLocation(401,281);

   this.setResizable(false);

   this.setVisible(true);   

}

   public void actionPerformed(ActionEvent e){

   if(e.getActionCommand().equals("edit")){

   PreparedStatement ps=null;

   Connection ct=null;

   ResultSet rs=null;

   String url="jdbc:sqlserver://localhost:1433;DatabaseName=CKGL;";

   try {

         ct=DriverManager.getConnection(url,"sa","sa");

Stringss=("updateCsetCNAME=?,sex=?,POST=?,YNO=?,PHONEUMBER=?,HOME=?,PNO=? where CNO=?");

  ps=ct.prepareStatement(ss);

  ps.setString(1,tf2.getText());

  ps.setString(2,tf3.getText());

  ps.setString(3,tf4.getText());

  ps.setString(4,tf5.getText());

  ps.setString(5,tf6.getText());

  ps.setString(6,tf7.getText());

  ps.setString(7,tf8.getText());

  ps.setString(8,tf1.getText());

  ps.executeUpdate();

  this.dispose();

   } catch (Exception e2){    }

    finally{

    try {

    if(rs!=null){   rs.close();   }

    if(ps!=null){   ps.close();  }

    if(ct!=null){    ct.close();  }

     } catch (Exception e3){}

}

       }

   else if(e.getActionCommand().equals("cancel")){

    this.dispose();

   }

}

}

6.1.2.3.3客户的界面

package src;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

import javax.swing.table.*;

 

//CTable类主要用于客户C的表格方式显示

//AbstractTableModel抽象类主要把数据库中的信息以表格形式显式

class CTable extends AbstractTableModel {

ArrayList headings, records;// 可变长的数组

PreparedStatement ps = null;

Connection ct = null;

ResultSet rs = null;

 

public int getRowCount() {// 获得表格的行数

return this.records.size();

}

 

public int getColumnCount() {// 获得表格的列数

return this.headings.size();

}

 

public Object getValueAt(int row, int column) {// 获得指定行、指定列的单元格值

return ((ArrayList) this.records.get(row)).get(column);

}

 

public String getColumnName(int e) {// 获得表格的列标题

return (String) this.headings.get(e);

}

 

public CTable() {// 无参构造方法用于表中所有记录的查询

this.handles("select * from C");

}

 

// 代参构造,根据传入参数的具体SQL语句完成不同的查询

public CTable(String sql) {

this.handles(sql);

}

 

public void handles(String sql) {

// 定义表格的列标题

headings = new ArrayList();

headings.add("编号");

headings.add("姓名");

headings.add("性别");

headings.add("类别");

headings.add("负责人员");

headings.add("电话号码");

headings.add("联系住址");

headings.add("仓库编号");

// 定义记录(多行数据)的集合

records = new ArrayList();

ArrayList rows;// 定义行(一行有多列)

String url = "jdbc:sqlserver://localhost:1433;DatabaseName=CKGL;";

try {

ct = DriverManager.getConnection(url, "sa", "sa");

ps = ct.prepareStatement(sql);

rs = ps.executeQuery();

 

while (rs.next()) {

rows = new ArrayList();

rows.add(rs.getString(1));// 获取CNO数据放入行集合

rows.add(rs.getString(2));// 获取CNAME数据放入行集合

rows.add(rs.getString(3));// 获取SEX数据放入行集合

rows.add(rs.getString(4));// 获取post数据放入行集合

rows.add(rs.getString(5));// 获取YNO数据放入行集合

rows.add(rs.getString(6));// 获取PHONEUMBER数据放入集合中

rows.add(rs.getString(7));

rows.add(rs.getString(8));

records.add(rows);// 将一行数据加入到记录集合

}

} catch (Exception e) {

} finally {

try {

if (rs != null) {

rs.close();

}

if (ps != null) {

ps.close();

}

if (ct != null) {

ct.close();

}

} catch (Exception e) {

}

}

}

}

 

 

6.1.2.3.4数据库的连接

package src;

import java.sql.*;

public class SeqTest {

 

static Connection connect;

static Statement st;

 

public static void main(String[] args) {

 

String url="jdbc:sqlserver://localhost:1433;DatabaseName=CKGL;";

try {

//连接数据库

connect=DriverManager.getConnection(url,"sa","sa");

//建立Statement对象

st=connect.createStatement();

ResultSet rs=st.executeQuery("select * from C,P where C.PNO=P.PNO");

while(rs.next()) {

String CNO=rs.getString(1);

String CNAME=rs.getString(2);

String sex=rs.getString(3);

String POST=rs.getString(4);

String YNO=rs.getString(5);

String PHONE=rs.getString(6);

String HOME=rs.getString(7);

String PNO=rs.getString(8);

System.out.println(CNO+" "+CNAME+" "+sex+" "+POST+" "+YNO+" "+PHONE+" "+HOME+" "+PNO);

}

}catch(SQLException e1) {

e1.printStackTrace();

System.out.println("连接失败!");

}

finally {

try {

if(st!=null) {

st.close();

}

if(connect!=null) {

connect.close();

}

}catch(Exception e2) {

}

}

 

}

 

}

 

6.1.2.3.5客户信息的删除及调用

package src;

import java.awt.*;

import java.awt.event.*;

import java.sql.*;

import javax.swing.*;

 

//仓库管理的主界面

public class CManager extends JFrame implements ActionListener {

JPanel pn1, pn2;

JLabel label;

JTextField textField;

JButton bt1, bt2, bt3, bt4;

JTable table; // 中部显示的表格

JScrollPane scrollPane;

CTable ctable;

 

public CManager() {

pn1 = new JPanel();

label = new JLabel("请输入编号");

textField = new JTextField(10);

bt1 = new JButton("查询");

bt1.addActionListener(this);

bt1.setActionCommand("query");// 设置查询按钮的名称

pn1.add(label);

pn1.add(textField);

pn1.add(bt1);

 

pn2 = new JPanel();

bt2 = new JButton("添加");

bt2.addActionListener(this);

bt2.setActionCommand("add");// 设置添加按钮的名称

bt3 = new JButton("修改");

bt3.addActionListener(this);

bt3.setActionCommand("edit");// 设置修改按钮的名称

bt4 = new JButton("删除");

bt4.addActionListener(this);

bt4.setActionCommand("remove");// 设置删除按钮的名称

pn2.add(bt2);

pn2.add(bt3);

pn2.add(bt4);

ctable = new CTable();

table = new JTable(ctable);

scrollPane = new JScrollPane(table);

 

this.add(scrollPane);

this.add(pn1, "North");

this.add(pn2, "South");

 

this.setTitle("仓库管理系统");

this.setSize(500, 400);

this.setLocation(201, 181);

this.setResizable(false);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

 

public void actionPerformed(ActionEvent e) {

if (e.getActionCommand().equals("query")) {// 单击查询按钮

String cno = this.textField.getText().trim();// 获取文本框中输入的用户名

String sql = "select * from C where CNO='" + cno + "'";// 设置数据库查询的SQL语句

ctable = new CTable(sql);// 调用带参构造,查询并将查询结果放入表格

table.setModel(ctable);// 将查询结果立即显示到表格中

} else if (e.getActionCommand().equals("add")) {// 单击添加按钮

new CAdd(this,"添加客户信息",true);// 打开添加客户信息窗口

ctable = new CTable();// 调用无参构造,将添加后的所有数据放入表格

table.setModel(ctable);

} else if (e.getActionCommand().equals("edit")) {// 单击修改按钮

int i = this.table.getSelectedRow();// 获取所选表格的行数

if (i == -1) {// 没有选择行

JOptionPane.showMessageDialog(this, "请选中要修改的行");// 弹出对话框

return;

}

new CAlter(this, "修改客户信息", true, ctable, i);// 打开修改客户信息窗口

ctable = new CTable();// 调用无参构造,将修改后的所有数据放入表格

table.setModel(ctable);

} else if (e.getActionCommand().equals("remove")) {// 单击删除按钮

int i = this.table.getSelectedRow();// 获取所选表格的行数

if (i == -1) {

JOptionPane.showMessageDialog(this, "请选中要删除的行");

return;

}

String s = (String) ctable.getValueAt(i, 0);// 获取选定行的第一个字段CNO单元格的值

PreparedStatement ps = null;

Connection ct = null;

ResultSet rs = null;

String url = "jdbc:sqlserver://localhost:1433;DatabaseName=CKGL;";

try {

ct = DriverManager.getConnection(url, "sa", "sa");

ps = ct.prepareStatement("delete from C where CNO=?");

ps.setString(1, s);

ps.executeUpdate();

} catch (Exception e2) {

} finally {

try {

if (rs != null) {

rs.close();

}

if (ps != null) {

ps.close();

}

if (ct != null) {

ct.close();

}

} catch (Exception e3) {

}

}

ctable = new CTable();

table.setModel(ctable);

}

}

}

6.1.2.4界面展示(以员工页面为例)

6.1.2.4.1 主界面

标题

6.1.2.4.2添加信息

标题

6.1.2.4.3修改信息

标题

6.1.2.4.4删除信息

标题

6.2数据库(以仓库表为例)

6.2.1数据库表信息的添加

USE CKGL

GO

INSERT INTO SR VALUES('SR01','电脑仓','西关十字','上限2000,目前1200')

INSERT INTO SR VALUES('SR02','手机仓','安宁东路','上限5000,目前3000')

INSERT INTO WK VALUES('WK01','电脑车间','南城门西口','运行中')

INSERT INTO WK VALUES('WK02','手机车间','西京大道23号','停止运行')

INSERT INTO RM VALUES('RM01','光驱','0225',500,400,200)

INSERT INTO RM VALUES('RM02','内存条','DDR',300,310,200)

INSERT INTO RM VALUES('RM03','显示器','LG',400,380,200)

insert into p  values('P01','手机','5.3',1200,'2019.6.13','WK01')

insert into p  values('P02','MP3','2G内存',50,'2018.5.20','WK02')

insert into p  values('P03','电脑','17',4800,'2019.1.1','WK01')

insert into C  values('C01','张路','f','普通','Y01','10086','兰州市')

insert into C  values('C02','王娇','m','会员','Y01','10001','天津市')

6.2.2表信息

标题

 

第七章 运行与测试

7.1客户信息的添加

7.1.1添加前

标题

7.1.2添加信息

标题

7.1.3添加成功

标题

第八章 总结与收获

在此次课程设计中,遇到以下问题:

   (1)当设计主界面与子页面连接时,由于子界面包含对话窗口,以至于无法通过设计二级窗口的方法返回到主界面,在深思以及多次实验之后,设置了一个返回主界面的按钮,用这个按钮来完成此操作。

   (2)在写监听事件时,由于上课期间并没有理解其原理和构造,以至于刚开始写的时候很是迷茫,经过网上百度、读别人的代码、看视频、查阅书籍,基本掌握了监听事件的使用,然后完成了监听模块的编辑。

   (3)在构建窗口时,不了解窗口含有的属性,不了解页面的布局方式以及内容的添加过程次序。在查阅书籍,网上搜索资料的学习下,了解窗口含有的模块,内容,添加方式,布局方式,熟练掌握已知的窗体元素内容,使之后的窗口构造压力降低很多。

   (4)在进行java方面的代码时,经常忽略小细节的问题, 导致一直在一个地方浪费时间。

   (5)通过此次课程设计,使我更加扎实的掌握了有关面向对象方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。                                                               

       过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土豆土豆我是地瓜☞

文章上传不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值