心随行动旅游系统-3期(AL031) 详细设计4-旅游详页信息 AL031030200004 详细设计4-旅游详页信息

旅游产品模块(旅游详页信息)

详细设计说明书

模块设计

(一) 旅游产品模块(旅游详页信息)

模块概述

旅游详页信息页面中显示旅游产品的详细数据,包括:

基本数据:产品主图、产品标题、产品价格、出发地、往返交通、产品编号、好评率等。

详情数据还包括三个核心数据模块:景点介绍、酒店介绍、美食介绍。

旅游详页信息主要实现以下功能

显示旅游产品的基本数据信息:包括产品主图、产品标题、产品价格、出发地、往返交通、产品编号、好评率。

显示旅游产品的详情数据信息

显示旅游产品的主图与细节图。

通过本说明书,主要完成该页面布局和样式的设计,具体实际的功能查看后续的详细说明书。

页面布局

功能简述

旅游详页信息功能实现心随行动旅游系统的产品详情页获取旅游产品的完整数据。

在产品详情页中显示旅游产品的基本数据信息:包括产品主图、产品标题、产品价格、出发地、往返交通、产品编号、好评率。

在产品详情页中显示旅游产品的详情数据。

在详情页的画廊中显示多张产品的细节图。。

在功能设计要考虑将页面整体布局和用户使用方便、合理化安排。

相关数据表

旅游系统首页显示数据信息的相关数据表:

1.旅游产品数据来源:trip表

从数据库中获取旅游数据信息,为心随行动旅游系统首页数据显示做好准备。在此不考虑数据库链接代码问题,获取旅游数据,通过调用相关的DAO组件的方法获取。

页面流程图

旅游系统页面实现流程图参照如下:

图 4.1 旅游详情页流程图

界面设计实现

按产品ID获取旅游产品数据

实现心随行动旅游系统的产品详情页获取旅游产品的完整数据,为产品详情页显示数据做好准备。

在产品详情页中的TripDetailAction中,获取首页传递的产品ID参数;根据跳转到tripDetail.jhtml页面中。

注意:如果出现非法的ID,如id=a,则要跳转到首页对应的IndexAction中相关页面。

在产品ID查询旅游产品时,调用了TripDaoImpl类中getTripById方法。产品ID的数据库中有对应的产品记录,则该函数返回Trip对象,如果产品记录不存在,则该函数返回null。

为了确保在产品详情页上显示数据,需要将查询所有的Trip存入request中,然后跳转并显示产品详情页Ttrip_detail.jsp。

Action:负责访问检索旅游产品的DAO类(TripDaoImpl),获取旅行产品数据信息的servle。

TripDaoImpl:旅游产品(Trip)表的数据访问类;该类中的getPageTripsByType函数,负责访问和读取Trip表数据。

类:TripDaoImpl

属性或方法名称

类型

说明

getPageTripByCondition( )

List<Trip>

根据设置条件返回旅游产品数据信息列表

getAllTripByCondition( )

List<Trip>

返回所有旅游产品数据信息列表

getBaseHql( )

String

筛选表单内容来拼接hql查询语句

代码参考:

public List<Trip> getPageTripByCondition(SearchForm vo) {

Session s = HibernateBase.openSession();

String hql = getBaseHql(vo);

Query q = s.createQuery(hql);

q.setFirstResult(vo.getFistResult());

q.setMaxResults(vo.getMaxResult());

return q.list();

}

@SuppressWarnings("unchecked")

@Override

public List<Trip> getAllTripByCondition(SearchForm vo) {

Session s = HibernateBase.openSession();

String hql = getBaseHql(vo);

Query q = s.createQuery(hql);

return q.list();

}

/**

* 根据筛选表单内容来拼接hql查询语句

* @param vo 筛选表单

* @return 拼接好的hql语句

*/

private String getBaseHql(SearchForm vo) {

String hql = "SELECT t FROM Trip t,Price p WHERE t=p.trip AND t.is_ok=1";

// 如果产品类型不为空,添加查询条件

if (vo.getType_id() != null) {

hql += " AND t.type.id=" + vo.getType_id();

}

// 如果出发地不为空,添加查询条件

List<Integer> startList = vo.getStart_place_id_list();

if (startList != null && !startList.isEmpty()) {

hql += " AND (t.start.id=" + startList.get(0);

for (int i = 1; i < startList.size(); i++) {

hql += " OR t.start.id=" + startList.get(i);

}

hql += ")";

}

// 如果交通工具不为空,添加查询条件

if (vo.getTraffic() != null) {

hql += " AND t.traffic LIKE '%" + vo.getTraffic() + "%'";

}

// 如果出行天数不为空,添加查询条件

if (vo.getTime() != null) {

hql += " AND t.time=" + vo.getTime();

}

// 如果景点地区不为空,添加查询条件

List<Integer> placeList = vo.getPlace_id_list();

if (placeList != null && !placeList.isEmpty()) {

hql += " AND t IN (SELECT pt.trip FROM PlaceOnTrip pt WHERE (pt.place.id=" + placeList.get(0);

for (int i = 1; i < placeList.size(); i++) {

hql += " OR pt.place.id=" + placeList.get(i);

}

hql += "))";

}

// 如果主题不为空,添加查询条件

List<Integer> themeList = vo.getTheme_id_list();

if (themeList != null && !themeList.isEmpty()) {

hql += " AND t IN (SELECT tt.trip FROM ThemeOnTrip tt WHERE (tt.theme.id=" + themeList.get(0);

for (int i = 1; i < themeList.size(); i++) {

hql += " OR tt.theme.id=" + themeList.get(i);

}

hql += "))";

}

// 如果最低价格不为空,添加查询条件

if (vo.getMin_price() != null) {

hql += " AND t IN (SELECT p.trip FROM Price p where p.price>=" + vo.getMin_price() + ")";

}

// 如果最高价格不为空,添加查询条件

if (vo.getMax_price() != null) {

hql += " AND t IN (SELECT p.trip FROM Price p where p.price<=" + vo.getMax_price() + ")";

}

// 如果搜索关键字不为空,添加查询条件

if (vo.getSearch_key() != null) {

hql += " AND (t IN (" + "SELECT tot.trip FROM ThemeOnTrip tot WHERE tot.theme IN ("

+ "SELECT th FROM Theme th WHERE th.name LIKE '%" + vo.getSearch_key() + "%'))" + "OR t IN ("

+ "SELECT pot.trip FROM PlaceOnTrip pot WHERE pot.place IN ("

+ "SELECT p FROM Place p WHERE p.name LIKE '%" + vo.getSearch_key() + "%'))" + "OR t.title LIKE '%"

+ vo.getSearch_key() + "%' " + "OR t.s_title LIKE '%" + vo.getSearch_key() + "%')";

}

// 按行程进行分组,防止出现重复数据

hql += " GROUP BY t";

// 如果好评&价格排序都为空,采用默认排序规则

if (vo.getGood_rate_sort() == null && vo.getPrice_sort() == null)

hql += " ORDER BY t.good_rate desc,p.price asc";

// 当前以价格为主排序规则进行排序

if (vo.getCur_sort_str() != null && "price".equals(vo.getCur_sort_str())) {

if (vo.getGood_rate_sort() != null)

hql += " ORDER BY p.price " + vo.getPrice_sort() + ",t.good_rate " + vo.getGood_rate_sort();

else

hql += " ORDER BY p.price " + vo.getPrice_sort() + ",t.good_rate desc";

}

// 当前以好评率为朱排序规则进行排序

if (vo.getCur_sort_str() != null && "comment".equals(vo.getCur_sort_str())) {

if (vo.getPrice_sort() != null)

hql += " ORDER BY t.good_rate " + vo.getGood_rate_sort() + ",p.price " + vo.getPrice_sort();

else

hql += " ORDER BY t.good_rate " + vo.getGood_rate_sort() + ",p.price asc";

}

return hql;

}

显示旅游产品的基本数据

在这里使用EL表达式实现页面显示旅游产品的基本数据,产品基本数据包括:产品主图、画廊、产品标题、出发地、往返交通、产品编号、好评率。需将获取的Trip对象的基本数据在页面中合理显示。

Trip实体类和City实体类的内部结构关系如图所示:

类:Trip

属性名称

类型

说明

id

int

主键

title

String

产品标题

traffic

String

交通工具

hotel

String

住宿酒店

time

Integer

旅游天数

good_rate

float

好评率

min_price

float

产品价格

main_picname

String

主图

start

City

出发地点

类:City

属性名称

类型

说明

id

int

主键

name

String

城市名称

TripDaoImpl:旅游产品(Trip)表的数据访问类;该类中的getPageTripsByType函数,负责访问和读取Trip表数据。

代码参考:

显示旅游产品的详情数据

在此实现旅游产品详情中的景区介绍、美食推荐、酒店推荐。

详情数据模块,对应的Trip实体相关属性如下:

景区介绍:Trip类中Detail类内的Place字符属性。

美食推荐:Trip类中Detail类内的Food字符属性。

酒店推荐:Trip类中Detail类内的Hotel字符属性。

当某一旅游产品内不包括相关详情数据模块,则该模块的标题和内容均不显示。

实现条件限制:

1.判断产品内是否包含详情数据模块,需要通过Core标签库的IF标签实现。

2.在获取的Trip对象总的详情数据在页面中显示要合理。

Trip实体类和Detail实体类的内部结构关系如图所示:

类:Trip

属性名称

类型

说明

id

int

主键

place

String

景区介绍

foodc

String

美食介绍

hotel

String

酒店介绍

类:Trip

属性名称

类型

说明

id

int

主键

detail

Detail

产品详情

trip_detail.jsp:负责显示旅游产品详情信息页面。

代码参考:

TripDaoImpl:旅游产品(Trip)表的数据访问类;该类中的getPageTripsByType函数,负责访问和读取Trip表数据。

类:TripDaoImpl

属性或方法名称

类型

说明

getPageTripByCondition( )

List<Trip>

根据设置条件返回旅游产品数据信息列表

getAllTripByCondition( )

List<Trip>

返回所有旅游产品数据信息列表

getBaseHql( )

String

筛选表单内容来拼接hql查询语句

代码参考:

旅游信息查询条件限制

在产品ID查询旅游产品时,调用了TripDaoImpl类中getTripById方法。产品ID的数据库中有对应的产品记录,则该函数返回Trip对象,如果产品记录不存在,则该函数返回null。

判断产品内是否包含详情数据模块,需要通过Core标签库的IF标签实现。

在获取的Trip对象总的详情数据在页面中显示要合理。

功能逻辑:

在首页或者检索页面中,点击某旅游产品,根据产品的ID进行传递给TripDetailAction,在此调用TripDaoImpl与数据库建立联系,访问Trip旅游产品数据,获取Trip数据后进入详情页trip_detail.jsp,显示旅游详情和对应的信息介绍。若是ID非法则返回首页。

设计页面如图3所示:

图4.2 页面参考图