电子与信息工程学院课程设计报告(2018-2019学年第二学期)课程:面向对象程序设计软件工程实践(数据库设计与开发)题目:企业仓库管理系统专业班级:组别:小组成员:指导教师:完成周数:2019年7月10日第一章引言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程序编写语言:JAVAJAVA是一门面向对象编程语言,不仅吸收了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为框架开发自己的IDE1.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子界面由xx完成。
查找资料,程序编写,数据库修改和添加信息,java的主界面由xx完成。
数据流图,数据字典,数据库维护和前台连接由两人共同完成。
第二章系统的需求及其基本功能2.1用户需求分析仓库管理员:使用系统对仓库进行管理,进行商品的更新以及增、删、改、查等操作。
客户:使用系统提交订单购买产品。
生产车间:使用系统向仓库提交成品单和废料单,接收仓库的原料单。
2.2处理对象分析系统要处理的对象包括员工基本信息、客户基本信息、仓库基本信息、产品基本信息、库存基本信息、出入库基本信息六个方面,各个对象包含信息如下:1.员工基本信息:员工编号、员工户姓名、员工类型、联系电话、居住地址、入职时间、薪水,方便人员调动和工作分配。
2.客户基本信息:客户姓名、客户性别、客户编号、客户类型、联系人、联系电话、通信地址,熟知客户信息,更好服务,同时方便管理3.仓库基本信息:仓库编号、仓库名称、仓库位置、库存情况,方便管理者及时更新数据,以防空间浪费,堵塞。
4.生产车间基本信息:生产车间编号、生产车间名称、生产车间位置、生产类型,对原料进行加工,把原料和产品的库存信息返回给仓库管理。
5.原料基本信息:原料编号、原料名称、原料类型、参考价格、入库单价、入库数量,对原料进行记录6.产品基本信息:产品编号、产品名称、产品规格、参考价格、数量上限、数量下限,生产日期、生产车间、对于各种信息详细记录、备份7.库存基本信息:存储编号、产品编号、仓库编号、产品入库单价、产品数量、生产日期、保质期,保证产品可以及时更新。
8.出入库信息:出入库操作类型、出入库产品编号、生产日期、出入库产品单价、出入库产品数量、客户编号、仓库编号、操作人员、出入库日期、出入库标记。
2.3功能需求分析对于一个库存管理系统,首先就是要对库存进行管理,对库存信息进行收集和统计,以使后日查验。
在功能设计方使要符合行业的实际,充分考虑用户的水平,用最简使的操作方法实现需要的功能。
对于一个管理信息系统来说,也应该有必要的安全性,保证数据只被需要的人看到。
根据该企业的具体情况,系统主要功能有:1、管理员管理:管理员的权限管理,管理员密码修改。
2、基本信息维护:客户、产品、仓库以及生产车间的基本信息的增、删、改、查。
3、库存管理:出库、入库、库存信息的修改,库存信息的查询。
2.4 数据流图2.5 数据字典2.6.2数据结构第三章总体设计方案3.1 系统功能框架图第四章数据库设计4.1概念结构设计4.1.1原料出入库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 mastergoIF EXISTS(SELECT * FROM sysdatabases WHERE name='CKGL') DROP DATABASE CKGLCREATE DATABASE CKGLon(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%)GO5.2 表的建立5.2.1客户表的建立USE CKGLGOCREATE 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 CKGLGOCREATE 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 CKGLGOCREATE 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 CKGLGOCREATE 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 CKGLGOCREATE 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 CKGLGOCREATE 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表间关系图第六章详细设计与实现1.Java1.1登录界面设计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;}@Overridepublic void actionPerformed(ActionEvent e) {login.dispose();}}class bt1Clicked implements ActionListener {private Start login;public bt1Clicked(Start l) {login = l;}@Overridepublic 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 , "登陆成功", RMATION_MESSAGE);index i=new index();return;}JOptionPane.showConfirmDialog(null, "用户名或密码错误", "登录失败", JOptionPane.WARNING_MESSAGE);}}public static void main(String aargs[]) {new Start();}}1.1.2界面展示1.2主界面设计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);}@Overridepublic 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();}}}1.2.2界面展示1.2功能模块设计1.2.1 类的定义(以客户为例)CAdd.java 客户信息添加类CAlter.java 客户信息修改类CManger.java 客户信息调用以及删除类CTable.java 客户信息界面类SeqTest.java数据库连接1.2.2类的主要方法(以客户为例)CAdd() 进按钮等对象的添加addActionListener()事件监听类setActionCommend()给一个JButton设置一个属性的字符串值SetLayout ()设置布局SetSize () 设置组件的长度和宽度SetLocation() 设置组件的定位SetString() 封装1.2.3主要代码(以客户为例)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();}}}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));//获得指定行、第一列的单元格值SNOtf1.setEditable(false);//设置为不可修改tf2=new JTextField(8);tf2.setText((String)table.getValueAt(row,1));//获得指定行、第二列的单元格值SNAMEtf3=new JTextField(8);tf3.setText((String)table.getValueAt(row,2));//获得指定行、第三列的单元格值SEXtf4=new JTextField(8);tf4.setText((String)table.getValueAt(row,3).toString());//获得指定行第四列的单元格值,即AGE字段的值要转成字符串类型tf5=new JTextField(8);tf5.setText((String)table.getValueAt(row,4));//获得指定行、第五列的单元格值,COLLEGEtf6=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=?,H OME=?,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();}}}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) {}}}}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 whereC.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) {}}}}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);}}}1.2.4界面展示(以员工页面为例) 1.2.4.1 主界面1.2.4.2添加信息1.2.4.3修改信息1.2.4.4删除信息2.数据库(以仓库表为例)1.数据库表信息的添加USE CKGLGOINSERT INTO SR V ALUES('SR01','电脑仓','西关十字','上限2000,目前1200') INSERT INTO SR V ALUES('SR02','手机仓','安宁东路','上限5000,目前3000') INSERT INTO WK V ALUES('WK01','电脑车间','南城门西口','运行中') INSERT INTO WK V ALUES('WK02','手机车间','西京大道23号','停止运行') INSERT INTO RM V ALUES('RM01','光驱','0225',500,400,200)INSERT INTO RM V ALUES('RM02','内存条','DDR',300,310,200)INSERT INTO RM V ALUES('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','天津市')2.表信息第七章运行与测试7.1客户信息的添加添加前添加信息添加成功第八章总结与收获在此次课程设计中,遇到以下问题:(1)当设计主界面与子页面连接时,由于子界面包含对话窗口,以至于无法通过设计二级窗口的方法返回到主界面,在深思以及多次实验之后,设置了一个返回主界面的按钮,用这个按钮来完成此操作。