• 公交查询系统


    目录

    • 需求分析

    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)系统流程图

          

       

    1. 功能模块图

    (3)各个模块的功能

    1. 公交信息存储模块

    在这个模块中主要实现的功能是一个建立一个工程,将用户输入的公交信息放入到数据库中。

    1. 公交信息查询模块

    在这个模块中主要实现的功能是一个查询信息的函数,通过输入所查询的车次信息来查询数据库中的信息。

    1. 用户信息输入和输出模块

              在这个模块中主要是实现用户界面和信息的输入输出

    1. 数据存储

    然,如果在简单的使用表bus_route(线,路线经过的站点,用)保存公交线线路信息,使用查询语实现车线查询,因此,应该对线路的信息理后再保存到中,使用的方法是用站点-路线关系表stop_route(站点,路线,站点在路线中的位置)公交线

    1. 类设计

    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

    (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

            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

    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);

               }    

          }

        }      

    }

  • 相关阅读:
    微信如何实现自动转发朋友圈(跟圈)?
    离散制造业生产域制造资源数据标准化及治理建设思路
    一些常用的兼容性测试方法和技巧
    数据工程师日记:10年职场老鸟,我居然被新人给上了一课
    flutter TabBar指示器
    定时器及其应用
    【外汇天眼】美国CFTC官方发布:外汇交易前你应该知道的八件事
    医疗保健领域的 7 个拯救生命的 AI 用例。从早期疾病检测到增强医疗决策再到更好的患者治疗效果——这就是人工智能技术如何改变医疗保健行业。
    springcloud gateway网关浅析
    2022-08-05:以下go语言代码输出什么?A:65, string;B:A, string;C:65, int;D:报错。
  • 原文地址:https://blog.csdn.net/qq_61141142/article/details/132893698