面向对象的程序设计
(Java)
课程设计报告
题目:网上商店销售管理及统计分析系统
专业信息管理与信息系统
班级
姓名
学号
指导教师
完成日期
年学期
《面向对象程序设计(Java)》课程设
计成绩评定
经考核,给出如下评语:
并综合评定该生课程设计成绩为。
指导教师:
年月日
目录
一、系统需求分析 (3)
二、系统实现目标 (3)
三、相关技术 (4)
四、系统设计 (4)
五、系统实现 (4)
六、系统配置………………………………………………………
七、系统维护与扩展………………………………………………
八、心得体会………………………………………………………
九、参考文献………………………………………………………
一、系统需求分析
1.设计题目
网上商店销售管理及统计分析系统
2.任务的描述
随着电子商务技术的不断深入,在线购物已经越来越受人们的欢迎,在生活中越来越普遍。在网上商店的后台需要经常对用户,商品等信息进行统计修改处理,并且需要统计产品销量及销售额,从而为网站发展决策提供有用的数据。
3.系统中用户的界面需求
需要设计两个用户交互式界面,一个界面处理对销售数据最基本的统计查询,另一个界面处理基本信息的修改和查询。
4.功能需求
系统实现对在线销售数据最基本的统计查询和基本信息的修改和查询。
5.性能需求
网上信息处理要求准确而迅速,并且信息流量大、更新速度快,所以要求系统能实现对大量数据的快处理能力,使用方便,操作简单,易于维护,安全性好,能将信息及时反馈给决策者。
二、系统实现目标
1.主要用途
对网上商店的后台数据库进行统计修改等处理。
2.实现功能
统计查询各年各季度的销售额及全年的商品销售情况;对基本信息,如会员,商品,配送点等信息的修改和查询。
三、相关技术
本系统完全使用Java语言编写,在Java虚拟机上运行。
Java是一种高级的、严格检查数据类型的、面向对象的程序设计语言。Java 还是一种平台无关的、健壮和安全的的程序设计语言。Java平台由Java应用编程接口(API)和Java虚拟机(JVM)构成。这个平台构成了Java在不同计算机系统中编译和运行的环境。为了搭建Java平台,需要下载和安装Java软件开发
工具箱(Java Development Kit,JDK),并设置Java编译和运行环境。
四、系统设计
1.系统的框架
2.功能描述
销售信息统计界面提供按时间统计查询各年各季度的销售额及按产品查询全年的商品销售情况的功能;基本信息管理界提供面对基本信息会员信息,商品信息,配送点信息的修改,查询和添加的功能。
五、系统实现
1.数据库的设计
主要数据库结构表设计(E_Business.mdb)
会员表cons:(cnum,cname,sex,birth,add,eadd)
时间码表dates:(dat,yea,sea)
商品表prods:(pnum,pname,a,b,supply)
配送点表send:(snum,sname,sadd)
销售表sells:(cnum,pnum,onum,dat,num,price,snum)
数据库E-R图
逻辑结构设计
2.系统详细设计及代码说明
程序源代码:
//引入系统调用所需要的包:
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
//类Ecm继承自JFrame
public class Ecm extends JFrame{
//定义Panel b1 的组件变量
JButton c11;JButton c12;JButton c13;JButton c14; JButton c15;JButton c16;JButton c17;
JLabel c21;JLabel c22;JLabel c23;JLabel c24;
JLabel c25;JLabel c26;JLabel c27;JLabel c28;
JLabel c29;
JLabel c211;JLabel c221;JLabel c231;JLabel c241;
JLabel c251;JLabel c261;
JTextArea c31;
JScrollPane c41;
JTextField c51;JTextField c52;JTextField c53;JTextField c54;
JTextField c55;JTextField c56;JTextField c57;
//定义Panel b2 的组件变量
JButton c18;JButton c19;JButton c110;JButton c111;
JButton c112;JButton c113;
JLabel c210;JLabel c212;JLabel c213;JLabel c214;
JLabel c215;JLabel c216;JLabel c217;JLabel c218;
JLabel c219;
JLabel c220;JLabel c222;JLabel c223;JLabel c224;
JLabel c225;JLabel c226;
JTextArea c32;
JScrollPane c42;
JTextField c58;JTextField c59;JTextField c510;
//构造函数
public Ecm() {
setTitle("网上商店销售管理及统计系统"); //设置标题
setSize(750,550); //设置大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置关闭窗口
(1)对“基本信息管理”界面进行设计,布局,对其中的组件的事件监听及处理。
//定义Panel b1 并采用自由布局
JPanel b1=new JPanel();
b1.setLayout(null);
c11=new JButton("会员信息"); //新建设组件对象并设置显示标志
c11.setSize(100,25); // 设置组件大小
c11.setLocation(10,50); // 设置组件在面板上的显示坐标
c12=new JButton("商品信息");
c12.setSize(100,25);c12.setLocation(10,100);
c13=new JButton("配送点信息");
c13.setSize(100,25);c13.setLocation(10,150);
c21=new JLabel();
c21.setSize(70,25);c21.setLocation(140,20);
c22=new JLabel();
c22.setSize(70,25);c22.setLocation(220,20);
……
//将所有布局好的组件加进面板Panel b1
b1.add(c11);b1.add(c12);
b1.add(c13);b1.add(c14);
b1.add(c15);b1.add(c16);
b1.add(c17);b1.add(c21);
b1.add(c22);b1.add(c23);
b1.add(c24);b1.add(c25);
b1.add(c26);b1.add(c27);
b1.add(c28);b1.add(c29);
b1.add(c211);b1.add(c221);
b1.add(c231);b1.add(c241);
b1.add(c251);b1.add(c261);
b1.add(c41);
b1.add(c51);b1.add(c52);b1.add(c53);b1.add(c54);
b1.add(c55);b1.add(c56);b1.add(c57);
对所有组件采用相同方式的布局,并根据显示结果不断调整参数,得到最终布局如下所示:
对面板上的所有组件添加事件监听及处理程序,代码如下:
//对c11按钮添加事件监听
c11.addActionListener(new ActionListener(){
//事件处理函数
public void actionPerformed(ActionEvent e){
//连接数据库
try{
String strurl = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};
DBQ=D:\\E_Business.mdb";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(strurl,"","");
Statement stmt = conn.createStatement();
//用SQL语句对数据库进行操作,查询会员信息
ResultSet rs = stmt.executeQuery("select * from cons");
String s="";
while(rs.next()){
s+=rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getString(4)+"\t"+rs.getString (5)+"\t"+rs.getString(6)+"\n";
}
//将查询到的数据显示在文本域里
c31.setText(s);
//给查询到的列加上列名
c21.setText("会员编号");c22.setText("注册名称");c23.setText("性别");
c24.setText("出生年份");c25.setText("地址");c26.setText("电子邮箱");
//将所查询的表名显示在c29标签中
c29.setText("cons");
c211.setText("会员编号");c221.setText("注册名称");c231.setText("性别");
c241.setText("出生年份");c251.setText("地址");c261.setText("电子邮箱");
}catch (Exception e1){System.out.println(e1);}
}
});
//对c12按钮添加事件监听
c12.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//连接数据库
……
//c12按钮使用的SQL语句,查询产品信息
String sql="select * from prods";
……
});
//对c13按钮添加事件监听
c13.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//连接数据库
……
//c13按钮使用的SQL语句,查询配送点信息
ResultSet rs = stmt.executeQuery("select * from sends");
……
});
//对c14按钮添加事件监听
c14.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//连接数据库
……
String t=c51.getText(); //从c51文本框中获得输入的内容
String s=c29.getText(); //从c29标签中获得需要查询的表名
String sql;
String s1="",s2="",s3="",s4="",s5="",s6="",s7="";
//根据从c29标签中获得的表名选择需要操作的表
if(s.equals("cons")){
//根据从c51文本框中获得的内容构造SQL语句
sql="select * from cons where cnum='"+t+"'";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
s1+=rs.getString(1);s2+=rs.getString(2);s3+=rs.getString(3);s4+=rs.getString(4);s5+=rs.getString( 5);s6+=rs.getString(6);
}
//将查询得到的结果显示在对应的文本框中
c52.setText(s1);c53.setText(s2);c54.setText(s3);
c55.setText(s4);c56.setText(s5);c57.setText(s6);
}
else if(s.equals("prods")){
sql="select * from prods where pnum='"+t+"'";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
s1+=rs.getString(1);s2+=rs.getString(2);s3+=rs.getString(3);s4+=rs.getString(4);s5+=rs.getString( 5);
}
c52.setText(s1);c53.setText(s2);c54.setText(s3);
c55.setText(s4);c56.setText(s5);c57.setText("");
}
else {
sql="select * from sends where snum='"+t+"'";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
s1+=rs.getString(1);s2+=rs.getString(2);s3+=rs.getString(3);
}
c52.setText(s1);c53.setText(s2);c54.setText(s3);
c55.setText("");c56.setText("");c57.setText("");
}
}catch (Exception e1){System.out.println(e1);}
}
});
//对c16按钮添加事件监听
c16.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//连接数据库
……
String t=c51.getText();
String s=c29.getText();
String sql;
//从文本框中获取数据,向数据库中插入数据
String s1=c52.getText();String s2=c53.getText();
String s3=c54.getText();String s4=c55.getText();
String s5=c56.getText();String s6=c57.getText();
if(s.equals("cons")){
sql="insert into cons(cnum,cname,sex,birth,add,eadd) values('"+s1+"','"+s2+"','"+s3+"', '"+s4+"','"+s5+"','"+s6+"')";
……
}
else if(s.equals("prods")){
sql="insert into prods(pnum,pname,a,b,supply) values('"+s1+"','"+s2+"','"+s3+"'
,'"+s4+"','"+s5+"')";
……
}
else {
sql="insert into sends(snum,sname,sadd) values('"+s1+"','"+s2+"','"+s3+"')";
……
});
//对c15按钮添加事件监听与c16类似,所使用的SQL语句如下所示:……
//从数据库中删除数据
String sql;
if(s.equals("cons")){
sql="delete from cons where cnum='"+t+"'";
……
}
else if(s.equals("prods")){
sql="delete from prods where pnum='"+t+"'";
……
}
else {
sql="delete from sends where snum='"+t+"'";
……
}……
});
// c17所使用的SQL语句如下所示:对数据库中数据进行修改
……
if(s.equals("cons")){
sql="update cons set cname='"+s2+"',sex='"+s3+"',birth='"+s4+"',add='"+s5+"',eadd='"+s6+"' where cnum='"+t+"'";
……
}
else if(s.equals("prods")){
sql="update prods set pname='"+s2+"',a='"+s3+"',b='"+s4+"',supply='"+s5+"' where pnum='"+t+"'";
……
}
else {
sql="update sends set sname='"+s2+"',sadd='"+s3+"' where snum='"+t+"'";
……
以对商品信息表操作为例,其它两个表操作类似。
运行及测试结果如下图所示:
在“基本信息管理”界面里单击“商品信息”显示如图所示:
添加信息:单击确定后,数据写进数据库并立刻显示出来:
删除信息的按钮及文本框:
输入当前所操作的表中的数据编号,单击删除,数据从数据库中删除;
修改时必须先查询,然后在文本框中修改后,单击修改,更新数据库中的数据。
(2)对“销售信息统计”界面进行设计,布局,对其中的组件的事件监听及处理。
//定义Panel b2并采用自由布局
JPanel b2=new JPanel();
b2.setLayout(null);
//设置各组件的大小及位置
c58=new JTextField("请输入查询的年份");
c58.setSize(120,25);c58.setLocation(20,30);
c210=new JLabel("年");
c210.setSize(70,25);c210.setLocation(150,30);
c59=new JTextField("请输入查询的季度");
c59.setSize(120,25);c59.setLocation(20,80);
……
//将各组件加入Panel b2
b2.add(c18);b2.add(c19);
b2.add(c110);b2.add(c111);
b2.add(c112);b2.add(c210);
b2.add(c212);b2.add(c213);
b2.add(c214);b2.add(c215);
b2.add(c216);b2.add(c218);
b2.add(c220);b2.add(c222);
b2.add(c223);b2.add(c224);
b2.add(c225);b2.add(c226);
b2.add(c42);b2.add(c58);
b2.add(c59);//b2.add(c510);
对所有组件采用相同方式的布局,并根据显示结果不断调整参数,得到最终布局如下所示:
对面板上的所有组件添加事件监听及处理程序,代码如下:
//对c18按钮添加事件监听
c18.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//连接数据库
……
//根据文本框c58中的数据构造嵌套查询SQL语句,查询年销售详单
String sql="select https://www.doczj.com/doc/6715097759.html,um,cname,sells.dat,prods.pname,num,price from cons,sells,prods, dates where https://www.doczj.com/doc/6715097759.html,um=https://www.doczj.com/doc/6715097759.html,um and prods.pnum=sells.pnum and dates.dat=sells.dat and dates.yea='"+c58.getText()+"'";
……
//显示在文本域中
c32.setText(s);
//设置列标题
c220.setText("会员编号");c222.setText("注册名称");c223.setText("购买日期");
c224.setText("商品名称");c225.setText("购买数量");c226.setText("单价");
……
});
运行结果如下图所示:
//c19按钮构造的SQL语句
……
//根据文本框c58中的数据构造统计嵌套查询SQL语句,查询年销售总额
String sql="select dates.yea,sum(sells.price*sells.num)as sum from sells,dates where sells.dat=dates.dat and dates.yea='"+c58.getText()+"' group by dates.yea";
……
运行结果如下图所示:
//c110按钮构造的SQL语句
……
//根据文本框c58和c59中的数据构造条件嵌套查询SQL语句,查询季度销售详单
String sql="select https://www.doczj.com/doc/6715097759.html,um,cname,sells.dat,prods.pname,num,price from cons,sells,prods, dates where https://www.doczj.com/doc/6715097759.html,um=https://www.doczj.com/doc/6715097759.html,um and prods.pnum=sells.pnum and dates.dat=sells.dat and dates.yea='"+c58.getText()+"' and dates.sea='"+c59.getText()+"'";
……
运行结果如下图所示:
//c111按钮构造的SQL语句
……
//根据文本框c58和c59中的数据构造统计条件嵌套查询SQL语句,查询季度销售额
String sql="select dates.sea,sum(sells.price*sells.num)as sum from sells,dates where sells.dat=dates.dat and dates.yea='"+c58.getText()+"' and dates.sea='"+c59.getText()+"' group by dates.sea";
……
运行结果如下图所示:
//c112按钮构造的SQL语句
//根据文本框c58中的数据构造统计条件嵌套查询SQL语句,查询全年各商品销量及销售额
……
String sql="select sells.pnum,prods.pname,sum(sells.num)as tnum,sum(sells.num*sells.price)
as t from sells,prods,dates where sells.pnum=prods.pnum and sells.dat=dates.dat and dates.yea='"+c58.getText()+"' group by prods.pname,sells.pnum order by sells.pnum";
……
运行结果如下图所示:
(3)主框架剩余的代码:
//将所有 Panel 加入 TabbedPane d
JTabbedPane d=new JTabbedPane();
d.addTab("销售信息统计",b2);
d.addTab("基本信息管理",b1);
//将TabbedPane d加入JFrame,并将框架显示出来
setContentPane(d);
setVisible(true);
}
//Java主函数
public static void main(String[] args) {
new Ecm();
}
}
六、系统配置
1.系统的代码文件结构
源Java代码只有一个Ecm.java,编译后生成1个Ecm.class文件,和12 个带编号的Ecm$*.class文件。与之相关联的数据库文件E_Business.mdb必须放在D驱动器的根目录下,方可读取数据。
2.系统配置
运行时需要安装Java虚拟机以jar及Java开发程序包jdk1.6.0_14,并在系统环境变量中加上..jdk\bin的路径。
3.访问方法
新建一个*.bat文件,编辑内容为java Ecm,保存后于Ecm.class放在同一目录下,运行程序时直接双击*.bat文件,即可启动Java程序运行。
七、系统维护与扩展
1.系统中的不足之处
由于时间仓促,该系统有许多不足之处,比如:操作错误后没有提示信息、文本框里的内容在使用后不能及时清空、没有设计登陆确认……这些都会给用户使用带来不便。
2.改进方案
设计管理员登陆确认界面,提高系统的安全性;在代码中加入对话框,提示用户操作,并给出出错反馈;在统计页面中加入图表,使用Java代码生成统计图,使综合数据更为直观;在数据量扩大以后,细化查询方法,提高查询效率。
八、心得体会
为期两周的课程设计中,独立完成了网上商店销售管理及统计分析系统的设计,从最基本的建立框架,Swing组件布局,到数据库操作,事件监听与处理,实现了具有可视化界面的Java应用程序的编程。
在设计系统的过程中,由于条件限制,没有使用NetBeansIDE开发工具,全部代码使用JCreator编写调试,效率很低,大量时间花费在组件的布局参数调整上。但是对于JAVA语言的特点与面向对象的程序设计的方法却有了更加深入的理解。
在实际实验操作过程中却面临着诸多阻碍。一方面由于Java语言知识的匮乏与生疏,许多最基础的知识没有弄懂,造成大量的精力耗费在查找资料的过程中,其次对数据库的操作不熟练,很多时候嵌在代码中的SQL语句发生错误,尤
其是在连接查询、分组统计时错误很多,造成程序无法执行。调试通过欣喜之余不由得百感交集,一方面看到自己独立完成的代码正常运行非常高兴,另一方面看到设计如此功能简单的系统都这样费力,可见自己的Java语言水平还非常低,还需要不断地努力去学习。
由于时间仓促,设计的系统中有许多不足之处,比如:操作错误后没有提示信息、文本框里的内容在使用后不能及时清空、没有设计登陆确认……这些都会给实际使用带来不便。其次系统功能设计过于简单,在统计页面中只是纯粹的数据加和统计,并没有给出任何的分析能力更不用说数据挖掘。作为一个信息管理系统,对数据的综合处理才是判断其好坏的关键。在这一方面自己的理论水平还远远不够。
通过本次课程设计,使我更进一步地了解了Java语言编程、系统设计、程序实现的方法。提高自己在实际操作中收集信息、对信息进行价值分析判断、进行信息整理、需求分析、信息加工、程序设计的能力;为以后的学习打下了良好的基础。
在本次课程设计中,郭建华、李建勋老师给了我很大的帮助,在此表示衷心的感谢。
参考文献
[1] 印旻《Java语言与面向对象程序设计》清华大学出版社。
[2] Bruce Eckel《Java编程思想》机械工业出版社。
[3] 王克宏《JA V A 语言API类库》,清华大学出版社。
[4] 李昌隆《中文版Dreamweaver MX 2004 标准教程》中国电力出版社2004年
[5] 杨志《Dreamweaver +ASP网络编程》电子工业出版社2008年
[6] 黄雷,杨志等《ASP+Dreamweaver+Access开发动态网站实例荟萃》机械工业出版社2006年
[7]屈喜龙,朱杰等《ASP+SQL Server开发动态网站实例荟萃》机械工业出版社2006年