2018-8月18日
1.效果图:
2.前台html
<!--搜索栏-->
<div class=" row " style="padding:0 2% 0 7%;">
<div class="col-md-5 col-sm-5 col-xs-5 ">
<div class="input-group index-input pre-search">
<div class="col-md-10 col-sm-10 col-xs-10 pt0">
<!-- <span class="hous">品质租房</span>-->
<input type="text" id="id_keywords" class="form-control" placeholder="请输入区域、小区名" onkeydown="if(event.keyCode==13) return searchEnter()">
<!-- <a href="map.html">
<span class="font_size">
<i class="fa fa-map-marker" aria-hidden="true"></i>
<span>地图找房</span>
</span>
</a>-->
<!--<span class="search-map"> <i class="fa fa-map-marker" aria-hidden="true"></i></span>-->
</div>
《!--多条件组合查询》
<div class=" left-height select-type-relative">
<div class="select-type-content">
<input type="hidden" name="category_id" id="category_id" value="" />
<div class="select-type">
<a id="dLabel" role="button" data-toggle="dropdown" class="btn" data-target="#"
href="javascript:;">
深圳
</a>
<i class="fa fa-angle-down arrow" aria-hidden="true"></i>
</div>
<input name="type" value="" type="hidden" id="type">
<ul class="select-type-absolute dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu">
<li data-value="0">
<a
th:classappend="${queryMap['q']}?'':'color-gold'"
href="javascript:;" class="city-cls" data-title="全部">全部</a>
</li>
<li class="dropdown-submenu" th:each="area : ${areaMap}">
<a tabindex="-1" th:classappend="${queryMap['q']==('q'+area.key)}?'color-gold':''"
th:text="${area.key}"
href="javascript:;" data-index="1" th:attr="'data-title'=${area.key}" class="city-cls">南山</a>
<ul class="dropdown-menu">
<li class="chose-item clearfix" th:each="item,itemStat : ${area.value}">
<a
th:classappend="${queryMap['p']==('p'+item)}?'color-gold':''"
href="javascript:;"
th:attr="'data-title'=${item}" th:text="${item}" data-index="3-2" data-title="华侨城二级菜单" class="area-cls">华侨城
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class=" left-height select-type-relative">
<div class="select-type-content">
<div class="select-type">
<span id="btn-jg">价 格</span>
<i class="fa fa-angle-down arrow" aria-hidden="true"></i>
</div>
<input name="type" value="" type="hidden" id="type">
<ul class="select-type-absolute" id="keyword2">
<li data-value="1-100000" class="price-cls">
<a
th:classappend="${queryMap['j']}?'':'color-gold'"
href="javascript:;">全部</a>
</li>
<li data-value="1-4999" class="price-cls">
<a
th:classappend="${queryMap['r']=='r0_5000'}?'color-gold':''"
href="javascript:;">5000以下</a>
</li>
<li data-value="5000-10000" class="price-cls">
<a
th:classappend="${queryMap['r']=='r5000_10000'}?'color-gold':''"
href="javascript:;">5000-10000元</a>
</li>
<li data-value="10000-20000" class="price-cls">
<a
th:classappend="${queryMap['r']=='r10000_20000'}?'color-gold':''"
href="javascript:;">10000-20000元</a>
</li>
<li data-value="20000-30000" class="price-cls">
<a
th:classappend="${queryMap['r']=='r20000_30000'}?'color-gold':''"
href="javascript:;">20000-30000元</a>
</li>
<li data-value="30000-100000" class="price-cls">
<a
th:classappend="${queryMap['r']=='r30000_100000'}?'color-gold':''"
href="javascript:;">30000以上</a>
</li>
</ul>
</div>
</div>
<div class=" left-height select-type-relative">
<div class="select-type-content">
<div class="select-type">
<span id="s3">居室</span>
<i class="fa fa-angle-down arrow" aria-hidden="true"></i>
</div>
<input name="type" value="" type="hidden" id="type">
<ul class="select-type-absolute" id="keyword3">
<li data-value="" class="bedroom-cls">
<a
th:classappend="${queryMap['j']}?'':'color-gold'"
href="javascript:;">全部</a>
</li>
<li data-value="1" class="bedroom-cls">
<a
th:classappend="${queryMap['j']=='j1'}?'color-gold':''"
href="javascript:;">1居</a>
</li>
<li data-value="2" class="bedroom-cls">
<a
th:classappend="${queryMap['j']=='j2'}?'color-gold':''"
href="javascript:;">2居</a>
</li>
<li data-value="3" class="bedroom-cls">
<a
th:classappend="${queryMap['j']=='j3'}?'color-gold':''"
href="javascript:;">3居</a>
</li>
<li data-value="4" class="bedroom-cls">
<a
th:classappend="${queryMap['j']=='j4'}?'color-gold':''"
href="javascript:;">4居</a>
</li>
<li data-value="5" class="bedroom-cls">
<a
th:classappend="${queryMap['j']=='j5'}?'color-gold':''"
href="javascript:;">4居以上</a>
</li>
</ul>
</div>
</div>
<div class=" left-height select-type-relative">
<div class="select-type-content">
<div class="select-type">
<span>面积</span>
<i class="fa fa-angle-down arrow" aria-hidden="true"></i>
</div>
<input name="type" value="" type="hidden" id="type">
<ul class="select-type-absolute">
<li data-value="1-1000" class="square-cls"><a
th:classappend="${queryMap['m']}?'':'color-gold'"
href="javascript:;">全部</a>
</li >
<li data-value="1-49" class="square-cls">
<a
th:classappend="${queryMap['m']=='m0_50'}?'color-gold':''"
href="javascript:;">50m²以下</a>
</li>
<li data-value="50-80" class="square-cls">
<a
th:classappend="${queryMap['m']=='m50_80'}?'color-gold':''"
href="javascript:;">50m²-80m²</a>
</li>
<li data-value="80-110" class="square-cls">
<a
th:classappend="${queryMap['m']=='m80_110'}?'color-gold':''"
href="javascript:;">80m²-110m²</a>
</li>
<li data-value="90-110" class="square-cls">
<a
th:classappend="${queryMap['m']=='m90_110'}?'color-gold':''"
href="javascript:;">90m²-110m²</a>
</li>
<li data-value="110-150" class="square-cls">
<a
th:classappend="${queryMap['m']=='m110_150'}?'color-gold':''"
href="javascript:;">110m²-150m²</a>
</li>
<li data-value="150-200" class="square-cls">
<a
th:classappend="${queryMap['m']=='m150_200'}?'color-gold':''"
href="javascript:;">150m²-200m²</a>
</li>
<li data-value="201-1000" class="square-cls">
<a
th:classappend="${queryMap['m']=='m200_1000'}?'color-gold':''"
href="javascript:;">200m²以上</a>
</li>
</ul>
</div>
</div>
<div></div>
</div>
</div>
</div>
</div>
//页面数据显示区域
<div id="myTabContent" class="tab-content">
<!--默认排序-->
<div class="tab-pane fade in active" id="home">
<ul id="roomList">
//TODO使用ajax填充数据区域
</ul>
3.前台js
var query1=null;
var query2=null;
var query3=null;
var query4=null;
var page=0;//定义全局分页参数
$(document).ready(function() {
//点击区域查询条件
$('.city-cls').click(function() {
query1 = $(this).text();
searchByCondition(query1,query2,query3,query4);
})
$('.area-cls').click(function() {
query1 = "-"+$(this).text();
searchByCondition(query1,query2,query3,query4);
})
//点击价格查询条件
$('.price-cls').click(function() {
query2 = $(this).attr('data-value');
searchByCondition(query1,query2,query3,query4);
})
//点击居室查询条件
$('.bedroom-cls').click(function() {
query3 = $(this).attr('data-value');
searchByCondition(query1,query2,query3,query4);
})
//点击面积查询条件
$('.square-cls').click(function() {
query4 = $(this).attr('data-value');
searchByCondition(query1,query2,query3,query4);
})
//页面加载初始化数据
searchByCondition(query1,query2,query3,query4);
//页面下拉框滑到底部触发该事件
$('.tab-content').scroll(function() {
var height = $('.tab-content').height();
var scrollHeight = $('.tab-content')[0].scrollHeight;
var scrollTop = $('.tab-content').scrollTop();
if (scrollTop + height >= scrollHeight) {
page++;
searchByCondition1(query1, query2, query3, query4, page)
}
})
})
})
function searchByCondition(query1,query2,query3,query4){
page = 0;
$('.tab-content').scrollTop(0);
$.ajax({
type : 'post',
url : 'search',
cache : false, // 禁用缓存
data : {
city: query1,
price : query2,
jushi : query3,
sequre:query4,
page:page
},
success : function(data) {
console.log(data);
var list=data.contents.data;
var str="";
var tal="";
tal+='<div class="fl" id="btn-tal"><b>'+data.contents.total+'</b>套</div>'
for(var i=0;i<list.length;i++){
var item = list[i];
str+='<li class="clearfix" roomid="100241047" lng="114.260571" lat="22.725271" title="东方明珠城 龙岗龙城广场站家私家电全齐2房出租">'
str+='<a class="big-alink clearfix" href=" \"/room/ \"+item.roomsn+\".html\" " target="_blank"> '+'<p class="hs-photo fl">'+'<img src="/upload/viewImg2/'+item.smallImg+' width="135" height="102" class="fl"></p>'
str+='<div class="hs-info fl">'+'<p class="hs-info-name">'+item.roomName+'</p>'+'<p>'+item.cityName+item.areaName+'</p>'
+'<p>'+item.tips+'</p>'+'<p class="hs-info-price">'+'¥'+item.rental+'元/月</p></div></a><li>'
}
$("#btn-tal").html(tal);
$("#roomList").html(str);
}
});
}
function searchByCondition1(query1, query2, query3, query4, page) {
$.ajax({
type : 'post',
url : 'search',
cache : false, // 禁用缓存
data : {
city : query1,
price : query2,
jushi : query3,
sequre : query4,
page : page
},
success : function(data) {
console.log(data);
var list = data.contents.data;
var str = "";
var tal = "";
for (var i = 0; i < list.length; i++) {
var item = list[i];
str += '<li class="clearfix" roomid="100241047" lng="114.260571" lat="22.725271" title="东方明珠城 龙岗龙城广场站家私家电全齐2房出租">'
str += '<a class="big-alink clearfix" href="/room/' + item.roomsn
+ '.html" target="_blank"> ' + '<p class="hs-photo fl">'
+ '<img src="/upload/viewImg2/' + item.smallImg
+ ' width="135" height="102" class="fl"></p>'
str += '<div class="hs-info fl">' + '<p class="hs-info-name">'
+ (item.roomName === null ? "" : item.roomName) + '</p>' + '<p>'
+ (item.cityName === null ? "" : item.cityName)
+ (item.areaName === null ? "" : item.areaName) + '</p>' + '<p>'
+ (item.tips === null ? "" : item.tips) + '</p>'
+ '<p class="hs-info-price">'
+ (item.rental === null ? "" : '¥' + item.rental + '元/月')
+ '</p></div></a><li>'
}
$("#btn-tal").append(tal);
$("#roomList").append(str);
}
});
}
//普通检索
function searchByCommon(query) {
$.ajax({
type : 'post',
url : 'searchCommon',
cache : false, // 禁用缓存
data : {
query : query,
page : 0
},
success : function(data) {
var list = data.contents.data;
var str = "";
var tal = "";
tal += '<div class="fl" id="btn-tal"><b>' + data.contents.total
+ '</b>套</div>'
for (var i = 0; i < list.length; i++) {
var item = list[i];
str += '<li class="clearfix" roomid="100241047" lng="114.260571" lat="22.725271" title="东方明珠城 龙岗龙城广场站家私家电全齐2房出租">'
str += '<a class="big-alink clearfix" href="/room/' + item.roomsn
+ '.html" target="_blank"> ' + '<p class="hs-photo fl">'
+ '<img src="/upload/viewImg2/' + item.smallImg
+ ' width="135" height="102" class="fl"></p>'
str += '<div class="hs-info fl">' + '<p class="hs-info-name">'
+ (item.roomName === null ? "" : item.roomName) + '</p>' + '<p>'
+ (item.cityName === null ? "" : item.cityName)
+ (item.areaName === null ? "" : item.areaName) + '</p>' + '<p>'
+ (item.tips === null ? "" : item.tips) + '</p>'
+ '<p class="hs-info-price">'
+ (item.rental === null ? "" : '¥' + item.rental + '元/月')
+ '</p></div></a><li>';
}
$("#btn-tal").html(tal);
$("#roomList").html(str);
}
});
}
function searchByKey(query) {
if (!query) {
window.location.href = '/map.html';
return;
}
window.location.href = '/map-k' + query + '.html';
}
//按回车就会查询
function searchEnter() {
var query = $('#id_keywords').val();
searchByCommon(query);
}
4.后台控制器代码
@PostMapping("search")
@ResponseBody
public Map<String, Object> searchUnio(Model model, String city, String price, String jushi, String sequre,
Integer page) {
TblRooms entity = new TblRooms();
SearchCondition searchCondition = new SearchCondition();
searchCondition.setPrice(price);
searchCondition.setJushi(jushi);
searchCondition.setSequre(sequre);
// 区域
if (StringUtils.isNotEmpty(city)) {
if (city.equals("全部")) {
entity.setCityName("");
} else {
if (city.contains("-")) {
String[] s = city.split("-");
entity.setAreaName(s[1]);
} else {
entity.setCityName(city);
}
}
}
// 价格
if (StringUtils.isNotEmpty(searchCondition.getPrice())) {
if (searchCondition.getPrice().contains("-")) {
String[] str = searchCondition.getPrice().split("-");
searchCondition.setPre_begin(str[0]);
searchCondition.setPre_end(str[1]);
entity.setRentalBegin(new BigDecimal(searchCondition.getPre_begin()));
entity.setRentalEnd(new BigDecimal(searchCondition.getPre_end()));
} else {
entity.setRental(new BigDecimal(searchCondition.getPrice()));
}
}
// 居室
if (StringUtils.isNotEmpty(searchCondition.getJushi())) {
entity.setBedroom(Integer.parseInt(searchCondition.getJushi()));
}
// 面积
if (StringUtils.isNotEmpty(searchCondition.getSequre())) {
if (searchCondition.getSequre().contains("-")) {
String[] str = searchCondition.getSequre().split("-");
entity.setSquareBegin(new BigDecimal(str[0]));
entity.setSquareEnd(new BigDecimal(str[1]));
} else {
entity.setSquare(new BigDecimal(searchCondition.getSequre()));
}
}
Integer limit = Consts.PAGE_SIZE;
PageRequest pageRequest = PageRequest.of(page, limit, Direction.DESC, "id");
Map<String, Object> datas;
datas = tblRoomsService.findAll(entity, pageRequest);
Map<String, Object> map = new HashMap<String, Object>();
map.put("contents", datas);
return map;
}
@PostMapping("searchCommon")
@ResponseBody
public Map<String, Object> searchCommon(String query, Integer page) {
Integer limit = Consts.PAGE_SIZE;
TblRooms entity = new TblRooms();
entity.setKeyword(query);
PageRequest pageRequest = PageRequest.of(page, limit, Direction.DESC, "id");
Map<String, Object> datas;
datas = tblRoomsService.findAll(entity, pageRequest);
Map<String, Object> map = new HashMap<String, Object>();
map.put("contents", datas);
return map;
}
5.查询条件类
public class SearchCondition {
private String area;// 区域
private String price;// 价格
private String jushi;// 居室
private String sequre;// 面积
private String pre_begin;// 开始价格
private String pre_end;// 结束价格
6.业务层代码
@Override
public Map<String, Object> findAll(TblRooms entity, Pageable pageable) {
Page<TblRooms> page = roomsRepository.findAll(whereClause(entity), pageable);
return dealQueryResult(page);
}
private Specification<TblRooms> whereClause(final TblRooms entity) {
return new Specification<TblRooms>() {
@Override
public Predicate toPredicate(Root<TblRooms> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
list.add(cb.equal(root.get("locked").as(Boolean.class), false));
if (StringUtils.isNotBlank(entity.getKeyword())) {
list.add(cb.or(cb.like(root.get("cityName").as(String.class), "%" + entity.getKeyword() + "%"),
cb.like(root.get("areaName").as(String.class), "%" + entity.getKeyword() + "%"),
cb.like(root.get("subways").as(String.class), "%" + entity.getKeyword() + "%"),
cb.like(root.get("roomName").as(String.class), "%" + entity.getKeyword() + "%")
));
}
if (StringUtils.isNotBlank(entity.getCity())) {
list.add(cb.equal(root.get("city").as(String.class), entity.getCity()));
}
if (StringUtils.isNotBlank(entity.getCityName())) {
list.add(cb.equal(root.get("cityName").as(String.class), entity.getCityName()));
}
if (StringUtils.isNotBlank(entity.getAreaName())) {
list.add(cb.equal(root.get("areaName").as(String.class), entity.getAreaName()));
}
if (StringUtils.isNotBlank(entity.getSubways())) {
list.add(cb.like(root.get("subways").as(String.class), "%" + entity.getSubways() + "%"));
}
if (StringUtils.isNotBlank(entity.getSite())) {
list.add(cb.like(root.get("site").as(String.class), "%" + entity.getSite() + "%"));
}
if (entity.getDepositBegin() != null) {
list.add(cb.greaterThanOrEqualTo(root.get("deposit").as(BigDecimal.class), entity.getDepositBegin()));
}
if (entity.getDepositEnd() != null) {
list.add(cb.lessThanOrEqualTo(root.get("deposit").as(BigDecimal.class), entity.getDepositEnd()));
}
if (entity.getSquareBegin() != null) {
list.add(cb.greaterThanOrEqualTo(root.get("square").as(BigDecimal.class), entity.getSquareBegin()));
}
if (entity.getSquareEnd() != null) {
list.add(cb.lessThanOrEqualTo(root.get("square").as(BigDecimal.class), entity.getSquareEnd()));
}
if (entity.getRentalBegin() != null) {
list.add(cb.greaterThanOrEqualTo(root.get("rental").as(BigDecimal.class), entity.getRentalBegin()));
}
if (entity.getRentalEnd() != null) {
list.add(cb.lessThanOrEqualTo(root.get("rental").as(BigDecimal.class), entity.getRentalEnd()));
}
if (StringUtils.isNotBlank(entity.getFacing())) {
list.add(cb.equal(root.get("facing").as(String.class), entity.getFacing()));
}
if (entity.getBedroom() > 0) {
if (entity.getBedroom() >= 5) {
list.add(cb.greaterThanOrEqualTo(root.get("bedroom").as(Integer.class), entity.getBedroom()));
// list.add(cb.ge(root.get("bedroom").as(Integer.class),
// entity.getBedroom()));
} else {
list.add(cb.equal(root.get("bedroom").as(Integer.class), entity.getBedroom()));
}
}
if (StringUtils.isNotBlank(entity.getGroupName())) {
list.add(cb.equal(root.get("groupName").as(String.class), entity.getGroupName()));
}
if (StringUtils.isNotBlank(entity.getRoomType())) {
list.add(cb.equal(root.get("roomType").as(String.class), entity.getRoomType()));
}
if (StringUtils.isNotBlank(entity.getGroupName())) {
list.add(cb.equal(root.get("groupName").as(String.class), entity.getGroupName()));
}
if (entity.getStatus() != null) {
list.add(cb.equal(root.get("status").as(Byte.class), entity.getStatus()));
}
if (!entity.getStatusList().isEmpty()) {
list.add(root.get("status").as(Byte.class).in(entity.getStatusList()));
}
if (StringUtils.isNotBlank(entity.getFurnid())) {
String[] furnIds = StringUtils.split(entity.getFurnid(), ",");
List<Predicate> pres = new ArrayList<>();
for (String furnId : furnIds) {
pres.add(cb.like(root.get("furnid").as(String.class), "%" + furnId + "%"));
}
list.add(cb.and(pres.toArray(new Predicate[] {})));
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
}
};
}
private Map<String, Object> dealQueryResult(Page<TblRooms> page) {
List<TblRooms> list = new ArrayList<>();
for (TblRooms entity : page.getContent()) {
list.add(entity);
}
return UtilPublic.toModelMap(list, page.getTotalElements(), page.getTotalPages());
}