JSP课程设计——民航售票管理系统

【超级超级超级超级肝的课设,发出来留个念~】

之前学数据库的时候用java简单实现了民航售票管理端以及客户端的一些功能,这次课程设计算是对上次课设的补充和完善吧,废话不多说了直接上图(有一些小小简陋,轻喷啊!)

一.主页

JSP课程设计——民航售票管理系统

emmm其实俺也编不出来那么“精致”的界面,好多都是Ctrl+c啦。logo是俺们参加挑战杯设计的,正好能拿过来用,反正就是怎么省事怎么来。

JSP课程设计——民航售票管理系统

简陋的登录界面——一开始以为挺好弄的,没想到就这一个小熊玩意儿弄了两整天才调好,又是div又是servlet又是Javabean什么什么的,代码在下面哈↓(ps:这是个固定div,有想拿走的可以自己写一下相应div属性)

1.表单

<div class="signform" id="signform" style="display: none">
                  <div class="signclose">
                      <img src="images/cuohao.png" width="35px" height="35px" onclick="signclose()">
                  </div>
                  <form action="loginServlet" method="post">
                  <div class="userdiv">
                      <input id="user" class="signinput" type="text" placeholder="手机号" name="cp" >
                  </div>
                  <div class="pwddiv">
                      <input id="pwd" class="signinput" type="password" placeholder="密码" name="cpassword">
                  </div>

                      <div class="yzmdiv">
                          <br>
                          <input id="yzm" class="" type="text" placeholder="验证码" name="code">
                          <img border=0 src="validate.jsp">
                      </div>

                  <div class="postdiv">
                      <button>登录</button>
                  </div>
                  </form>
                  <br>
                  <div class="change" style="color: #4d4d4d">
                      <p>还没有账号?赶快<a href="register.jsp" style="text-decoration: none;color: #43A047">注册</a>一个吧</p>
                  </div>
              </div>

2.css属性包(好多是无关项,俺没摘出来)

#displaysign{
    position: relative;
    top: 80px;
    width: 70px;
    height: 40px;
}
.signform {
    font-family: 微软雅黑;
    position: fixed;
    background-color: white;
    top: 20%;
    left: 30%;
    width: 500px;
    height: 400px;
    border-radius: 1em;
    text-align: center;
    z-index: 999;
}
#registerform {
    height: 450px;
}
.signclose {
    cursor: pointer;
    float: right;
    overflow: hidden;
    text-align: center;
    position: relative;
    height: 35px;
    width: 35px;
    margin-top: 10px;
    margin-right: 10px;
}
#registerloading{
    position: absolute;
    width: 25px;
    height: 25px;
    left: 410px;
    top: 90px;
}
.signinput {
    text-align: center;
    border-radius: 0.2em;
    width: 280px;
    height: 45px;
    border: none;
    background-color:#f2f2f2;
    font-size: 28px;
}
.signinput::-webkit-input-placeholder {
    font-size: 26px;
}
.userdiv {
    position: relative;
    margin-top: 80px;
}
.pwddiv {
    position: relative;
    margin-top: 20px;
}
.yzmdiv {
    position: relative;
    margin-top: 10px;
}
.postdiv {
    position: relative;
    margin-top: 20px;
}
.postdiv button {
    cursor: pointer;
    color: white;
    font-size: 26px;
    border: none;
    border-radius: 0.4em;
    width: 280px;
    height: 45px;
    background-color:#4CAF50;
}
.yyy {
    position: relative;
    margin-top: 20px;
}

#yyy {
    position: relative;
    margin-top: 20px;
}
#airbu {
    cursor: pointer;
    color: white;
    font-size: 26px;
    border: none;
    border-radius: 0.4em;
    width: 100px;
    height: 45px;
    background-color:#2e6da4;
}
#anum {
    position: relative;
    margin-top: 40px;
}
#airbua {
    cursor: pointer;
    color: white;
    font-size: 26px;
    border: none;
    border-radius: 0.4em;
    width: 200px;
    height: 45px;
    background-color:#2e6da4;
}
#airbub {
    cursor: pointer;
    color: white;
    font-size: 26px;
    border: none;
    border-radius: 0.4em;
    width: 320px;
    height: 45px;
    background-color:#ac2925;
}
#airbuc {
    cursor: pointer;
    color: white;
    font-size: 26px;
    border: none;
    border-radius: 0.4em;
    width: 170px;
    height: 45px;
    background-color:#67b168;
}
#airbud {
    cursor: pointer;
    color: white;
    font-size: 26px;
    border: none;
    border-radius: 0.4em;
    width: 480px;
    height: 45px;
    background-color:#d58512;
}

#airbue {
    cursor: pointer;
    color: white;
    font-size: 26px;
    border: none;
    border-radius: 0.4em;
    width: 180px;
    height: 45px;
    background-color:#4e4f51;
}

.airfont {
    font-family: 微软雅黑;
    color: #4e4f51;
    size: 4px;
    font-weight: bold;
}
.aircheck {
    font-family: 微软雅黑;
    color: orangered;
    size: 4px;
    font-weight: bold;
}


.checklist{
    color: #222222;
    font-weight: bold;
    font-family: 微软雅黑;
}

 3.登录servlet(LoginServlet.java)

package com.test.servlet;
import java.sql.*;
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.test.jdbc.SqlSrvDBConn;
import com.test.model.vo.UserTable;

public class LoginServlet extends HttpServlet{
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
      request.setCharacterEncoding("gb2312");	//设置请求编码
      String cp=request.getParameter("cp");//获取提交的用户名
      String cpassword=request.getParameter("cpassword");//获取提交的密码
      boolean validated=false; //验证成功标识
      SqlSrvDBConn sqlsrvdb=new SqlSrvDBConn();
      HttpSession session=request.getSession();//获得会话对象,用来保存当前登录用户的信息
      UserTable user=null; //先获得UserTable对象,如果是第一次访问该页,用户对象肯定为空,但如果是第二次甚至是第三次,就直接登录主页而无须再次重复验证该用户的信息
      user=(UserTable)session.getAttribute("user");
      //如果用户是第一次进入,会话中尚未存储user持久化对象,故为null
      if(user==null){
    	//查询userTable表中的记录
    	String sql="select * from userTable";
    	ResultSet rs=sqlsrvdb.executeQuery(sql); //取得结果集
        try{
	  while(rs.next()){
	    if((rs.getString("cp").trim().compareTo(cp)==0)&&(rs.getString("cpassword").compareTo(cpassword)==0)){
	      user=new UserTable(); //创建持久化的JavaBean对象user
	      user.setCname(rs.getString(1));
	      user.setCsex(rs.getString(2));
	      user.setCid(rs.getString(3));
	      user.setCaddress(rs.getString(4));
	      user.setCvip(rs.getString(5));
	      user.setCp(rs.getString(6));
	      user.setCpassword(rs.getString(7));
	      session.setAttribute("user",user);//把user对象存储在会话中
	      validated=true;	//标识为true表示验证成功通过
	    }
	  }
	  rs.close();
        }catch(SQLException e){
	  e.printStackTrace();
	}
    	sqlsrvdb.closeStmt();
    	sqlsrvdb.closeConn();
      }else{
        validated=true;	//该用户在之前已登录过并成功验证,故标识为true表示无须再验了
      }

        String code=request.getParameter("code");
        //获取session中的验证码
        String randStr=(String)session.getAttribute("randStr");
        response.setCharacterEncoding("gb2312");
        PrintWriter out=response.getWriter();

      if(validated && code.equals(randStr)){   //验证成功跳转到main.jsp
        response.sendRedirect("index2.jsp");
      }else{  //验证失败跳转到error.jsp
       	response.sendRedirect("error.jsp");
      }
    }
	
    public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
      doGet(request,response);

    }
}


4.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
        <servlet>
            <servlet-name>LoginServlet</servlet-name>
            <servlet-class>com.test.servlet.LoginServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>LoginServlet</servlet-name>
            <url-pattern>/loginServlet</url-pattern>
        </servlet-mapping>
</web-app>

 5.验证码(validate.jsp)

<%@page language="java" import="java.awt.*,java.awt.image.BufferedImage,java.util.*,javax.imageio.ImageIO" pageEncoding="gb2312"%>
<%
  response.setHeader("Cache-Control","no-cache");
  // 在内存中创建图象 
  int width=60,height=20;
  BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  //获取画笔
  Graphics g=image.getGraphics();
  //设定背景色 
  g.setColor(new Color(200,200,200));
  g.fillRect(0,0,width,height);
  //取随机产生的验证码(4位数字) 
  Random rnd=new Random();
  int randNum=rnd.nextInt(9000)+1000;
  String randStr=String.valueOf(randNum);
  //将验证码存入session
  session.setAttribute("randStr",randStr);
  //将验证码显示到图象中 
  g.setColor(Color.black);
  g.setFont(new Font("",Font.PLAIN,20));
  g.drawString(randStr,10,17);
  //随机产生100个干扰点,使图象中的验证码不易被其他程序探测到 
  for(int i=0;i<100;i++){
    int x=rnd.nextInt(width);
    int y=rnd.nextInt(height);
    g.drawOval(x,y,1,1);
  }
  //输出图象到页面 
  ImageIO.write(image,"JPEG",response.getOutputStream());
  out.clear();
  out=pageContext.pushBody();
%>

二. 功能界面

1.ER图以及流程图

JSP课程设计——民航售票管理系统

JSP课程设计——民航售票管理系统

 

JSP课程设计——民航售票管理系统

 

JSP课程设计——民航售票管理系统

 

JSP课程设计——民航售票管理系统

 

 2.功能简介

(1)客户端:

客户可以通过登录该系统进行航班的查询,其查询方式分为“按日期查询”、“按起始地与目的地查询”、“按日期,起始地与目的地查询”以及“查询所有航班”四种,用户可以通过各种查询渠道得到符合条件的航班信息,并且能根据自己的需求进行购票。在购票界面,用户可以自行挑选客机座位号,并存入自己的订单里。在购票操作中,普通用户原价购买商品,而vip客户可享受8折优惠,另外非会员客户也能办理vip项目。

每个客户有自己的风航空间,在各自的空间里可以更改用户名、密码等信息。

(2)管理端:

管理员可以通过登录管理系统进行机票的查询,其查询方式分为“按日期查询”、“按起始地与目的地查询”、“按日期,起始地与目的地查询”以及“查询所有航班”四种,管理员可以通过各种渠道得到符合条件的机票信息,并且能根据需求进行机票的增删改操作等等。

3.界面展示

JSP课程设计——民航售票管理系统

JSP课程设计——民航售票管理系统

 

JSP课程设计——民航售票管理系统

 

(整套流程如下)


JSP课程设计——民航售票管理系统

 

 

JSP课程设计——民航售票管理系统

JSP课程设计——民航售票管理系统

 

JSP课程设计——民航售票管理系统

 4.机票信息显示界面代码(仅关键部分代码)

 <% request.setCharacterEncoding("utf-8");
                    if(session.getAttribute("ad")==null) {
                        String ayear = request.getParameter("year");
                        String amonth = request.getParameter("month");
                        String aday = request.getParameter("day");
                        String ad = ayear + amonth + aday;
                        session.setAttribute("ad", ad);
                        out.print(ayear + "年" + amonth + "月" + aday + "日的航班");
                    }
                        String ad1 = (String) session.getAttribute("ad");

                    %>
                    <table border="1" width="700" bgcolor="#b0e0e6"  align="center">
                        <tr><th>序号</th><th>航班号</th><th>logo</th>
                            <th>航空公司</th><th>始发地</th><th>目的地</th><th>起飞时间</th>
                            <th>余票</th><th>。。。</th>
                        </tr>
                        <%



                            String url="jdbc:sqlserver://localhost:1433;databaseName=fenghang";
                            String sqluser="sa";
                            String password="123456";
                            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                            Connection conn=DriverManager.getConnection(url,sqluser,password);

                            int pageSize;   //一页显示的记录数
                            int totalSize;   //记录总数
                            int totalPage;  //总页数
                            int currentPage;       //待显示页码
                            String strPage;
                            int i,id;
                            pageSize=10; //设置一页显示的记录数
                            strPage=request.getParameter("page"); //取得待显示页码
                            if(strPage==null){
                                currentPage=1;
                            }else{
                                currentPage=Integer.parseInt(strPage); //将字符串转换成整型
                            }
                            Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                    ResultSet.CONCUR_READ_ONLY);
                            String  sql="select * from 航班表 where ad='"+ ad1 +"'";
                            ResultSet  rs=stmt.executeQuery(sql);
                            rs.last(); //光标指向查询结果集中最后一条记录
                            totalSize=rs.getRow(); //获取记录总数
                            totalPage=(totalSize+pageSize-1)/pageSize; //记算总页数

                            if(totalPage>0){
                                rs.absolute((currentPage-1)*pageSize+1);//将记录指针定位到待显示页的第一条记录上
                                i=0;
                                id=(currentPage-1)*pageSize+1;
                                String cNum;
                                while(i<pageSize && !rs.isAfterLast()){
                                    cNum=rs.getString("anum");
                        %>
                        <tr>
                            <td align="center"><a class="airfont"><%=id%></a></td>
                            <td align="center"><a class="airfont"><%=cNum%></a></td>
                            <td align="center"><img src="../images/air/<%=rs.getString("acom")%>.jpg" width="50px" height="50px"></td>
                            <td align="center"><a class="airfont"><%=rs.getString("acom")%></a></td>
                            <td align="center"><a class="airfont"><%=rs.getString("asta")%></a></td>
                            <td align="center"><a class="airfont"><%=rs.getString("ades")%></a></td>
                            <td align="center"><a class="airfont"><%=rs.getString("ad")%></a></td>
                            <td align="center"><a class="airfont"><%=rs.getString("are")%></a></td>
                            <td align="center"><a class="aircheck" href="<% String ppare=rs.getString("are");
                                if (ppare.equals("0"))
                    out.print("../air/nt.jsp");
                            else
                                out.print("../check/ccc.jsp?anum="+cNum);%>">查看</a></td>
                        </tr>
                        <%
                                    rs.next();
                                    i++;id++;
                                }
                            }
                        %>
                    </table>
                    <br>
                    <div align="center">
                        <a style="font-size: x-large;color: slateblue">第<%=currentPage%>页 ,共<%=totalPage%>页</a>
                        <%
                            if(currentPage>1){
                        %>
                        <button id="airbu"><a href="danum1.jsp?page=1&ad=<%=ad1%>" style="color: ghostwhite">第一页</a></button>
                        <button id="airbu"><a href="danum1.jsp?page=<%=currentPage-1%>&ad=<%=ad1%>" style="color: ghostwhite">上一页</a></button>
                        <%
                            }
                            if(currentPage<totalPage){
                        %>
                        <button id="airbu"><a href="danum1.jsp?page=<%=currentPage+1%>&ad=<%=ad1%>" style="color: ghostwhite">下一页</a></button>
                        <button id="airbu"><a href="danum1.jsp?page=<%=totalPage%>&ad=<%=ad1%>" style="color: ghostwhite">尾页</a></button>
                        <%
                            }
                            rs.close();
                            stmt.close();
                            conn.close();
                        %>

 三.参考文献

[1] 耿祥义等.Java2实用教程(第五版)[M].北京:清华大学出版社,2017

[2] 耿祥义等.JSP实用教程(第4版)[M].北京:清华大学出版社,2021

[3] 储久良等.Web前端开发技术——HTML、CSS、JavaScript(第2版)[M].北京:清华大学出版社,2017

[4] 云婷.价值链视角下在线票务服务企业O2O盈利模式研究——以携程网为例 [D].呼和浩特:内蒙古农业大学,2021:6.

四.系统说明

1.本系统需搭载jdk1.8与Tomcat9.0服务器进行运行

2.本系统的最好通过IntelliJ IDEA进行编译及运行,也可通过eclipse运行,但需要修改相关文件(web文件夹重命名为webContent文件夹等等)。

3.本系统src文件夹里存放相关java文件,web文件夹里存放视图相关文件。

4.大致文件结构:

①air目录:客户查询航班类文件

②check目录:购票类文件

③css目录:相关css文件

④customer目录:用户空间及订单类文件

⑤images目录:图片文件

⑥js目录:相关js文件

⑦manager:管理员操作类文件

⑧index.jsp:系统主页

5.数据库要使用Microsoft SQL Server,并将相关文件导入数据库。

五.搞一波小外宣啦!

这是俺的b站嗷,三连三连懂~

<iframe allowfullscreen="true" data-mediaembed="bilibili" id="RcSAbT2B-1643786076176" src="https://player.bilibili.com/player.html?aid=330772544"></iframe>

18,19

六.再有什么问题留言问就好啦,也希望得到各路大佬的指点!

上一篇:Rolling cURL: PHP并发最佳实践


下一篇:AtCoder Beginner Contest 237题解