长沙学院课程设计说明书题目汽车租赁管理系统学院计算机工程与应用数学专业(班级)姓名学号指导教师起止日期课程设计任务书课程名称:数据库系统原理课程设计设计题目:汽车租赁管理系统已知技术参数和设计要求:1、某汽车租赁公司汽车租赁管理系统需要如下信息:工作人员信息包括:工号、姓名、性别、联系电话等。
客户信息包括:身份证号、姓名、性别、所在单位、联系电话等。
车辆信息包括:车牌号、品牌、颜色、座位数、日租价格、日租超公里价格、月租价格、租赁状态、购入日期等。
车辆类别信息包括:分类号,库存数。
其业务规则描述如下:一个工作人员可以对很多辆车辆进行管理,一辆车也可以被多个工作人员管理;一辆车只能属于一种车辆类别,而一种车辆类别可以包含多辆车;一个客户可以租多辆不同的车。
2、系统功能的基本要求:可以实现对车辆、租赁客户的查询,可以查询汽车、客户租赁历史记录。
可以按类别统计汽车的租赁金额和剩余的库存数,可以统计某一年龄客户群体对某类汽车的租赁喜好,能模拟客户对汽车的租借、归还业务。
各阶段具体要求:1.需求分析阶段●定义数据项的含义和取值●定义目标系统的数据流2.概念结构设计阶段●画出实体模型E-R图3.逻辑结构设计阶段●将实体模型转化为关系模型●给出每个关系的主关键字和函数依赖集●分析你所设计的关系数据库模式是否属于3NF4.物理设计阶段●确定所有字段的名称、类型、宽度、小数位数及完整性约束●确定数据库及表的名称及其组成●确定索引文件和索引关键字5.数据库安全及维护设计阶段●设计一个适合的数据库安全策略(用户身份认证、访问权限、视图)●为了实现复杂的数据完整性约束,设计适当的触发器●设计一个适合的数据库备份策略6、实施阶段●要求所有操作必须在查询分析器中用SQL语句或系统存储过程完成。
设计工作量:(1)软件设计:完成问题陈述中所提到的所有需求功能。
(2)论文:要求撰写不少于3000个文字的文档,详细说明各阶段具体要求。
工作计划:安排两周时间进行课程设计,软件开发步骤如下,第一周完成1~4,第二周完成5~8,论文同步进行;1) 选定题目2) 需求分析3) 概念结构设计4) 逻辑结构设计5) 物理设计6) 数据库安全及维护设计7) 数据库上机实现8) 答辩4课时:讲授32课时:上机、调试。
计算机学院机房4课时:答辩。
计算机系机房。
注意事项⏹提交文档➢长沙学院课程设计任务书(每学生1份)➢长沙学院课程设计论文(每学生1份)➢长沙学院课程设计鉴定表(每学生1份)目录1.需求分析阶段 (2)2.概念结构设计阶段 (2)3.逻辑结构设计阶段 (2)4.物理设计阶段 (2)5.数据库安全及维护设计阶段 (2)6、实施阶段 (2)1.引言 (5)1.1编写目的 (6)1.2参考资料 (6)2.需求规约 (6)2.1系统业务描述 (6)2.2功能需求分析 (7)3. 数据库环境说明 (11)4.数据库的命名规则 (11)4.1数据库对象命名规则 (11)4.2数据项编码规则 (11)5.逻辑设计 (12)5.1创建与数据库相关的ER图、表及关系图 (12)5.2创建数据库系统的关系模型 (14)6. 物理设计 (14)6.1表汇总 (14)6.2表的详细情况 (15)6.3视图的设计 (18)6.3.1创建一个可以查询当前可租用车辆及价格与库存数的视图 (18)6.4存储过程的设计 (19)6.4.1查询当前车辆信息状态 (19)6.4.2查询当前可租用车辆及价格与库存数 (19)6.4.3客户租车 (20)6.4.4还车 (21)6.4.5新建车辆类别信息 (21)6.4.6新增车辆 (22)6.4.7删除车辆 (24)6.4.8注册新用户 (25)6.4.9删除用户 (26)6.4.10注册新工作人员 (26)6.4.11删除工作人员 (27)6.4.12工作人员查看所有订单 (28)6.4.13用户查看自己订单 (29)6.4.14工作人员查询客户信息 (29)6.5触发器的设计 (30)6.5.1(租车)创建触发器,当订单表插入一条新订单时,使对应车辆的库存数-1 (30)6.5.2(租车时)创建触发器,当订单表中插入一条记录时,使对应车辆的状态改为已租状态 (31)6.5.3(还车时)创建触发器,当租车表更新一条数据时,使对应车辆在汽车表里面的状态修改为未租状态 (32)6.5.4(还车时)创建触发器,当租车表更新一条数据时,使对应车辆的库存数+1 (33)6.5.5(还车时)创建触发器,当租车表更新一条记录时,计算客户的租车费用 (34)6.5.6 (新增车辆)创建触发器,当新增车辆时,对应库存数+1 (35)6.5.7(删除车辆)创建触发器,当删除一辆车后,其对应车库数-1 (36)7. 安全性设计 (37)7.1防止用户直接操作数据库的方法 (37)7.2用户帐号密码的加密方法 (37)7.3角色与权限 (38)8. 数据库管理与维护说明 (38)9. 实验总结 (40)10. 附录 (40)1.引言1.1 编写目的本文档是汽车租赁系统设计文档的组成部分,编写数据库设计文档的目的是:明确数据库的表名、字段名等数据信息,用来指导后期的数据库脚本的开发。
本文档的读者对象是需求人员、系统设计人员、开发人员、测试人员。
1.2参考资料2.需求规约2.1 系统业务描述(1)数据库创建背景该数据库建立于sq l server 2008 r2,环境为windows7系统名称:汽车租赁管理系统。
系统的开发者:小组成员系统的用户:租车客户以及租赁公司的工作人员。
(2)数据库系统要完成的业务流程及工作内容首先完成需求分析,根据需求关系画出ER-图,并写出关系模式。
根据ER图用SQL server创建与数据库相关的表,视图,存储过程以及触发器。
系统的功能要求基本实现对车辆,租赁客户的查询。
可以查询客户租赁的历史记录。
可以查看汽车价格、库存,可以查看汽车的租借、归还、以及费用。
图2.1 总体框架图(3)揭示该数据库的资源需求和设计约束2.2 功能需求分析表2.1表2.3表2.6表2.8表2.10表2.12表2.133. 数据库环境说明4.数据库的命名规则4.1 数据库对象命名规则4.2 数据项编码规则表4.2 数据项编码规则表5.逻辑设计5.1创建与数据库相关的ER图、表及关系图图5.1 ER图图5.2 关系图5.2创建数据库系统的关系模型1.工作人员(工号、密码、姓名、性别、联系电话)2.客户信息(客户编号、身份证号、密码、姓名、性别、所在单位、联系电话)3.车辆信息(车牌号、座位数、颜色、租赁状态、购入日期、分类号)4车辆类别(分类号、车型、库存数、日租价格、日租超公里价格、月租价格、月租超公里价格)5.租赁(订单号、客户编号、车牌号、租赁日期、归还日期、租赁里程数、租赁费用)6. 物理设计6.1表汇总表6.1 汇总表6.2表的详细情况表6.2[car]:[车辆信息表]表6.5[worker]:[工作人员信息表]6.3视图的设计6.3.1创建一个可以查询当前可租用车辆及价格与库存数的视图create view vi_usecarasselect carno'车牌号',carcolor'颜色',carseat'座位数',carclassname'品牌',carsum'库存数',cardayprice'日租价格',carbeyonddayprice'日租超出价格' ,carmonthprice '月租价格',carbeyondmonthprice'月租超出价格'from car,carclasswhere carstate = '未租'and car.carclassno=carclass.carclassno ;图6.1 视图的创建6.4存储过程的设计6.4.1查询当前车辆信息状态create procedure proc_carasselect carno'车牌号',carcolor'颜色',cardate'购入日期',carseat'座位数',carstate'当前状态'from car;图6.2 查询车辆信息6.4.2查询当前可租用车辆及价格与库存数create procedure proc_usecarasselect carno'车牌号',carcolor'颜色',carseat'座位数',carclassname'品牌',carsum'库存数',cardayprice'日租价格',carbeyonddayprice'日租超出价格' ,carmonthprice '月租价格',carbeyondmonthprice'月租超出价格'from car,carclasswhere carstate = '未租'and car.carclassno=carclass.carclassno ;图6.3查询可租用车辆信息6.4.3客户租车create procedure proc_rentcar(@customerno varchar(10),@carno varchar(10),@rentdate date)asif (select car.carstate from car where(car.carno = @carno))='未租' begininsertinto rent(rentdate,rentbackdate,customerno,carno,milage,cost) values(@rentdate, @rentdate,@customerno,@carno,0,'0');print '租车成功';endelsebeginprint'当前车辆已被租用或不存在!请更换车辆'end图6.4 租车操作6.4.4还车create procedure proc_returncar(@rentno varchar(10),@returndate date ,@milage int)asbeginupdate rentsetage=@milage,rent.rentbackdate=@returndatewhere(rent.rentno=@rentno);print '还车成功';end图6.5 还车操作6.4.5新建车辆类别信息create procedure add_carclass(@workno varchar(10),@workpassword varchar(10),@carclassname varchar(10),@cardayprice varchar(10) ,@carbeyonddayprice varchar(10),@carmonthprice varchar(10) ,@carbeyondmonthprice varchar(10))asif @workpassword=(select workpassword from worker where (workno = @workno)) beginprint '验证正确'insertinto carclassvalues(@carclassno,@carclassname,0 ,@cardayprice,@carbeyonddayprice,@carmonth price,@carbeyondmonthprice)end图6.6 新建车辆类别操作图6.7 新建成功6.4.6新增车辆create procedure add_car(@workno varchar(10),@carno varchar(10),@carcolor varchar(10),@cardate varchar(10),@carseat varchar(10),@carclassno varchar(10))asif @workpassword=(select workpassword from worker where (workno = @workno)) beginprint '身份验证正确!'insertinto carvalues(@carno,@carcolor,@cardate,@carseat,@carclassno,'未租')print '新增车辆成功!'endelsebeginprint '账号或密码错误!'end图6.8 新增车辆操作图6.9 新增车辆成功6.4.7删除车辆create procedure del_car(@workno varchar(10),@workpassword varchar(10),@carno varchar(10))asif @workpassword=(select workpassword from worker where (workno = @workno)) beginprint '身份验证正确!'deletefrom carwhere carno=@carnoprint '车辆删除成功!'endelsebeginprint '账号或密码错误'end图6.10 删除车辆操作图6.11 删除车辆成功6.4.8注册新用户create procedure add_customer(@customerno varchar(10),@customterid varchar(20),@customername varchar(10),@customersex varchar(10),@customeraddress varchar(10),@customerphone varchar(20))asinsertinto customervalues(@customerno,@customterid,@customername,@customersex,@customeraddress,@ customerphone)print '注册成功!'图6.12 新用户注册操作图6.13 注册成功6.4.9删除用户create procedure del_customer(@customerno varchar(10))asdeletefrom customerwhere(customerno=@customerno)图6.14 删除用户操作图6.15 删除用户成功6.4.10注册新工作人员create procedure add_worker(@workno varchar(10),@workpassword varchar(10),@workname varchar(10),@worksex varchar(10),@workphone varchar(20))asinsertinto workervalues(@workno,@workpassword,@workname,@worksex,@workphone) print '注册成功'图6.16 注册工作人员图6.17 注册成功6.4.11删除工作人员create procedure del_worker(@workno varchar(10))asdeletefrom workerwhere (workno=@workno)图6.18 删除工作人员图6.19 删除成功6.4.12工作人员查看所有订单create procedure check_rentasselect *from rent图6.20 订单记录表图6.21 查询成功6.4.13用户查看自己订单create procedure check_carrent(@customerno varchar(10))asselect *from rentwhere(customerno = @customerno)图6.22 查询订单6.4.14工作人员查询客户信息create procedure check_customer(@workno varchar(10),@workpassword varchar(10),@customerno varchar(10))asif @workpassword=(select workpassword from worker where (workno = @workno))beginprint '验证正确'select *from customerwhere (customerno = @customerno)endelsebeginprint '账号或密码错误'end图6.23 客户信息表图6.24 查询成功6.5触发器的设计6.5.1(租车)创建触发器,当订单表插入一条新订单时,使对应车辆的库存数-1create trigger sub_carsumon rentafter insertasupdate carclassset carclass.carsum=carclass.carsum-1where carclassno in(select carclassno from car where carno in(select carno from inserted) )图6.25 租车操作图6.26 触发器更新库存数6.5.2(租车时)创建触发器,当订单表中插入一条记录时,使对应车辆的状态改为已租状态create trigger alter_carstateon rentafter insertasupdate carset carstate = '已租'where carno in(select carnofrom inserted)图6.27 租车操作图6.28 触发器改变租车状态6.5.3(还车时)创建触发器,当租车表更新一条数据时,使对应车辆在汽车表里面的状态修改为未租状态create trigger alter_carstate2on rentafter updateasupdate carset carstate = '未租'where carno in(select carnofrom inserted)图6.29 还车操作图6.30 触发器改变租车状态6.5.4(还车时)创建触发器,当租车表更新一条数据时,使对应车辆的库存数+1create trigger add_carsumon rentafter updateasupdate carclassset carclass.carsum=carsum+1where carclassno in(select carclassno from car where carno in(select carno from inserted))图6.31 换车操作图6.32 触发器更新库存数6.5.5(还车时)创建触发器,当租车表更新一条记录时,计算客户的租车费用create trigger calculate_coston rentafter updateasdeclare @price1 varchar(10),@price2 varchar(10)if ((select milage from rent where rentno in(select rentno from inserted))> 200)beginselect @price2=(select carbeyonddayprice from carclass where carclassno in (select carclassno from car where carno in(select carno from inserted)) )update rentset cost=@price2*(DATEDIFF(DAY,rent.rentdate,rent.rentbackdate)+1)where rentno in (select rentno from inserted)endelsebeginselect @price1=(select cardayprice from carclass where carclassno in (select carclassno from car where carno in(select carno from inserted)) )update rentset cost=@price1*(DATEDIFF(DAY,rent.rentdate,rent.rentbackdate)+1) where rentno in (select rentno from inserted)end图6.33 还车操作图6.34 触发器计算价格6.5.6 (新增车辆)创建触发器,当新增车辆时,对应库存数+1create trigger add_carsum1on carafter insertas1update carclassset carclass.carsum=carsum+1where carclassno in (select carclassno from inserted)图6.35 新增车辆图6.36 触发器更新库存数6.5.7(删除车辆)创建触发器,当删除一辆车后,其对应车库数-1create trigger sub_carsum1on carafter deleteasupdate carclassset carsum=carsum-1where carclassno in(select carclassno from deleted)exec del_car '1','123456','湘G11111'图6.37 删除车辆图6.38 触发器更新库存数7. 安全性设计7.1防止用户直接操作数据库的方法示例代码exec add_car '1','123456','湘G11111','黑色','2018-6-10','5','2'在操作前对工作人员的账号和密码进行验证,验证通过后才可操作数据库if @workpassword=(select workpassword from worker where (workno = @workno)) beginprint '身份验证正确!'insertinto carvalues(@carno,@carcolor,@cardate,@carseat,@carclassno,'未租')print '新增车辆成功!'endelsebeginprint '账号或密码错误!'end7.2用户帐号密码的加密方法在SQl server下自带的函数hashbytes() ,此函数可以用来计算一个字符串的 MD5使用方法如下:--获取123456的MD5加密串select hashbytes('MD5', '123456') ;7.3 角色与权限关键代码worker拥有所有权限grant all on car to worker with grant optiongrant all on carclass to worker with grant optiongrant all on rent to worker with grant optiongrant all on worker to worker with grant optiongrant all on customers to worker with grant option用户拥有查看customer和car的权限grant select on car to customersgrant select,update on customer to customersgrant select on carclass to customers8. 数据库管理与维护说明要保证数据库的安全和可靠就需要对其日常管理进行全面的掌控和及时的维护,以此获得更加安全的数据库环境。