成都今晚全部解封_西安seo服务_kali钓鱼网站制作_怎样做公众号微信平台
第四章 系统设计
4.1 系统架构设计
本旅游网站的架构设计主要分为可以3层,主要有Web层,业务层,Model层。其中web层还包括View层和Controller层,Model层包括元数据扩展层和数据访问层。
系统架构如下图所示。
图4-1 系统架构
4.2系统总体设计
旅游网站总体分为前台用户模块和后台管理员模块。
两个模块表现上是分别独立存在,但是访问的数据库是一样的。每一个模块的功能都是根据先前完成的需求分析,并查阅相关资料后整理制作的。
综上所述,系统功能结构图如下图所示。
图4-2 系统功能结构图
4.3系统功能设计
登录模块:登录模块是进入系统的入口,所有用户必须登录后才能访问系统。登录需要输入用户名和密码,如果多次尝试登录需要输入验证码。登录时需要选择用户的角色,是一般用户还是管理员登录等。登录成功后,会通过数据库获取用户的权限,并跳转至用户的主页面。
管理员用户管理模块:管理员管理包括:管理员的添加,修改和删除操作。添加管理员时,先判断用户添加的管理员是否是admin,如果不是则添加成功。修改时候,可以修改所有管理员的信息的操作。
热门景点:用户可以根据景点类型浏览景点的信息,并选中某个景点查看详情,例如:景点名称、景点等级、景点类型、景点介绍等。
门票购买管理模块:景点门票管理分为订单编号、酒店名称修改和景点购票。景点信息由管理员进行详情、删除操作;景点门票购买由用户来执行。
酒店信息管理模块:酒店管理分为酒店名称、客房图片、酒店等级、客房类型修改。酒店信息由管理员进行详情、修改、添加、删除操作;酒店预订由用户来执行。
4.4数据库设计
4.4.1数据需求分析
从前面可以分析到数据库中最重要的是用户信息,热门景点信息,门票购买信息,线路预订信息,旅游线路,酒店预订,分析可以得到如下数据描述:
用户:用于记录用户的各种信息,包括用户账号、密码、用户姓名、照片、性别、联系方式、身份证、邮箱等数据项。
管理员:记录管理员的登录信息。包括用户名,密码,权限等数据项。
热门景点:存放给景点的内容,包括景点名称、图片、等级、景点类型、开放时间、门票价格、数量、景点位置、购票须知、景点介绍等数据项。
门票购买:存储各种门票购买信息。包括订单编号、景点名称、图片、门票价格、数量、总金额、购买日期、用户账号、用户姓名、是否支付等数据项。
线路预订:存储用户的线路预订信息。包括景点线路的线路名称、线路费用、旅行社、预订时间、用户账号、用户姓名、联系方式、是否支付等数据项。
旅游线路。存储用户的旅游线路信息。包括旅游信息的线路名称、线路图片、线路类型、景点名称、起点、途径路段、终点、线路费用、交通方式、旅行社、线路详情、等数据项。
酒店预订:存储用户的酒店信息。包括酒店名称、酒店等级、客房价格、客房数量、总金额、预订时间、用户账号、用户姓名、联系方式、是否支付、等数据项。
4.4.2数据库概念设计
根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体。
系统ER图如下图所示。
图4-3 系统ER图
4.4.3数据库表设计
旅游网站所拥有的数据表有以下:用户信息表,热门景点信息表,门票购买信息表,线路预订信息表,旅游线路表,酒店预订表。
由于数据表较多,只展示系统主要数据表,如下表所示。
users表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
id | bigint | 20 | 是 | 是 | 主键 |
username | varchar | 100 | 是 | 否 | 用户名 |
password | varchar | 100 | 是 | 否 | 密码 |
role | varchar | 100 | 否 | 否 | 角色 |
addtime | timestamp | 0 | 是 | 否 | 新增时间 |
Yonghu表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
id | bigint | 20 | 是 | 是 | 主键 |
addtime | timestamp | 0 | 是 | 否 | 创建时间 |
yonghuzhanghao | varchar | 200 | 是 | 否 | 用户账号 |
mima | varchar | 200 | 是 | 否 | 密码 |
yonghuxingming | varchar | 200 | 否 | 否 | 用户姓名 |
zhaopian | varchar | 200 | 否 | 否 | 照片 |
xingbie | varchar | 200 | 否 | 否 | 性别 |
lianxifangshi | varchar | 200 | 否 | 否 | 联系方式 |
shenfenzheng | varchar | 200 | 否 | 否 | 身份证 |
youxiang | varchar | 200 | 否 | 否 | 邮箱 |
remenjingdian表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
id | bigint | 20 | 是 | 是 | 主键 |
addtime | timestamp | 0 | 是 | 否 | 创建时间 |
jingdianmingcheng | varchar | 200 | 是 | 否 | 景点名称 |
tupian | varchar | 200 | 否 | 否 | 图片 |
dengji | varchar | 200 | 否 | 否 | 等级 |
jingdianleixing | varchar | 200 | 否 | 否 | 景点类型 |
kaifangshijian | varchar | 200 | 否 | 否 | 开放时间 |
menpiaojiage | float | 0 | 是 | 否 | 门票价格 |
shuliang | int | 11 | 否 | 否 | 数量 |
jingdianweizhi | varchar | 200 | 否 | 否 | 景点位置 |
goupiaoxuzhi | longtext | 0 | 否 | 否 | 购票须知 |
jingdianjieshao | longtext | 0 | 否 | 否 | 景点介绍 |
clicktime | datetime | 0 | 否 | 否 | 最近点击时间 |
clicknum | int | 11 | 否 | 否 | 点击次数 |
Menpiaogoumai表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
id | bigint | 20 | 是 | 是 | 主键 |
addtime | timestamp | 0 | 是 | 否 | 创建时间 |
dingdanbianhao | varchar | 200 | 否 | 否 | 订单编号 |
jingdianmingcheng | varchar | 200 | 是 | 否 | 景点名称 |
tupian | varchar | 200 | 否 | 否 | 图片 |
dengji | varchar | 200 | 否 | 否 | 等级 |
menpiaojiage | float | 0 | 否 | 否 | 门票价格 |
shuliang | int | 11 | 是 | 否 | 数量 |
zongjine | float | 0 | 否 | 否 | 总金额 |
goumairiqi | date | 0 | 否 | 否 | 购买日期 |
yonghuzhanghao | varchar | 200 | 否 | 否 | 用户账号 |
yonghuxingming | varchar | 200 | 否 | 否 | 用户姓名 |
ispay | varchar | 200 | 否 | 否 | 是否支付 |
Xianluyuding表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
id | bigint | 20 | 是 | 是 | 主键 |
addtime | timestamp | 0 | 是 | 否 | 创建时间 |
xianlumingcheng | varchar | 200 | 否 | 否 | 线路名称 |
jingdianmingcheng | varchar | 200 | 否 | 否 | 景点名称 |
xianlufeiyong | float | 0 | 否 | 否 | 线路费用 |
lvxingshe | varchar | 200 | 否 | 否 | 旅行社 |
yudingshijian | datetime | 0 | 否 | 否 | 预定时间 |
yonghuzhanghao | varchar | 200 | 否 | 否 | 用户账号 |
yonghuxingming | varchar | 200 | 否 | 否 | 用户姓名 |
lianxifangshi | varchar | 200 | 否 | 否 | 联系方式 |
shenfenzheng | varchar | 200 | 否 | 否 | 身份证 |
ispay | varchar | 200 | 否 | 否 | 是否支付 |
Lvyouxianlu表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
id | bigint | 20 | 是 | 是 | 主键 |
addtime | timestamp | 0 | 是 | 否 | 创建时间 |
xianlumingcheng | varchar | 200 | 是 | 否 | 线路名称 |
xianlutupian | varchar | 200 | 否 | 否 | 线路图片 |
xianluleixing | varchar | 200 | 否 | 否 | 线路类型 |
jingdianmingcheng | varchar | 200 | 是 | 否 | 景点名称 |
dengji | varchar | 200 | 否 | 否 | 等级 |
jingdianweizhi | varchar | 200 | 否 | 否 | 景点位置 |
qidian | varchar | 200 | 否 | 否 | 起点 |
tujingluduan | varchar | 200 | 否 | 否 | 途径路段 |
zhongdian | varchar | 200 | 否 | 否 | 终点 |
xianlufeiyong | float | 0 | 是 | 否 | 线路费用 |
jiaotongfangshi | varchar | 200 | 否 | 否 | 交通方式 |
lvxingshe | varchar | 200 | 否 | 否 | 旅行社 |
xianluxiangqing | longtext | 0 | 否 | 否 | 线路详情 |
clicktime | datetime | 0 | 否 | 否 | 最近点击时间 |
clicknum | int | 11 | 否 | 否 | 点击次数 |
Jiudianyuding表:
名称 | 类型 | 长度 | 不是null | 主键 | 注释 |
id | bigint | 20 | 是 | 是 | 主键 |
addtime | timestamp | 0 | 是 | 否 | 创建时间 |
jiudianmingcheng | varchar | 200 | 是 | 否 | 酒店名称 |
jiudiandengji | varchar | 200 | 否 | 否 | 酒店等级 |
kefangjiage | float | 0 | 否 | 否 | 客房价格 |
kefangshuliang | int | 11 | 是 | 否 | 客房数量 |
zongjine | float | 0 | 否 | 否 | 总金额 |
yudingshijian | datetime | 0 | 否 | 否 | 预订时间 |
yonghuzhanghao | varchar | 200 | 否 | 否 | 用户账号 |
yonghuxingming | varchar | 200 | 否 | 否 | 用户姓名 |
lianxifangshi | varchar | 200 | 否 | 否 | 联系方式 |
shenfenzheng | varchar | 200 | 否 | 否 | 身份证 |
ispay | varchar | 200 | 否 | 否 | 是否支付 |
第五章 系统实现
5.1开发工具
系统中应用的开发工具总结如下表所示。
表5-1开发工具
名称 | 工具 | 版本 |
操作系统 IDE(Integrated Development Environment) | windows VisualStudio | 7/8/10 2010 |
服务器 | IIS | 9.10.7 |
数据库 浏览器 界面工具 | SQL Server 谷歌 Photoshop | 2008 6.0 2016 |
5.2 注册模块的实现
未注册用户在用户注册界面uerRegister.aspx.cs,输入新用户信息,点击注册后,新用户信息由界面传入控制层userController,调用addUser(user)方法,通过user的操作方法向数据库用户表插入用户信息,由于用户账号是自动生成的,若成功则反馈注册成功,并提示新用户的用户账号;若失败则回到登录界面,并显示登录失败。
注册界面如下所示。
图5-1用户注册流程图
用户注册界面如下图所示。
图5-2用户注册界面
5.3登录模块的实现
主要由两部分组成,登录前的登录界面以及登录后的用户功能界面。登录界面,要求用户输入用户名和密码,当用户名和密码其中一个输入为空时,给出提示“用户名,密码不能为空”。获取用户名和密码后到数据库中查找,如果用户名存在,以及对应的密码正确,则登录成功,否则登录失败。登录失败后给出提示,并把焦点停在文本框中。登录成功后将该次会话的全局变量username设置为用户名。登录成功后进入会员的功能模块,主要有会员基本信息修改,已经发布景点信息管理,发布信息,和退出功能。退出功能是清除全局变量username的值,并跳回到首页。
登录流程图如下图所示。
图5-3登录流程图
用户登录界面如下图所示。
图5-4用户登录界面
5.4用户资料修改模块的实现
用户登录/注册成功之后可以修改自己的基本信息。修改页面的表单中每一个input的name值都要与实体类中的参数相匹配,在用户点击修改页面的时候,如果改后用户名与数据库里面重复了,页面会提示该用户名已经存在了,否则通过Id来查询用户,并将用户的信息修改为表单提交的数据。
5.5 门票购买模块的实现
门票购买功能需要考虑高并发,防止出现景点重复购票、景点状态显示出错等情况,特对景点这一共享数据增加锁机制。在乐观锁、悲观锁以及线程锁中,综合考虑性能效率和错误的可接受性选择了乐观锁机制。乐观锁的实现方式是使用版本标识来确定读到的数据与提交时的数据是否一致,提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。在数据库景点表(对应景点实体)设计中增加了version字段,每次数据提交时(更改景点状态)会判断version是否匹配,若不匹配停止本次提交,若匹配则提交成功并增加version的值。
门票购买功能整体流程:用户浏览景点信息时,同时会显示景点的状态,系统会在其显示详细信息的页面时便会判断景点的状态,若景点状态为可购票,则会显示购票的链接按钮。在用户点击购票按钮时,会先通过拦截器判断用户是否登录,若未登录,会跳转至登录页面,提示用户先登录,若为登录用户就会跳转至填写购票信息的页面,填写好购票信息之后,点击提交按钮,购票成功之后返回提示信息,告知用户购票成功。
门票购买流程图如下图所示。
图5-5门票购买流程图
门票购买界面如下所示。
图5-6门票购买界面
5.6管理员模块
5.6.1密码修改模块
管理员选择个人中心的修改本人密码。通过密码框输入现密码和2次新密码,如果现密码错误,则提示修改失败。如果2次新密码不一致,则提示修改失败。都没问题的话,系统提示修改成功,并返回登录界面。
密码修改界面如下所示。
图5-7密码修改界面
5.7酒店信息管理模块的实现
用户提交酒店订单后后台会自动生成酒店订单列表。从session中取出该用户信息,前台发起请求,将对应的用户信息、dingdanpId参数信息从前台传递酒店订单控制类里,匹配到create()方法,create()方法调用酒店订单逻辑层的createDingdan()方法获取数据,调用本类的getCartDingdanItem()方法得到酒店订单列表。
酒店信息管理界面如下所示。
图5-8酒店信息管理界面
5.8客房类型模块的实现
用户可以通过索引。将页面session中的用户账号userId客房类型进行查询,修改、删除界面。
客房类型界面如下图所示。
图5-9客房类型界面
酒店预订管理界面如下图所示。
图5-10酒店预订管理界面
5.9机票信息管理模块的实现
机票信息功能需要考虑高并发,防止出现机票重复购票、机票状态显示出错等情况,特对机票这一共享数据增加锁机制。在乐观锁、悲观锁以及线程锁中,综合考虑性能效率和错误的可接受性选择了乐观锁机制。乐观锁的实现方式是使用版本标识来确定读到的数据与提交时的数据是否一致,提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。在数据库机票信息表,设计中增加了version字段,每次数据提交时(更改景点状态)会判断version是否匹配,若不匹配停止本次提交,若匹配则提交成功并增加version的值。
机票信息功能整体流程:用户浏览机票信息时,同时会显示机票的航班状态,系统会在其显示详细信息的页面时便会判断机票的状态,若机票状态为可购票,则会显示购票的链接按钮。在用户点击购票按钮时,会先通过拦截器判断用户是否登录,若未登录,会跳转至登录页面,提示用户先登录,若为登录用户就会跳转至填写购票信息的页面,填写好购票信息之后,点击提交按钮,购票成功之后返回提示信息,告知用户购票成功。
机票信息流程图如下图所示。
图5-11机票信息流程图
机票信息管理界面如下图所示。
图5-12机票信息管理界面
机票预订界面如下图所示。
图5-13机票预订界面
5.10旅游论坛模块的实现
旅游论坛功能整体流程:用户浏览旅游论坛信息时,同时会显示旅游的状态,系统会在其显示详细信息的页面时便会判断旅游帖子标题、用户名、状态进行查询详情、修改、删除等操作。
旅游论坛流程图如下图所示。
图5-14旅游论坛流程图
旅游论坛界面如下图所示。
图5-15旅游论坛界面
旅游资讯界面如下图所示。
图5-16旅游资讯界面
5.11线路预订管理模块的实现
此页面的关键是编写线路信息,包括线路名称,景点名称,线路费用等。单击提交按钮以完成信息的添加。如果未写入完整的线路信息,例如,如果未写入景点名称,系统将给出相应的错误提示,并且无法成功输入。数据以概念的形式以onsubmit =“return checkForm()”的形式写入以进行检查,checkForm()函数是一种用于写入数据的不同类型的校对方法,是不是为空也是经过form表单中的οnsubmit=”return checkForm()来检查。
线路预订管理流程图如下图所示。
图5-17线路预订管理流程图
线路预订界面如下图所示。
图5-18景点添加界面
第六章系统测试
6.1测试目的
对任何系统而言,测试都是必不可少的环节,测试可以发现系统存在的很多问题,所有的软件上线之前,都应该进行充足的测试之后才能保证上线后不会Bug频发,或者是功能不满足需求等问题的发生。下面分别从单元测试,功能测试和用例测试来对系统进行测试以保证系统的稳定性和可靠性。
6.2功能测试
下表是景点管理功能的测试用例,检测了旅游网站景点管理中对景点信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-1 景点管理的测试用例
功能描述 | 用于景点管理 |
测试目的 | 检测景点管理时的各种操作的运行情况 |
测试数据以及操作 | 预期结果 | 实际结果 |
点击添加景点,必填项合法输入,点击保存 | 提示添加成功 | 与预期结果一致 |
点击添加景点,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改景点,必填项修改为空,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改景点,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击删除景点,选择景点删除 | 提示删除成功 | 与预期结果一致 |
点击搜索景点,输入存在的景点名 | 查找出景点 | 与预期结果一致 |
点击搜索景点,输入不存在的景点名 | 不显示景点 | 与预期结果一致 |
下表是酒店管理功能的测试用例,检测了酒店管理中对酒店信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-2 酒店管理的测试用例
功能描述 | 用于酒店管理 |
测试目的 | 检测酒店管理时的各种操作的运行情况 |
测试数据以及操作 | 预期结果 | 实际结果 |
点击添加酒店,必填项合法输入,点击保存 | 提示添加成功 | 与预期结果一致 |
点击添加酒店,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改酒店,必填项修改为空,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击修改酒店,必填项输入不合法,点击保存 | 提示必填项不能为空 | 与预期结果一致 |
点击删除酒店,选择酒店信息删除 | 提示删除成功 | 与预期结果一致 |
点击搜索酒店,输入存在的酒店名 | 查找出美食 | 与预期结果一致 |
点击搜索酒店,输入不存在的酒店名 | 不显示美食 | 与预期结果一致 |
下表是购票管理功能的测试用例,检测了购票管理中购票单的操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。
前置条件;用户登录系统。
表6-3 购票管理的测试用例
功能描述 | 用于购票管理 |
测试目的 | 检测购票管理时各种操作的情况 |
测试数据以及操作 | 预期结果 | 实际结果 |
未选择景点,点击提交 | 提示请选择景点 | 与预期结果一致 |
未输入文字,点击提交 | 提示请输入文字 | 与预期结果一致 |
未选择时间,点击提交 | 提示请选择时间 | 与预期结果一致 |
6.3 性能测试
使用阿里云PTS(Performance Testing Service)性能测试服务对线上系统进行压力测试。线上服务器环境为:1核心CPU,1G内存,1Mbps公网带宽,Centos7.0操作系统。
压测过程中使用了2台并发机器,每台机器20个用户并发,对系统主页,登录,数据查询和数据维护等模块进行并发访问,测试结果是有40个用户并发时,数据管理相关页面的响应时间甚至达到了7s,通过查看服务器出网流量发现已经达到1381kb/s,可以看出服务器的带宽已经达到峰值,如果系统使用5Mbps的带宽,系统的响应时间和TPS将会大大增加。在整个测试的过程中,CPU的使用率占用仅8%,也提现出带宽瓶颈对系统的影响非常严重。
">