出租车管理系统实验课程设计.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date出租车管理系统实验课程设计山东建筑大学实验报告出租车管理系统一实验目的1理解和掌握软件工程的设计理念与设计方法。 2掌握某种数据库管理以及可视化编程环境,掌握基于某种编程语言的信息系统或网络通信软件或某种通用总线接口的通信软件的开发设计方法。二实验要求出租车管理系统主要是方便出租车公司员工以及公司外的普通用户对车辆和财务信息进行管理。主要实现以下功能:1.员工信息的发布与共享。2.车辆信息的管理。3.针对公司外的普通用户,设置订车、投诉、和留言功能。三实验开发环境 出租车管理系统的主要开发环境:SQL server数据库四实验步骤4.1 需求分析任务 4.1.1 需求分析设计 司机和出租车是出租车公司最要的资源,是创造效益的资源。要想提高出租车公司的效益和服务质量,首先从做好对司机和出租车的管理着手。一是对出租车司机的信息的管理,二是对出租车信息和租赁的管理。出租车管理系统将很大程度上解决出租车公司在此工作上的难度。4.1.2 需求分析过程功能需求简介: 针对出租车行业的特点开发的出租车管理系统,实现出租车公司内部及时准确地采集内部各种数据信息,处理高速化和网络办公自动化。实现对出租车公司司机的信息记录,操作,出租车管理,提供精确查询等多种查询方式。4.1.3调查需求基本操作:对出租车信息表、司机信息表、租赁表、违章表的查询、添加、更新、删除等功能。特别操作:对租赁表的功能。4.1.4 系统数据分析表2-1 数据结构定义数据结构名含义说明组成出租车信息表定义了出租车有关信息车牌号 入户时间 车型 颜色 出租情况 营业时间司机信息表定义了司机有关信息司机编号 姓名 性别 地址 身份证号 驾驶证号 发证时间 驾龄租赁表定义了租赁的有关信息司机编号 车牌号 期限 开始日期 截止日期 租赁费 车保费违章表定义了违章的有关信息司机编号 姓名 扣分 违章时间 违章地点出车记录表定义了每天哪些司机的出车情况司机编号 车牌号 出车日期4.2概念结构设计4.2.1 概念结构设计的方法 概念设计阶段我采用自底向上的方法,即自顶向下的进行需求分析,然后再自底向上的进行概念结构设计。对已经细化到无法再分的阶段逐步集成在一起,最终合成一个全局概念模式。4.2.2 概念结构设计的步骤 第一步是进行局部视图的设计:由于高层的数据流图只能反映系统的概貌,而中层流图能较好的反映系统中各局部应用的子系统组成。因此我们先逐一的设计分E-R图。 第二步是进行视图的集成:各子系统的E-R图设计好之后,下一步就是要将所有的分E-R图合成一个系统的总E-R图,一般有两个方式,多个分E-R图一次集成,另一种是一次集成两个分E-R图。我想采用一次集成两个分E-R图的方式。 图4-1 出车记录E-R图 图4-2 出租车 E-R图 图4-3 司机R-R图 图4-4 租赁E-R图 图4-5 违章E-R图租赁司机驾驶证号驾龄姓名性别地址司机编号身份证号发证时间出租车颜色出租情况车牌号入户时间车型营业时间租赁表租赁费车牌号期限开始日期司机编号截止日期车保费违章表姓名扣分司机编号违章时间违章地点违章出车记录表车牌号司机编号出车日期出车情况出车情况 图4-6 总体概念结构E-R图4.3 逻辑结构设计E-R图向关系模型的转换将上述总体概念结构E-R图转化成关系模型,根据这个关系写出数据依赖,确定数据依赖。司机与出租车是一对一的关系,司机、出租车与租赁是一对一的关系,司机与违章是一对一的关系。司机(司机编号,姓名,性别,地址,身份证号,驾驶证号,发证时间,驾龄)出租车(车牌号,入户时间,车型,颜色,出租情况,营业时间)租赁表(司机编号,车牌号,期限,开始日期,截止日期,租赁费,车保费)出车记录表(司机编号,车牌号,出车日期)违章表(司机编号,姓名,扣分,违章时间,违章地点)4.4 物理设计物理表结构如下表4-7司机表(Driver)列标示数据类型长度约束列意义DriverNumberchar6主键司机编号Namechar10不为空姓名Sexbit默认不为空性别Addressvarchar40不为空地址IDumberchar20不为空身份证号LincenseNumberchar10不为空驾驶证号CertificateDatedatetime默认不为空发证时间DriverAgetinyint默认不为空驾龄 表4-8出租车表(Taxi)列标示数据类型长度约束列意义TaxiNumberchar6主键车牌号StartDatedatetime默认不为空入户时间TaxiShapechar10不为空车型Colorchar10不为空颜色RentSituationbit默认不为空出租情况BusinessTimetinyint默认不为空营业时间 表4-9租赁表(Rent)列标示数据类型长度约束列意义DriverNumberchar6主键司机编号TaxiNumberchar6不为空车牌号LimitTimetinyint默认不为空期限StartDatedatetime默认不为空开始日期EndDatedatetime默认不为空截止日期RentFeefloat默认不为空租赁费ProtectionFeeFloat默认不为空车保费 表4-10违章表(Violate)列标示数据类型长度约束列意义DriverNumberchar6主键司机编号Namechar10不为空姓名Pointstinyint默认不为空扣分ViolateDatedatetime默认不为空违章时间ViolateAddressvarchar40不为空违章地点 表4-11出车记录表(Notes)列标示数据类型长度约束列意义DriverNumberchar6主键司机编号Namechar10不为空姓名DriveDatedatetime默认不为空出车日期4.5 数据库的实施4.5.1.创建表/*创建数据库*/CREATE DATABASE TAXI/*数据库名*/ON (NAME=TAXI_DATA,FILENAME='D:Microsoft SQL ServerMSSQL10_50.SQLEXPRESSMSSQLDATATAXI.mdf',SIZE=10MB,MAXSIZE=100MB,FILEGROWTH=10%)LOG ON(NAME='TAXI_log',/*日志*/FILENAME='D:Microsoft SQL ServerMSSQL10_50.SQLEXPRESSMSSQLDATATAXI_Log.ldf',SIZE=10MB,MAXSIZE=100MB,FILEGROWTH=1MB)/*创建基本表*/*创建司机表*/USE TAXICREATE TABLE Driver(DriverNumber char(6)NOT NULL PRIMARY KEY, /*司机编号*/Name char (10), /*姓名*/Sex bit NOT NULL, /*性别*/Address varchar(40)NOT NULL, /*地址*/IDNumber char(18)NOT NULL, /*身份证号*/licenseNumber char(10)NOT NULL, /*驾驶证号*/CertificateDate datetime NOT NULL, /*发证时间*/DriverAge tinyint NOT NULL /*驾龄*/)/*创建出租车表*/CREATE TABLE Taxi(TaxiNumber char(6)NOT NULL PRIMARY KEY,/*车牌号*/StartDate datetime NOT NULL,/*入户时间*/TaxiShape char(10)NOT NULL,/*车型*/Color char(10)NOT NULL,/*颜色*/RentSituation bit NOT NULL DEFAULT 1,/*出租情况*/BusinessTime tinyint NOT NULL/*营业时间*/)/*创建租赁表*/CREATE TABLE Rent(DriverNumber char(6)NOT NULL,/*司机编号*/TaxiNumber char(6)NOT NULL,/*车牌号*/LimitTime tinyint NOT NULL,/*期限*/StartDate datetime NOT NULL,/*开始日期*/EndDate datetime NOT NULL,/*截止日期*/RentFee float NOT NULL,/*租赁费*/ProtectionFee float NOT NULL,/*车保费*/PRIMARY KEY(DriverNumber,TaxiNumber)/*创建违章表*/CREATE TABLE Violate(DriverNumber char(6)NOT NULL PRIMARY KEY,/*司机编号*/Name char(10), /*姓名*/Points tinyint NOT NULL, /*扣分*/ViolateDate datetime NOT NULL, /*违章时间*/ViolateAddress varchar(40)NOT NULL /*违章地点*/)/*创建出车表*/CREATE TABLE Notes(DriverNumber char(6)NOT NULL,/*司机编号*/TaxiNumber char(6)NOT NULL,/*车牌号*/DriverDate datetime NOT NULL/*出车日期*/)4.5.2.创建主要视图视图是从一个或多个表导出的表。视图是数据库的用户使用数据库的观点。司机和出租车是主要的实体,而这两个实体的信息又在不同的表中,作为出租车公司对司机和出租车有时关心的数据又是不同的,即使是相同的数据,也可能又不同的操作。有时候仅有的表的列属性名是不能满足需求的,于是根据不同的需求,在物理的数据库上定义他们对数据库所要求的数据结构。(1)创建Driver_VIEW视图,包含司机所有的信息USE TAXIGOCREATE VIEW Driver_VIEW(司机编号,姓名,性别,地址,身份证号,驾驶证号,发证时间,驾龄)ASSELECT * FROM DriverGO (2)创建Taxi_VIEW视图,包含出租车的所有信息。USE TAXIGOCREATE VIEW Taxi_VIEW(车牌号,入户时间,车型,颜色,出租情况,每天营业时长)ASSELECT * FROM TaxiGO(3)创建Rent_VIEW视图,包含租赁的所有信息。USE TAXIGOCREATE VIEW Rent_VIEW(司机编号,车牌号,期限,开始日期,截止日期,租赁费,车保费)ASSELECT * FROM RentGO(4) 建租赁表平均租赁费视图Violate_VIEW_AVG,列名为平均租赁费,试图中列名为RentFee_avg。USE TAXIGOCREATE VIEW Violate_VIEW_AVG(平均租赁费)ASSELECT AVG(RentFee)FROM Rent4.5.3.创建索引索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表。(1)为Driver表的姓名创建唯一索引Driver_nameUSE TAXIGOCREATE UNIQUE INDEX Driver_nameON Driver(Name)GO(2)根据Rent表的司机编号和车牌号创建复合索引。USE TAXIGOCREATE INDEX Rent_INDON Rent(DriverNumber,TaxiNumber)GO4.5.4.创建表字段的约束关系数据完整性包括实体完整性,域完整性和参照完整性。租赁表中的期限的取值肯定要有一定的范围,违章表中的扣分也有范围,租赁表的截止日期必须在开始日期的之后,都可以通过CHECK约束来实现,这就体现了域的完整性。租赁表中的司机编号和车牌号都由司机表和出租车表中对应,当删除或修改司机表中的司机编号和出租车表中的车牌号也应当对应修改租赁表中的司机编号和车牌号,这体现了表与表之间的参照完整性。(1)添加Rent表中期限的约束条件。USE TAXIGOALTER TABLE Rent ADD CONSTRAINT LimitTime_constraint CHECK(LimitTime>=0 AND LimitTime<=10)GO(2)添加Violate表中扣分的约束条件。USE TAXIGOALTER TABLE ViolateADD CONSTRAINT Points_constraint CHECK(Points>=0 AND Points<=12)GO(3) 在Rent表中的TaxiNumber列添加外键约束,参照Taxi表中的列USE TAXIGOALTER TABLE RentADD CONSTRAINT FK_TaxiNumber FOREIGN KEY(TaxiNumber)REFERENCES Taxi(TaxiNumber)GO(4)在Rent表中添加日期的约束。4.5.5.创建存储过程存储过程分为系统存储过程、扩展存储过程和用户存储过程。存储过程可以接收参数、返回表格或标量结果和消息,执行存储过程后,就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。当给定了一个司机的编号或出租车的车牌号时想直接返回该司机或该出租车的信息情况,不需要任何参数,或者使用给定的参数返回信息。(1)创建返回000001司机的信息情况。USE TAXIGOCREATE PROCEDURE driver_infoAS SELECT * FROM Driver WHERE DriverNumber='000001'GO/*执行存储过程driver_info*/EXECUTE driver_infoGO/*或者*/driver_infoGO (2) 创建返回出租车的信息情况。USE TAXIGOCREATE PROCEDURE taxi_infoAS SELECT * FROM Taxi WHERE TaxiNumber='010001'GO/*执行存储过程taxi_info*/EXECUTE taxi_infoGO(3) 从Rent表中查询指定司机编号的租赁信息USE TAXIGOCREATE PROCEDURE rent_info number char(6)ASSELECT * FROM Rent WHERE DriverNumber=numberGO/*执行存储过程rent_info*/EXECUTE rent_info '000002'(4) 从Violate表中查询指定司机编号的违章情况USE TAXIGOCREATE PROCEDURE violate_info number char(10)='000001'ASSELECT Points AS '扣分' FROM Violate WHERE DriverNumber=numberGO/*执行存储过程*/EXECUTE violate_info/*参数私用默认值*/EXECUTE violate_info'000002'/*传递给number的实参为*/GO4.5.6.创建触发器当查询一个表中是否存在信息时,或者向表中添加数据时,想显示有无要查的信息或想知道到底有没有执行,可以用触发器对相应的表做更改和显示操作与否。(1)在Drivr表上创建触发器,每次修改操作时,定义一个变量,让它显示插入成功。USE TAXIGOCREATE TRIGGER driver_updateON Driver AFTER UPDATEASBEGINDECLARE str char(20)SET str='修改成功'PRINT strENDGO/*对Driver表更新信息*/UPDATE Driver SET IDNumber='372929199106033619' WHERE DriverNumber='000004'(2)当修改Driver表中的司机编号时,修改Rent表中对应的司机编号,同时修改Violate表和Notes表中的司机编号。USE TAXIGOCREATE TRIGGER rent_update1ON Driver AFTER UPDATEASBEGINDECLARE old_number char(6),new_number char(6)SELECT old_number=DriverNumber FROM deletedSELECT new_number=DriverNumber FROM insertedUPDATE Rent SET DriverNumber=new_number WHERE DriverNumber=old_numberUPDATE Violate SET DriverNumber=new_number WHERE DriverNumber=old_numberUPDATE Notes SET DriverNumber=new_number WHERE DriverNumber=old_numberENDGO /*对Taxi表更新信息*/UPDATE Driver set DriverNumber='000009' WHERE DriverNumber='000001'查看三个表中的变化。4.5.7.创建用户定义的函数和表值函数当用户在编程时常常需要将一个或多个T-SQL语句组成子程序,以便反复调用。这就要用到用户定义的标量值函数和表值函数。标量值函数返回一个标量值,表值函数返回一个整表。当想计算得出Rent表中出租车的平均车保费时可以创建一个标量值函数,当想通过给定的司机编号查询已经创建好的Driver_VIEW视图上给定司机编号的相关信息时可以创建一个返回整个表或视图的表值函数来实现。(1)创建用户定义函数,实现计算出租车的平均车保费。USE TAXIGOCREATE FUNCTION ProtectorFee()RETURNS intASBEGINDECLARE fee intSELECT fee=(SELECT avg(ProtectionFee) FROM Rent)RETURN feeENDGO/*调用定义的ProtectionFee函数。*/USE TAXIGODECLARE fee intSELECT fee=dbo.ProtectorFee()SELECT fee AS '出租车的平均租赁费'(2)创建一个表值函数,实现查询给定司机编号的相关信息。USE TAXIGOCREATE FUNCTION fn_view(number char(6)RETURNS tableAS RETURN(SELECT 司机编号,姓名,性别,地址,身份证号,驾驶证号 FROM TAXI.dbo.Driver_VIEWWHERE 司机编号=number)GO/*调用定义好的标志函数*/SELECT * FROM fn_view('000003')4.5.8.创建数据库的安全管理角色 数据库的安全性管理是数据库服务器应实现的重要功能和之一。对用户登录进行身份验证,当用户登录到数据库系统时,系统对该用户的账户和口令进行验证,包括确认用户账户是否有效以及能否访问数据库系统。对用户进行的操作进行权限控制,当用户登录到数据库后,只能对数据库中的数据在允许的权限内进行操作。(1)创建SQL Server登录名sql_tao,密码为123456。USE TAXICREATE LOGIN sql_taoWITH PASSWORD='123456',DEFAULT_DATABASE=TAXI/*将sql_tao用户添加到sysadmin固定服务器角色中。*/EXEC sp_addsrvrolemember'sql_tao','sysadmin'(2)创建数据库用户davidCREATE USER david FOR LOGIN sql_taoWITH DEFAULT_SCHEMA=dbo/*将david用户添加到sysadmin固定数据库角色中db_owner。*/EXEC sp_addrolemember'db_owner','david'(3) 在TAXI数据库上的用户david授予创建表的权限*/USE TAXIGOGRANT CREATE TABLE TO davidGO/*在TAXI数据库上的用户yangyang授予Driver表操作的权限*/GRANT UPDATE,INSERT ON Driver TO yangyangWITH GRANT OPTION五 实验总结 对于这次综合实验,上网看了比较多资料,可以说对我们所学知识的一个大总结吧,也是是一次宝贵的学习和自我提高的机会,在实现过程需要自己不断的思考,查阅资料,调试·····这样一个循序渐进的过程,也正是因为这样的实践才把我们所学的很多专业基础知识教会融合在一起了,这可以说是一个很难得的机会。在做完这个课设的时候 ,我对自己做了一个总结,觉得基础知识非常重要,很多东西不能只看眼前,要放眼未来,只有基础打牢了,才能更快,更容易的上手。课本上的知识和实践结合,才能更好的掌握一门技术。-