基于SSM实现旅游网站项目
1.项目简介
1.1 课题概述
本项目是基于Java语言的SSM框架作为后台进行设计,页面采用JSP,前端使用的是JS、CSS、JQUEY、BootStrap来实现并设计页面;数据库采用目前比较流行的MYSQL数据库进行信息存储,应用服务器采用Tomcat8.0。
1.2 开发背景
随着经济的不断发展,大学生旅行出游的人数正在不断的扩大,大学生对个性定制出游的需求也越来越强烈。研究发现,大学生已经慢慢成为旅游群体主流,随着高校不断扩招,其市场的潜力巨大。而针对大学生毕业旅游的需求往往被忽视,所以存在巨大潜在市场。本系统的总目标是:能够利用基于互联网的技术,结合WEB技术来开发出学生旅游管理系统,可以根据不同的游玩类型,个人预算价格,不同的地域,提供个性化学生旅行。
1.3 系统开发工具
-
开发工具 :IDEA(服务端)、Hbuilder(前端)
-
数据库管理工具 :Navicat
-
服务器 :Tomcat
-
开发环境 :jdk1.8
2.需求分析
2.1 系统概述
本系统主要服务于大学生毕业旅游出行,因而系统的主要功能都是围绕于此来进行设计。系统主要有2个角色,分别是普通用户和管理员。普通用户可以进行登录注册,查看或修改个人信息,检索和浏览旅游产品信息,产品下单,订单详情查看、定制出行、咨询客服等操作,而网页端管理员可以进行用户管理,产品和产品-销售的增删查改,主题管理,订单管理、数据统计等操作。
2.2 功能需求分析
学生毕业旅游管理系统共有 2 类角色,分别是普通用户和管理员。
普通用户的用例图
普通用户功能
-
登陆 :用户通过输入用户名和密码进行登陆
-
注册 :用户需要输入相关信息和验证邮箱验证码后方可注册成功为系统用户
-
个人信息管理 :在用户进行登陆后可进行查看个人信息和修改个人信息
-
产品浏览 :用户可查看旅游产品的详情信息比如出发日期、当天价格、景点介绍、行程安排等等
-
产品检索 :用户可通过主题分类、出发地、目的地、旅游天数、标题查询等检索条件查询合适的产品
-
在线预定 :用户登录后进入具体产品订购页面选取相应日期和数量后进行支付订购
-
个性定制 :用户根据特定需求进行填写定制表单,如填写目的地、预算、旅游天数等等
-
查看订单 :用户在登陆后可对产品进行订购,订购后可查看订单信息
-
查看定制 :用户在登陆后可以根据自己的需求信息填写个性定制表单,填写完成后可查看填写的信息详情
-
在线咨询 :用户在登陆后可以根据自己的需求信息填写个性定制表单,填写完成后可查看填写的信息详情
管理员的用例图
-
用户管理 :用户管理包括查看用户列表、通过用户名或邮件或手机号码模糊查找、查看\修改用户详情信息、删除用户
-
产品管理 :产品管理包括产品列表查看、产品搜索、产品添加、修改
-
产品-销售管理 :因为旅游产品的特殊性,一个产品在不同日期的价格和库存呢都不一样,所以新增产品-销售管理(即1-n)同样也是记录的增删改查
-
主题管理 :主题管理即分类管理,一个产品可以有多个主题,主题管理包括新增主题、主题修改、主题列表、主题删除等
-
定制管理 :定制管理为对用户定制信息进行管理,包括定制列表、查看定制信息、设置定制信息为已读
-
订单管理 :订单管理包括查看订单列表、搜索订单、查看订单详情信息
2.3 对性能的规定
- 时间特性要求
- 用户请求返回页面或提示响应时间在3秒以内
- 后台批量新增产品处理时间5秒内
-
用户注册时邮箱验证码发送时间30秒内
-
灵活性要求
- 运行环境:可以在谷歌、火狐、IE9以上的浏览器下兼容运行,运行环境较广
-
功能改进:当日后需要更新或者增加功能时,不会影响到以前功能
-
稳定性要求
- 能承载200个用户同时在线
- 支持系统数据备份
3.系统设计
3.1 系统总体设计
3.1.1系统框架图
系统整体框架图
3.1.2 系统整体功能图
毕业旅行管理系统按角色主要分为两大模块。
系统总体设计图
3.2 数据库设计
3.2.1 概念模型设计
用户信息的E-R图
主题信息的E-R图
产品信息的E-R图
产品-销售信息的E-R图
产品-描述信息的ER图
订单信息的E-R图
整体E-R图
3.2.2 数据字段
用户信息表为 user ,主要用来存储用户的信息。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | id | varchar(100) | 是 | 否 | |
2 | username | varchar(50) | 否 | ||
3 | password | varchar(100) | 否 | ||
4 | varchar(50) | 是 | |||
5 | phone | varchar(50) | 是 | ||
6 | sex | char(2) | 是 | ||
7 | role | 0超级管理员,1管理员,10普通用户 | int(10) | 是 | |
8 | create_time | datetime(0) | 是 | ||
9 | update_time | datetime(0) | 是 |
email_validate为邮箱验证表 ,主要用来验证邮箱验证码。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | id | varchar(50) | 是 | 否 | |
2 | varchar(50) | 是 | |||
3 | validate_code | varchar(20) | 是 | ||
4 | create_time | datetime(0) | 是 |
customization为定制表 ,主要用来储存定制信息。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | id | varchar(50) | 是 | 否 | |
2 | uid | 用户Id | varchar(50) | 是 | |
3 | start_areaName | varchar(50) | 是 | ||
4 | end_areaName | varchar(50) | 是 | ||
5 | start_date | date(0) | 是 | ||
6 | days | 旅游天数 | varchar(4) | 是 | |
7 | number | 出发人数 | int(10) | 是 | |
8 | percapita_consumption | 人均消费 | varchar(255) | 是 | |
9 | person_name | 联系人 | varchar(10) | 是 | |
10 | phone | varchar(50) | 是 | ||
11 | remarks | 备注 | varchar(255) | 是 | |
12 | status | 0未读,1已读 | int(10) | 是 |
product_order为订单表 ,主要用来储存订单信息。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | id | 订单id | varchar(50) | 是 | 否 |
2 | order_no | 订单号 | bigint(19) | 是 | |
3 | user_id | 用户id | varchar(50) | 是 | |
4 | product_id | 产品id | varchar(50) | 是 | |
5 | productsell_id | 产品销售id | varchar(50) | 是 | |
6 | username | 联系人 | varchar(50) | 是 | |
7 | phone | 联系号码 | varchar(50) | 是 | |
8 | remarks | 备注 | varchar(255) | 是 | |
9 | pruduct_num | 产品数量 | int(10) | 是 | |
10 | payment | 实际付款金额,单位是元,保留两位小数 | decimal(20) | 是 | |
11 | payment_type | 支付类型,1-在线支付 | int(10) | 是 | |
12 | status | 订单状态:0-已取消-10-未付款,20-已付款 | int(10) | 是 | |
13 | payment_time | 支付时间 | datetime(0) | 是 | |
14 | end_time | 交易完成时间 | datetime(0) | 是 | |
15 | close_time | 交易关闭时间 | datetime(0) | 是 | |
16 | create_time | 创建时间 | datetime(0) | 是 | |
17 | update_time | 更新时间 | datetime(0) | 是 |
product为产品表 ,主要用来储存产品相关信息。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | pid | varchar(50) | 是 | 否 | |
2 | title | varchar(100) | 是 | ||
3 | price | double(10) | 是 | ||
4 | main_image | 产品主图,url相对地址 | varchar(255) | 是 | |
5 | sub_images | 图片地址,json格式,扩展用 | varchar(255) | 是 | |
6 | sell | 销量 | int(10) | 是 | |
7 | status | 商品状态,1-正常,2-下架,3-删除 | tinyint(3) | 是 | |
8 | active_num | 活动人数 | int(10) | 是 | |
9 | active_days | 活动天数 | int(10) | 是 | |
10 | start_areaId | 出发地地址id | int(10) | 是 | |
11 | end_areaId | 目的地区域id | int(10) | 是 | |
12 | start_areaName | 冗余字段 | varchar(50) | 是 | |
13 | end_areaName | 冗余字段 | varchar(50) | 是 | |
14 | create_time | datetime(0) | 是 | ||
15 | update_time | datetime(0) | 是 |
product_desc为产品描述表 ,主要用来储存旅游产品详细描述信息。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | pid | 产品id | varchar(50) | 是 | 否 |
2 | scenic_desc | 景点介绍 | text(65535) | 是 | |
3 | trip_desc | 行程安排 | text(65535) | 是 | |
4 | cost_desc | 费用说明 | text(65535) | 是 | |
5 | other_desc | 其他说明 | text(65535) | 是 |
product_sell为产品销售表 ,主要用来储存旅游产品销售信息。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | id | varchar(50) | 是 | 否 | |
2 | pid | 产品id | varchar(50) | 否 | |
3 | p_name | 产品名称 | varchar(255) | 是 | |
4 | p_price | 价格 | double(10) | 是 | |
5 | status | 销售状态,1正常,2下架 | tinyint(3) | 是 | |
6 | start_date | 出发日期 | date(0) | 否 | |
7 | active_days | 活动天数 | int(10) | 是 | |
8 | stock | 库存 | int(10) | 否 | |
9 | version | 版本 | int(10) | 是 | |
10 | create_time | datetime(0) | 是 | ||
11 | update_time | datetime(0) | 是 |
theme_product为主题产品表 ,主是主题和产品的中间表。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | id | varchar(50) | 是 | 否 | |
2 | product_id | varchar(50) | 是 | ||
3 | theme_id | varchar(50) | 是 | ||
4 | theme_name | varchar(100) | 是 |
theme为主题表 ,用例储存主题信息。
序号 | 字段名 | 字段意义 | 字段类型 | 是否主键 | 允许为空 |
---|---|---|---|---|---|
1 | id | varchar(50) | 是 | 否 | |
2 | theme_name | varchar(50) | 否 | ||
3 | image_url | varchar(100) | 是 | ||
4 | detail | varchar(255) | 是 |
4.系统实现
```java
/*
*
* 前端控制器
*
@Autowired
private IProductSellService productSellService;
/**
* 列表
* @param current
* @param size
* @return
*/
@RequestMapping("/list")
@ResponseBody
public ServerResponse list(@RequestParam(value="current",defaultValue="1") int current, @RequestParam(value="size",defaultValue="10") int size){
if (current<0||size<0){
return ServerResponse.createByErrorCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(),ResponseCode.ILLEGAL_ARGUMENT.getDesc());
}
return ServerResponse.createBySuccess(productSellService.selectPage(new Page(current,size))) ;
}
/**
* 列表
* @param current
* @param size
* @return
*/
@RequestMapping("/list/{pid}")
@ResponseBody
public ServerResponse listBypid(@PathVariable String pid,@RequestParam(value="current",defaultValue="1") int current, @RequestParam(value="size",defaultValue="10") int size){
if (current<0||size<0){
return ServerResponse.createByErrorCodeMessage(ResponseCode.ILLEGAL_ARGUMENT.getCode(),ResponseCode.ILLEGAL_ARGUMENT.getDesc());
}
EntityWrapper<ProductSell> entityWrapper=new EntityWrapper();
entityWrapper.eq("pid",pid);
entityWrapper.orderBy("start_date",true);
return ServerResponse.createBySuccess(productSellService.selectPage(new Page(current,size),entityWrapper)) ;
}
/**
* 新增
* @param productSell
* @return
*/
@RequestMapping("/save")
@ResponseBody
public ServerResponse create(ProductSell productSell){
productSell.setCreateTime(new Date());
return ServerResponse.createBySuccess(productSell.insert());
}
/**
*修改
* @param id
* @param productSell
* @return
*/
@ResponseBody
@RequestMapping("/update/{id}")
public ServerResponse update(@PathVariable String id, ProductSell productSell){
productSell.setId(id);
productSell.setUpdateTime(new Date());
return ServerResponse.createByResult(productSell.updateById());
}
/**
* 删除
* @param id
* @return
*/
@ResponseBody
@RequestMapping("/delete/{id}")
public ServerResponse delete(@PathVariable String id){
ProductSell productSell=new ProductSell();
productSell.setId(id);
return ServerResponse.createByResult(productSell.deleteById());
}
/**
* 批量删除
* @param ids
* @return
*/
@ResponseBody
@RequestMapping("/delete")
public ServerResponse delete(String[] ids){
return ServerResponse.createByResult(productSellService.deleteBatchIds(Arrays.asList(ids)));
}
/**
* 批量新增
* @param productSells
* @return
*/
@RequestMapping("/insertBatch")
@ResponseBody
public ServerResponse insertBatch(ProductSell productSells,int days){
if (days>30){
return ServerResponse.createByErrorMessage("不能连续设置超过30天的产品销售");
}
ArrayList<ProductSell> productSellArrayList=new ArrayList<>();
for (int i=1;i<=days;i++){
ProductSell productSell=new ProductSell(productSells);
Calendar c = Calendar.getInstance();
c.setTime(productSell.getStartDate());
c.add(Calendar.DAY_OF_MONTH, i);// +i天
productSell.setStartDate(c.getTime());
productSell.setCreateTime(new Date());
productSellArrayList.add(productSell);
}
return ServerResponse.createByResult(productSellService.insertBatch(productSellArrayList));
}
@RequestMapping("/addView")
public String addView(String pid, String title,Double price, Model model) throws UnsupportedEncodingException {
String param = new String(title.getBytes("ISO8859-1"), "UTF-8");//解决get乱码
model.addAttribute("pid",pid);
model.addAttribute("title",param);
model.addAttribute("price",price);
return "backend/productSell_add";
}
@RequestMapping("/listView/{pid}")
public String listView(@PathVariable String pid,Model model){
model.addAttribute("pid",pid);
return "backend/productSell_list";
}
@RequestMapping("/updateView/{id}")
public String updateView(@PathVariable String id,Model model){
model.addAttribute("productSell", productSellService.selectById(id));
return "backend/productSell_update";
}
```
5.系统测试
5.1 界面测试
记录界面测试的详情
测试目标 | 1. 兼容性 检查页面是否能够兼容多种浏览器。 2. 易用性 菜单栏文字说明是否一目了然。 系统是否有相应的帮助文档和用户使用说明。每个功能操作是否方便不繁琐。 3. 美观性 页面所使用的布局在拉伸下是否会变形字体的大小和颜色是否与页面协调。 |
---|---|
测试方法 | 1.采用不同内核的浏览器访问系统: IE 浏览器:使用 IETest 工具对 ie8、ie9、ie10 等兼容性进行测试;谷歌浏览器;火狐浏览器 2. 键盘输入,鼠标点击按钮,鼠标点击链接 3. 正常和错误的 I/O 数据验证 |
测试结论 | 毕业旅游管理系统能够较好的兼容不同内核的浏览器。易用性高,操作方便,使用体验良好。对于非法和错误的操作,有友好的提示。系统的界面简洁美观,布局合理,颜色协调。 |
5.2 功能测试
注册
首页
个性定制
项目详情
5.3 测试评估
通过对整个系统的测试,发现本系统还存在着一些小BUG。比如:后台输入框没有进行脚本过滤防止XSS攻击,地址输入框缺乏部分地区、页面也会因过度拉伸而出现样式错乱,同时也发现后台部分路径存在权限漏洞,上传图片没做大小限制等,部分表单字段没有做非空性和合理性字段校验。
但是在发现缺陷后,已经立即处理这些缺陷并使其满足质量要求。本系统在兼容性上能够较好地兼容多种内核的浏览器的,操作性友好,UI美观。同时。在功能上,系统的主要功能已经开发完成,当然仍然可以再添加一些功能,比如详后台管理不能进行批量的修改删除数据,订购没有做线上支付(微信支付或支付宝),统计数据不够完善(只做了简单数据的统计)使系统功能更加完善。在性能上系统能够满足需求,同时也考虑到了可扩展性。
结 论
本系统使用MVC架构、SSM技术、 Mysql数据库,Maven jar包管理,B/S 模式进行页面的呈现。前端页面使用 Bootstrap 、Jquery来实现页面布局设计和实现,同时使用 Jsp、ajax 与服务端进行数据的交互。
在用户权限控制上,系统采用了拦截器对用户的非法操作进行拦截。如订单页面需要用户进行登录,后台页面需要管理员进行登录,根据拦截器设定,请求页面要求必须是对应的用户才能够进入该角色所对应的操作页面。如果不是,请求将会被拦截,并且将会自动跳转到对应的页面。在用户体验上,系统UI美观,交互体验友好,功能完善。
系统的代码耦合度较低,并且设计上预留了扩展功能,因而系统健壮性、稳定性、灵活性比较强。系统开发期间,不断进行单元和集成测试,通过测试驱动开发来完善系统功能。
参考文献
- 丹东市旅游交通信息系统设计与实现(东北大学·祝贺)
- 旅游业网络营销服务平台的设计与应用(北京工业大学·星丹丹)
- 基于Web Service的旅游管理系统的设计与实现(北京邮电大学·李琳)
- 基于JAVA WEB技术旅游服务网站系统设计与实现(电子科技大学·张岚)
- 旅游管理网站系统的设计与实现(大连理工大学·秦鑫)
- 基于REST的农业旅游园区系统的设计与实现(河北农业大学·钤程程)
- 旅游服务网的设计与实现(电子科技大学·赵洋)
- 基于SSM的企业网站设计与实现(黑龙江大学·张泷元)
- 基于JAVA WEB技术旅游服务网站系统设计与实现(电子科技大学·张岚)
- 基于REST的农业旅游园区系统的设计与实现(河北农业大学·钤程程)
- 基于SSM的客户关系管理系统的设计与实现(北京交通大学·白元)
- 湖南省旅游项目管理系统的设计与实现(山东大学·林茵)
- 旅游管理系统的设计与实现(东北大学·王宇慧)
- 在线旅游管理信息系统的设计与实现(电子科技大学·任缘)
- 基于JAVA WEB技术旅游服务网站系统设计与实现(电子科技大学·张岚)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码工坊 ,原文地址:https://m.bishedaima.com/yuanma/35554.html