数据库课程设计报告(汽车租赁管理系统).docx
一 系统简介 本系统为汽车租赁系统,采用B/S实现。可以实现不同权限的浏览和管理。管理员可以用于汽车租赁公司对汽车租赁事务的管理,包括新增、删除车辆记录,新增、删除用户记录,新增、删除租赁信息记录,新增、删除管理人员记录以及会员设置,客户则可以浏览车辆信息和个人的租车信息。 主要技术:jsp运行环境:winows os+apache tomcat5.5+sql server 2005+jdk1.6开发软件:myeclipse6.0.1开源软件:jxl.jar,sqljdbc4.jar二 数据库设计1. 需求分析因为客户只能亲自到汽车租赁公司去注册或租赁车辆,因而,两者权限分配如下:汽车公司方面:能够对车辆,租赁信息和用户信息进行管理。超级管理员还可以对公司内部人员的信息进行管理客户方面:只能浏览车辆信息和个人用户信息及个人租赁信息。数据流图如下: 管理员客户新增客户个人信息用户信息文件车辆新增交易车辆信息交易信息文件个人信息新增车辆车辆信息文件新增管理员内部人员管理人员信息文件2. 概念设计ER图如下所示: 管理员管理车辆车辆租用车辆客 户1N管理用户工号用户名类型密码编号类型状态起租时间单价租用时间编号客户编号车辆编号经手人员起租时间押金租用时间返回金额状态证件号用户名会员类型密码MNnm信誉度3. 逻辑设计建表语句如下:用户表:/后为各字段意义声明create table userinfo( pid varchar(8) primary key, /用户证件号 username varchar(8), /用户名 isvip int, /用户类型,是否为会员 xingyu int, /信誉度,满分100。 password varchar(8) /用户登录密码);管理员表:create table manager( wid varchar(8) primary key, /管理员工号 type int, /类型,超级管理员(部门经理等)和普通管理员 username varchar(8), /管理员用户名 password varchar(8) /管理员密码);车辆表:create table taxi( tid varchar(8) primary key,/车辆编号 type varchar(8), /车辆类型 state varchar(8), /车辆状态,是否可租 wid varchar(8), / year int, /起租年月日 month int, day int, time int, detailinfo text, /车辆详细信息 pay int /租用单价);租车信息表create table rentinfo( rid int identity(1,1) primary key, /交易编号 wid varchar(8), /经手人员 pid varchar(8), /客户证件号 tid varchar(8),/ 车辆号码 yajin int, /押金 backmoney int, /返还金额 pay int,/单价 broken varchar(8),/破坏情况 outyear int,/结束交易时间 outmonth int, outday int, time int,/实际使用时间 state varchar(8)/交易状态 );-设置外键BEGIN TRANSACTIONalter table dbo.rentinfo add constraint FK_rentinfo_tidforeign key (tid)references dbo.taxi(tid) alter table dbo.rentinfo add constraint FK_rentinfo_pidforeign key (pid)references dbo.userinfo(pid) alter table dbo.rentinfo add constraint FK_rentinfo_widforeign key (wid)references dbo.manager(wid) COMMIT TRANSACTION4. 数据库建立与备份,恢复在sql server 2005 建立一个数据库,名称为hello,执行以上建表语句即可。或者将hello.mdf,hello_log.ldf文件恢复。sp_attach_db 'hello', 'C:Program FilesMicrosoft SQL ServerMSSQLDatahello.mdf', 'C:Program FilesMicrosoft SQL ServerMSSQLDatahello_log.ldf' sp_attach_single_file_db 'hello','C:Program FilesMicrosoft SQL ServerMSSQLDatahello.mdf'备份:将hello数据库备份成hello.bak文件三 框架实现 系统总体框架实现如下图所示: 不同权限的用户登录超级管理员内部人员管理客户信息管理车辆信息管理普通管理员客户信息管理车辆信息管理客户个人信息浏览车辆信息浏览租车信息浏览财务信息管理财务信息管理以下是各模块的子功能截图:登录模块截图: 超级管理员页面截图:普通管理员页面截图:员工信息管理页面截图:员工 信息管理(单表查询)员工业绩查询(多表查询)增加员工(单表插入数据)修改个人密码客户信息管理:交易信息查询(多表查询)客户信息查询车辆信息管理:新增车辆信息车辆信息查询财务信息查询:数据操作实现方法: 定义一个类DataManager,在每个jsp页面中实例化这个类,并调用它的某个方法,完成数据库的连接,数据查询,删除,及修改操作。程序示例:如check.jsp里面可以验证用户登录信息,并转向不同页面。DataManager dm = new DataManager();/实例化DataManager类ResultSet rs = null;if (type = 1) /如果是以客户身份登录String sql = "select * from userinfo where username='" + username+ "'" + " and password = '" + password + "'"rs = dm.getResult(sql);/由用户名和密码获取记录if (rs.next() /如果记录不为空,表明该客户存在String pid = rs.getString("pid");/保存该用户信息session.setAttribute("type", "1");session.setAttribute("pid", pid);session.setAttribute("username", username);response.sendRedirect("user.jsp");/转向客户页面 else /转向管理员页面,以下与上面if语句类似。String sql = "select * from manager where username='"+ username + "'" + " and password = '" + password+ "' and type ="+type;System.out.println(sql);rs = dm.getResult(sql);if (rs.next() String wid = rs.getString("wid");session.setAttribute("type", t);session.setAttribute("wid", wid);session.setAttribute("username", username);response.sendRedirect("manager.jsp");此外,系统具有良好的安全性,对每个页面都有良好的保护措施,如manashare.jsp,usershar.jsp,通过session验证用户有无权限进入该页面,否则跳转到login.jsp页面,重新登录。四 程序设计 1.含有表单的jsp页面可以通过设置隐藏域的值来提交到本页面,其程序流程如下:开始获得隐藏域变量的值为空?表单的填写跳转到本页显示表单提交结果结束YN2.财务管理中有个导出execl报表的功能,其实现如下: 从网上下载一个jxl.jar包,该jar包支持生成execl文件的操作,然后建立一个专门的类,用于生成execl,该类源码如下:package my.pkgs;import java.io.*; import jxl.*; /jxl.jar里面的类库import jxl.write.*; import java.sql.*;public class CreateXLS public String create(ResultSet rs,String filename) tryFile f = new File(filename);boolean exist = f.exists();WritableWorkbook book = Workbook.createWorkbook(new File(filename);/生成名为“第一页”的工作表,参数0表示这是第一页 WritableSheet sheet = book.createSheet("第一页", 0);/在Label对象的构造子中指名单元格位置是第一列第一行(0,0) /以及单元格内容为test Label label0 = new Label(0, 0, "交易号");Label label1 = new Label(1, 0, "经手人员");Label label2 = new Label(2, 0, "客户证号");Label label3 = new Label(3, 0, "车辆号码");Label label4 = new Label(4, 0, "押金(元)");Label label5 = new Label(5, 0, "返还金额(元)");Label label6 = new Label(6, 0, "破坏情况");Label label7 = new Label(7, 0, "开始时间");Label label8 = new Label(8, 0, "实收金额(元)");sheet.addCell(label0);sheet.addCell(label1);sheet.addCell(label2);sheet.addCell(label3);sheet.addCell(label4);sheet.addCell(label5);sheet.addCell(label6);sheet.addCell(label7);sheet.addCell(label8);int i = 1;while (rs.next() jxl.write.Number label01 = new jxl.write.Number(0,i,rs.getInt(1);Label label11 = new Label(1, i, rs.getString(2);Label label21 = new Label(2, i, rs.getString(3);Label label31 = new Label(3, i, rs.getString(4);jxl.write.Number label41 = new jxl.write.Number(4, i, rs.getInt(5);jxl.write.Number label51 = new jxl.write.Number(5, i, rs.getInt(6);Label label61 = new Label(6, i, rs.getString(8);Label label71= new Label(7, i, rs.getInt(9) + "-"+ rs.getInt(10) + "-" + rs.getInt(11);jxl.write.Number label81 = new jxl.write.Number(8, i, rs.getInt(5)- rs.getInt(6);sheet.addCell(label01);sheet.addCell(label11);sheet.addCell(label21);sheet.addCell(label31);sheet.addCell(label41);sheet.addCell(label51);sheet.addCell(label61);sheet.addCell(label71);sheet.addCell(label81); i+;book.write(); book.close(); catch (Exception e) e.printStackTrace();return "ok" /测试creat方法 public static void main(String arg) throws SQLException CreateXLS c = new CreateXLS(); DataManager dm = new DataManager();String sql = "select * from rentinfo where outyear =" + 2009+ " and state='交易完成'"System.out.println(sql);ResultSet rs = dm.getResult(sql);c.create(rs, "c:3.xls"); 在jsp页面中调用该类方法既能生成Exel文件,源码如下: /该文件名按apache tomcat 安装目录而定String filename = "C:/Program Files/Apache Software Foundation/Tomcat 5.5/webapps/COURSEPROJECT/execls/"+ year + "-" + month + ".xls"CreateXLS cxls = new CreateXLS();cxls.create(rss, filename);3.用到了数据库知识里面的触发器,该触发器用于新增交易信息时,sql语句如下:SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TRIGGER rent1on rentinfo AFTER insertAS BEGIN update taxi set taxi.state = i.state, taxi.year = i.outyear, taxi.month = i.outmonth, taxi.day = i.outday, taxi.time = i.time from taxi t,Inserted i where t.tid = i.tid SET NOCOUNT ON;ENDGO五 总结 本次实验的最大收获就是真正写了个关于数据库的软件。数据库无论在现在各类软件中都有涉及,所以数据库对于计算机从业者来说是一门必须掌握的课程。本次试验只能说是初步了解了数据库编程的一些知识,许多高深的数据库知识如sql优化都未能研究深入。 其次是对jsp编程有了一定得了解。因为是首次学习jsp编程,没有用到javabean,更不用说struts,hibernate,spring框架,所用到的技术非常简单,属于“菜鸟级“,不过,打下了web编程的基础,相信以后会对web开发更有兴趣。 最后,对软件工程的知识有了一定了解。本次试验成果可以说是一个软件(质量暂且不论),软件的完成需要固定的几个步骤:需求分析,概念设计,编码,测试等等,经过本次尝试,终于知道了需求分析的重要性,它是整个软件的基础,影响到软件的功能是否完善等等,所以需求分析一定要到位。还有测试,测试用例一定要全面,否则,功能实现就会有缺陷。 以上就是本次实验的心得体会。