目录
- 需求分析
1 概述
2 课题分析
3 实现功能步骤
4 项目背景
- 概要设计
1 系统流程图.
2 功能模块.
3 各功能模块
4 数据存储
5 类设计
三、详细设计
1公交线路查询系统用户界面
2公交信息存储模快
3公交信息查询模块
4用户信息输入和输出模块
四、调试分析
五、使用说明
六、测试结果
七、参考文献
八、附录
一 需求分析
(1)概述
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
(2)课题分析
公交线路查询系统,面向的是用户,即为用户提供方便的公交线路查询信息。他所要求提供的功能如下:
(1)公交线路查询:
用户输入公交车次号码,启动查询,可获得该路车属性(包括该路公交车:服务
类型:有\无人售票;车型:普通\空调车;收发车时间。其中,服务类型和车型缺省为有人售票和普通车)及沿线站点信息。
(2)站点查询:
用户输入站点(以任意方式) ,启动查询,可获得经过该站所有公交车次及其属性。
(3)乘车方案查询:
用户输入起点、终点(以任意方式) ,系统经过查询返回所有相关站点,用户分别确认后, 查询启动。 用户可获得所有可达线路的路线信息 (所有直达\转乘的方案) 。
由于,本次课设时间有限,仅做公交线路查询系统中的,乘车方案查询。
(3)实现功能步骤
该系统的前台用java设计,要求有较为完善的用户界面,能为用户提供优质的公交线路查询功能,具体要求的输入信息如下:
1.乘车起点
2.目的终点
该系统的后台用数据库设计,即为要求在数据库内实现公交信息的存储(车次信息,线路信息等),并且要实现公交线路的查询,可以用数据库中的存储过程来实现该功能。
所以该系统的实现功能步骤如下:
1.数据库设计,公交信息的存储,建立表。
2.存储过程的设计,用来实现公交线路的查询。
3.界面前台的设计,用来接收用户信息和传递信息给SQL;
(4) 项目背景
在信息爆炸和计算机快速发展的时代,简单的看地图查公交的方式应该一去而不复返,如今,用户只需输入起始站点和目的站点,便可在很少的时间查出所需的线路信息,大大的方便的人们的出行生活。
二.概要设计
(1)系统流程图
- 功能模块图
(3)各个模块的功能
- 公交信息存储模块
在这个模块中主要实现的功能是一个建立一个工程,将用户输入的公交信息放入到数据库中。
- 公交信息查询模块
在这个模块中主要实现的功能是一个查询信息的函数,通过输入所查询的车次信息来查询数据库中的信息。
- 用户信息输入和输出模块
在这个模块中主要是实现用户界面和信息的输入输出
- 数据存储
显然,如果在数据库中简单的使用表bus_route(路线名,路线经过的站点,费用)来保存公交车路线的线路信息,则很难使用查询语句实现乘车线路查询,因此,应该对线路的信息进行处理后再保存到数据库中,使用的方法是用站点-路线关系表stop_route(站点,路线名,站点在路线中的位置)来存储公交车路线
- 类设计
InsertRecord //插入信息类
ModifyRecord //更改信息类
SearchRecord //查询信息类
Show1Record //用户界面类
三.详细设计
(1)公交线路查询系统用户界面
核心代码:
package book;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SearchRecord extends JDialog implements ActionListener
{
JLabel hintLabel,hintLabel1;
JTextField inputNumber,inputNumber1;
JButton enter;
JTextArea x;
Connection con;
Statement sql;
ResultSet rs;
SearchRecord(String title){
hintLabel=new JLabel("始发站:");
hintLabel1=new JLabel("终点站:");
inputNumber=new JTextField(20);
inputNumber1=new JTextField(20);
enter=new JButton("查询线路");
x = new JTextArea(50, 50);
x.setBackground(Color.LIGHT_GRAY);
setLayout(null);
Box baseBox=Box.createHorizontalBox();
Box baseBox1=Box.createHorizontalBox();
baseBox.add(hintLabel);
baseBox.add(inputNumber);
baseBox.add(hintLabel1);
baseBox.add(inputNumber1);
baseBox.add(enter);
baseBox1.add(x);
add(baseBox);
add(baseBox1);
baseBox.setBounds(100,40,400,38);
baseBox1.setBounds(100,80,500,100);
enter.addActionListener(this);
setBounds(20,60,750,250);
}
(2)公交信息存储模快
如果有以下3条路线
R1: S1->S2->S3->S4->S5
R2: S6->S7->S2->S8
R3: S8->S9->S10
则对应的站点-路线关系表stop_route为
Stop | Route | Position |
S1 | R1 | 1 |
S2 | R1 | 2 |
S3 | R1 | 3 |
S4 | R1 | 4 |
S5 | R1 | 5 |
S6 | R2 | 1 |
S7 | R2 | 2 |
S2 | R2 | 3 |
S8 | R2 | 4 |
S8 | R3 | 1 |
S9 | R3 | 2 |
S10 | R3 | 3 |
注:Stop为站点名,Route为路线名,Position为站点在路线中的位置
(3)公交信息查询模块
(1)直达路线视图
直达路线视图可以理解为一张存储了所有直达路线的表(如果两个站点之间存在直达路线,那么在直达路线视图中就有一行与之相对应)。例如R1,R2,R3对应的RouteT0如下:
起点 | 终点 | 乘坐路线 | 站点数 |
S3 | S4 | R1 | 1 |
S3 | S5 | R1 | 2 |
S4 | S5 | R1 | 1 |
S1 | S2 | R1 | 1 |
S1 | S3 | R1 | 2 |
S1 | S4 | R1 | 3 |
S1 | S5 | R1 | 4 |
S2 | S3 | R1 | 1 |
S2 | S4 | R1 | 2 |
S2 | S5 | R1 | 3 |
S2 | S8 | R2 | 1 |
S6 | S2 | R2 | 2 |
S6 | S7 | R2 | 1 |
S6 | S8 | R2 | 3 |
S7 | S2 | R2 | 1 |
S7 | S8 | R2 | 2 |
S8 | S10 | R3 | 2 |
S8 | S9 | R3 | 1 |
S9 | S10 | R3 | 1 |
RouteT0定义如下:
create view RouteT0
as
select
sr1.Stop as StartStop, --启始站点
sr2.Stop as EndStop, --目的站点
sr1.Route as Route, --乘坐线路
sr2.Position-sr1.Position as StopCount --经过的站点数
from
stop_route sr1,
stop_route sr2
where
sr1.Route=sr2.Route
and sr1.Position<sr2.Position
(2)换乘路线算法
显然,一条换乘路线由若干段直达路线组成,因此,基于直达路线视图RouteT0可以很方便实现换乘查询,以下是实现一次换乘查询的存储过程InquiryT1:
create proc InquiryT1(@StartStop varchar(32),@EndStop varchar(32))
as
begin
select
r1.StartStop as 启始站点,
r1.Route as 乘坐路线1,
r1.EndStop as 中转站点,
r2.Route as 乘坐路线2,
r2.EndStop as 目的站点,
r1.StopCount+r2.StopCount as 总站点数
from
RouteT0 r1,
RouteT0 r2
where
r1.StartStop=@StartStop
and r1.EndStop=r2.StartStop
and r2.EndStop=@EndStop
end
同理可以得到二次换乘的查询语句
create proc InquiryT2(@StartStop varchar(32),@EndStop varchar(32))
as
begin
select
r1.StartStop as 启始站点,
r1.Route as 乘坐路线1,
r1.EndStop as 中转站点1,
r2.Route as 乘坐路线2,
r2.EndStop as 中转站点2,
r3.Route as 乘坐路线3,
r3.EndStop as 目的站点,
r1.StopCount+r2.StopCount+r3.StopCount as 总站点数
from
RouteT0 r1,
RouteT0 r2,
RouteT0 r3
where
r1.StartStop=@StartStop
and r1.EndStop=r2.StartStop
and r2.EndStop=r3.StartStop
and r3.EndStop=@EndStop
end
(4)用户信息输入和输出模块
四.调试分析
(1)调试过程中所遇到的问题及解决方法
1)无法设计出信息存储结构,不过通过参阅资料有所心得
(2)经验与体会
通过这两周的课程设计,让我明白软件设计的分层结构,即是从需求设计,到概要设计,再到详细设计,而面层设计里有必须分层,即是把问题的简化。
五.用户使用说明
(1)打开用户界面
(2)输入查询信息
exec InquiryT0 'S1','S2'
exec InquiryT1 'S1','S8'
exec InquiryT2 'S1','S9'
七.参考文献
《Java》大学实用教程学习指导
作者:张跃平 耿祥义
出版社:电子工业出版社
八.附录
数据库设计代码:
1.
create proc InquiryT0(@StartStop varchar(32),@EndStop varchar(32))
as
begin
select
sr1.Stop as 启始站点,
sr2.Stop as 目的站点,
sr1.Route as 乘坐线路,
sr2.Position-sr1.Position as 经过的站点数
from
stop_route sr1,
stop_route sr2
where
sr1.Route=sr2.Route
and sr1.Position<sr2.Position
and sr1.Stop=@StartStop
and sr2.Stop=@EndStop
end
2. create view RouteT0
as
select
sr1.Stop as StartStop, --启始站点
sr2.Stop as EndStop, --目的站点
sr1.Route as Route, --乘坐线路
sr2.Position-sr1.Position as StopCount --经过的站点数
from
stop_route sr1,
stop_route sr2
where
sr1.Route=sr2.Route
and sr1.Position<sr2.Position
3. create proc InquiryT1(@StartStop varchar(32),@EndStop varchar(32))
as
begin
select
r1.StartStop as 启始站点,
r1.Route as 乘坐路线1,
r1.EndStop as 中转站点,
r2.Route as 乘坐路线2,
r2.EndStop as 目的站点,
r1.StopCount+r2.StopCount as 总站点数
from
RouteT0 r1,
RouteT0 r2
where
r1.StartStop=@StartStop
and r1.EndStop=r2.StartStop
and r2.EndStop=@EndStop
end
4. create proc InquiryT2(@StartStop varchar(32),@EndStop varchar(32))
as
begin
select
r1.StartStop as 启始站点,
r1.Route as 乘坐路线1,
r1.EndStop as 中转站点1,
r2.Route as 乘坐路线2,
r2.EndStop as 中转站点2,
r3.Route as 乘坐路线3,
r3.EndStop as 目的站点,
r1.StopCount+r2.StopCount+r3.StopCount as 总站点数
from
RouteT0 r1,
RouteT0 r2,
RouteT0 r3
where
r1.StartStop=@StartStop
and r1.EndStop=r2.StartStop
and r2.EndStop=r3.StartStop
and r3.EndStop=@EndStop
end
java
package book;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SearchRecord extends JDialog implements ActionListener
{
JLabel hintLabel,hintLabel1;
JTextField inputNumber,inputNumber1;
JButton enter;
JTextArea x;
Connection con;
Statement sql;
ResultSet rs;
SearchRecord(String title){
hintLabel=new JLabel("始发站:");
hintLabel1=new JLabel("终点站:");
inputNumber=new JTextField(20);
inputNumber1=new JTextField(20);
enter=new JButton("查询线路");
x = new JTextArea(50, 50);
x.setBackground(Color.LIGHT_GRAY);
setLayout(null);
Box baseBox=Box.createHorizontalBox();
Box baseBox1=Box.createHorizontalBox();
baseBox.add(hintLabel);
baseBox.add(inputNumber);
baseBox.add(hintLabel1);
baseBox.add(inputNumber1);
baseBox.add(enter);
baseBox1.add(x);
add(baseBox);
add(baseBox1);
baseBox.setBounds(100,40,400,38);
baseBox1.setBounds(100,80,500,100);
enter.addActionListener(this);
setBounds(20,60,750,250);
}
package book;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SearchRecord extends JDialog implements ActionListener
{
JLabel hintLabel,hintLabel1;
JTextField inputNumber,inputNumber1;
JButton enter;
JTextArea x;
Connection con;
Statement sql;
ResultSet rs;
SearchRecord(String title){
hintLabel=new JLabel("始发站:");
hintLabel1=new JLabel("终点站:");
inputNumber=new JTextField(20);
inputNumber1=new JTextField(20);
enter=new JButton("查询线路");
x = new JTextArea(50, 50);
x.setBackground(Color.LIGHT_GRAY);
setLayout(null);
Box baseBox=Box.createHorizontalBox();
Box baseBox1=Box.createHorizontalBox();
baseBox.add(hintLabel);
baseBox.add(inputNumber);
baseBox.add(hintLabel1);
baseBox.add(inputNumber1);
baseBox.add(enter);
baseBox1.add(x);
add(baseBox);
add(baseBox1);
baseBox.setBounds(100,40,400,38);
baseBox1.setBounds(100,80,500,100);
enter.addActionListener(this);
setBounds(20,60,750,250);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()== enter){
String a,b;
a=inputNumber.getText();
b=inputNumber1.getText();
try{
con=DriverManager.getConnection("jdbc:odbc:hello1","","");
sql=con.createStatement();
rs=sql.executeQuery("");
}
catch{
}
}
}
}mport javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
public class Example12_9{
public static void main(String args[ ]){
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e){
System.out.println(""+e);
}
DatabaseWin win=new DatabaseWin();
}
}
class DatabaseWin extends JFrame implements ActionListener{
JButton itemUpdate,itemInsert,itemShow1,itemSearch;
Show1Record show1Record;
ModifyRecord modifyRecord;
InsertRecord insertRecord;
SearchRecord searchRecord;
DatabaseWin(){
itemUpdate=new JButton("修改公交信息");
itemInsert=new JButton("插入公交信息");
itemShow1=new JButton("显示公交信息");
itemSearch=new JButton("查询公交信息");
itemUpdate.addActionListener(this);
itemInsert.addActionListener(this);
itemShow1.addActionListener(this);
itemSearch.addActionListener(this);
FlowLayout flow=new FlowLayout();
flow.setAlignment(FlowLayout.LEFT);
flow.setHgap(20);
flow.setVgap(20);
setLayout(flow);
add(itemShow1);
add(itemUpdate);
add(itemInsert);
add(itemSearch);
modifyRecord=new ModifyRecord("修改公交信息");
insertRecord=new InsertRecord("插入公交信息");
show1Record=new Show1Record("显示公交信息");
searchRecord=new SearchRecord("查询公交线路");
setBounds(100,100,300,200);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e){
package book;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.border.*;
public class InsertRecord extends JDialog implements ActionListener{ //负责插入记录的类
JLabel hintLabel;
Object name[]={"车次","始发站","途经站1","途经站2","途经站3","途经站4","途经站5","终点站","始发时间","收车时间"};
Object a[][]=new Object[1][10];
JTable table;
JButton enterInsert;
Connection con;
Statement sql;
ResultSet rs;
String num;
InsertRecord(String s){
setTitle(s);
hintLabel=new JLabel("输入新记录:");
table=new JTable(a,name);
enterInsert=new JButton("插入新记录");
setLayout(null);
Box baseBox=Box.createHorizontalBox();
Box baseBox1=Box.createHorizontalBox();
baseBox.add(hintLabel);
baseBox1.add(new JScrollPane(table));
baseBox1.add(enterInsert);
add(baseBox);
add(baseBox1);
baseBox.setBounds(10,40,700,38);
baseBox1.setBounds(10,80,700,38);
enterInsert.addActionListener(this);
setBounds(120,160,800,200);
}
public void actionPerformed(ActionEvent e){
try{ con=DriverManager.getConnection("jdbc:odbc:hello1","","");
sql=con.createStatement();
int k=sql.executeUpdate
("INSERT INTO 公交信息 VALUES('"+
a[0][0]+"','"+a[0][1]+"','"+a[0][2]+"','"+a[0][3]+"','"+a[0][4]+"'," +
"'"+a[0][5]+"','"+a[0][6]+"','"+a[0][7]+"','"+a[0][8]+"','"+a[0][9]+"')");
if(k==1)
JOptionPane.showMessageDialog
(this,"插入信息成功","成功",JOptionPane.PLAIN_MESSAGE);
con.close();
}
catch(SQLException ee){
JOptionPane.showMessageDialog
(this,"插入信息失败"+ee,"失败",JOptionPane.ERROR_MESSAGE);
}
}
}
package book;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.border.*;
public class ModifyRecord extends JDialog implements ActionListener{ //负责更新记录的类
JLabel hintLabel;
JTextField inputNumber;
Object name[]={"车次","始发站","途经站1","途经站2","途经站3","途经站4","途经站5","终点站","始发时间","收车时间"};
Object a[][]=new Object[1][10];
JTable table;
JButton enterModify;
Connection con;
Statement sql;
ResultSet rs;
String num;
ModifyRecord(String s){
setTitle(s);
hintLabel=new JLabel("输入编号(回车确认):");
inputNumber=new JTextField(20);
table=new JTable(a,name);
enterModify=new JButton("更新信息");
setLayout(null);
Box baseBox=Box.createHorizontalBox();
Box baseBox1=Box.createHorizontalBox();
baseBox.add(hintLabel);
baseBox.add(inputNumber);
baseBox1.add(new JScrollPane(table));
baseBox1.add(enterModify);
add(baseBox);
add(baseBox1);
baseBox.setBounds(50,40,200,38);
baseBox1.setBounds(50,80,900,38);
inputNumber.addActionListener(this);
enterModify.addActionListener(this);
setBounds(20,60,1000,200);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==inputNumber)
try{ num=inputNumber.getText().trim();
con=DriverManager.getConnection("jdbc:odbc:hello1","","");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM 公交信息 WHERE 车次='"+num+"'");
//else
//rs=sql.executeQuery("SELECT * FROM 客队球员信息 WHERE 编号='"+num+"'");
boolean boo=rs.next();
if(boo==false){
JOptionPane.showMessageDialog
(this,"公交不存在","提示",JOptionPane.WARNING_MESSAGE);
}
else{
a[0][0]=rs.getString(1);
a[0][1]=rs.getString(2);
a[0][2]=rs.getString(3);
a[0][3]=rs.getString(4);
a[0][4]=rs.getString(5);
a[0][5]=rs.getString(6);
a[0][6]=rs.getString(7);
a[0][7]=rs.getString(8);
a[0][8]=rs.getString(9);
a[0][9]=rs.getString(10);
table.repaint();
}
con.close();
}
catch(SQLException ee){
System.out.println(ee);
}
if(e.getSource()==enterModify){
try{ con=DriverManager.getConnection("jdbc:odbc:hello1","","");
sql=con.createStatement();
sql.executeUpdate
("UPDATE 公交信息 SET 始发站='"+a[0][0]+
"',途经站1='"+a[0][1]+"',途经站2='"+a[0][2]+"',途经站3='"+a[0][3]+"',途经站4='"+a[0][4]+"',途经站5='"+a[0][5]+"',终点站='"+a[0][6]+
"',始发时间='"+a[0][7]+"',收车时间='"+a[0][8]+"'WHERE 车次='"+num+"'");
JOptionPane.showMessageDialog
(this,"更新成功","成功",JOptionPane.PLAIN_MESSAGE);
con.close();
}
catch(SQLException ee){
JOptionPane.showMessageDialog
(this,"更新失败"+ee,"失败",JOptionPane.ERROR_MESSAGE);
}
}
}
}