文章目录
近期报名参加了一个酒旅类型的实战项目,其中包括的功能与市面上酒店预订的软件功能相差无几。在这期间也学习到了不少东西,所以在这记录总结一下。
一.项目介绍
本项目参考了携程、同程等热门软件,通过团队协作的开发模式,采用前后端分离的设计思路,将开发周期控制在一月左右,实现了基本的功能模块,例如界面首页酒店模糊查询、根据经纬度定位附近酒店、首页跳转后酒店列表的展示、酒店详情的介绍、酒店相关图片的展示、优惠券、折扣价、个人评论等。
二.架构及技术介绍
2.1 架构图
如下图所示是系统的整体架构,从前端页面请求,到后端持久层数据库;通过采用微服务部署的思路,以及结合日志收集,运维报警等模块,使得项目整体更加完善。
2.2 后端技术

2.3 前端技术

2.4 开发工具

2.5 开发环境

三.角色与职责
本次项目采用分队模式,分别是架构组,助手组,后端开发组,前端开发组。后端开发组又分为四个小队,采用技术队长+管理队长分工合作的方式,而我是其中一个开发小队的技术队长。日常工作就是替队员们提供编码思路,解决在项目中遇到的疑惑及难题,以及阶段性的项目汇报,传达指导老师的任务安排,了解队员们的工作进展。
四.流程介绍
项目采用以周为迭代周期的开发方式,通过每周完成一个小任务,最终使得整个项目得以完成,由于一开始只考虑了后端模块的实现,前端小程序的开发是中途添加的想法,所以项目实际完成是在五一期间,比计划时间延迟了一周左右。

4.1 数据库设计
我们团队主要设计界面首页的搜索模块,所以负责管理价格、星级、地点等枚举设计,从最开始的分表设计多个枚举,到后期采用单表设计,将多种类型枚举整合在了一起。

4.2 接口设计
主要设计了三大接口,前端关键词搜索接口;获取所有枚举列表接口;后端对枚举接口进行增加、删除、修改、查询。链接如下
4.3 代码实现
下面介绍两个接口的简单使用:获取全部枚举、es关键词搜索。
- 获取全部枚举
@ApiOperation(value = "获取全部枚举")
@GetMapping(value = "/enum-list")
public CommonResult<List<EnumType>> allEnum() {
List<EnumType> enumTypeList = enumService.getDictItem();
return CommonResult.success(enumTypeList);
}
@Override
public List<EnumType> getDictItem() {
List<EnumType> allEnm = this.list();
List<EnumType> parentList = allEnm.stream().filter(v -> v.getParentId().equals(0L)).collect(Collectors.toList());
parentList.forEach(parentEnum -> {
List<EnumType> children = allEnm.stream().filter(v -> v.getParentId().equals(parentEnum.getId())).collect(Collectors.toList());
parentEnum.setChildren(children);
});
return parentList;
}
- es关键词搜索
@ApiOperation(value = "综合搜索、筛选、排序")
@PostMapping(value = "/list")
public CommonResult<CommonPage<EsHotel>> search(HotelDTO hotelDTO) {
Page<EsHotel> esHotelPage = esHotelService.search(hotelDTO);
CommonPage<EsHotel> hotelCommonPage = CommonPage.restPage(esHotelPage);
return CommonResult.success(hotelCommonPage);
}
@Override
public Page<EsHotel> search(HotelDTO hotelDTO) {
//创建分页
Pageable pageable = PageRequest.of(hotelDTO.getPageNum(), hotelDTO.getPageSize());
//创建查询条件
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//分页
nativeSearchQueryBuilder.withPageable(pageable);
//过滤
filter(hotelDTO, nativeSearchQueryBuilder);
//搜索
searchKeyword(hotelDTO, nativeSearchQueryBuilder);
//排序
sort(hotelDTO, nativeSearchQueryBuilder);
NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
//打印查询DSL语句
log.info("DSL:{}", searchQuery.getQuery());
SearchHits<EsHotel> searchHits = elasticsearchRestTemplate.search(searchQuery, EsHotel.class);
//查询无结果返回空集合
if (searchHits.getTotalHits() <= 0) {
return new PageImpl<>(new ArrayList<>(), pageable, 0);
}
//转换成酒店集合
List<EsHotel> searchProductList = searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
return new PageImpl<>(searchProductList, pageable, searchHits.getTotalHits());
}
五. 总结体会
- 管理层面
在本次项目中,通过团队合作的协同开发方式,明白了团队合作的重要性及高效性,同时也了解到队长和队员以朋友的相处模式相处会使得团队氛围更加融洽,此外,还注意到一个人达到80分远不及一群人达到80分效率要高,所以当自己的任务达到了合格要求的时候要多去帮助和关心其他暂有困难的同学。- 开发层面
由于本人是大四在读兼校外实习,对一个项目的实际开发流程有着较为清晰的认知,从最开始的数据库设计到最后的前端联调再到运维部署上线,在每个时间节点到来之前,基本都能完成相应的开发工作。最有收获的就是加深了对es的了解和使用,美中不足的就是缺乏对其深入了解以及本项目其他技术的使用涉猎较少。
在往后的空余时间,再把项目从头到尾梳理一遍流程,对每个技术再加以了解,没准会使自己更进一层楼。
版权声明:本文为qq_43820523原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。