尚好房是一个二手房管理服务平台,开放优质资源和线上能力,聚合线上线下二手房产资源,打造一个全方位二手房服务生态市场,为消费者提供优质房产服务资源。

页面类似于安居客。后来做了“尚医通”和“谷粒商城”之后发现“尚好房”业务真的好简单

不过,该说不说,这个地图找房的功能真不错,视觉冲击比较大

根据演示了解项目业务

尚好房后台管理系统:权限管理系统

尚好房前端:找房网


抽取BaseController

BaseController,里面真的很简单,但是考虑到以后每一个Controller都要用到封装的那俩行代码,

在新增,修改添加成功会用得到。是用来给消费者的Controller继承的。

public class BaseController {private final static String PAGE_SUCCESS = "common/successPage";public String successPage(Model model, String successMessage){model.addAttribute("messagePage",successMessage);return PAGE_SUCCESS;}
}

抽取后的效果

顺便说一句。

之后从尚医通项目开始用了mybatisplus框架,这些BaseMapper和BaseService、BaseServiceImpl框架就帮我们抽取好了

下面就简单的说一下,抽取出来的公共模块的内容

BaseService是用来给中间商“service-api”来继承的,

它里面的内容是下面这样子的,继承了它就相当于Service里写了五个通用的增删改查方法

public interface BaseService<T> {void insert(T t);T getById(Long id);/*** 逻辑删除* @param id*/void delete(Long id);/*** 修改信息* @param t*/void update(T t);/*** 分页查询信息* @param filters* @return*/PageInfo<T> findPage(Map<String, Object> filters);
}

BaseServiceImpl和BaseMapper就是让服务的提供者去使用继承的。一个写具体的业务逻辑,一个写对数据库的操作。

这里BaseServiceImpl是一个抽象类,它里面有一个抽象方法getEntityMapper(),这个方法就是为了让继承它的子类去重写它,把正真的mapper接口送给他,他好帮你去调用方法呐

public abstract class BaseServiceImpl<T> {/*** 该抽象方法用来获取真实的mapper接口* @return*/protected abstract BaseMapper<T> getEntityMapper();public void insert(T t) {getEntityMapper().insert(t);}@Transactional(propagation = Propagation.SUPPORTS)public T getById(Long id) {return getEntityMapper().getById(id);}public void delete(Long id) {getEntityMapper().delete(id);}public void update(T t) {getEntityMapper().update(t);}@Transactional(propagation = Propagation.SUPPORTS)public PageInfo<T> findPage(Map<String, Object> filters) {//将pageSize和pageNum强转成int类型//第二个参数表示如果强转失败给默认值int pageNum = CastUtil.castInt(filters.get("pageNum"),1);int pageSize = CastUtil.castInt(filters.get("pageSize"),10);//开启分页PageHelper.startPage(pageNum,pageSize);//调用持久层的方法查询数据集//封装返回结果,老师这里没有传第二个参数return new PageInfo<>(getEntityMapper().findPage(filters),10);}
}

最后就是这BaseMapper了,我们创建的每一个mapper接口都要去继承这个接口,这样我们的mapper接口就可以省略掉这五个最常用的方法不写了

public interface BaseMapper<T> {/*** 保存一个实体* @param t*/void insert(T t);/*** 通过一个标识ID 获取一个唯一实体* @param id* @return*/T getById(Long id);/***修改* @param t*/void update(T t);/*** 删除* @param id*/void delete(Long id);/*** 分页查询* @param filters* @return*/Page<T> findPage(Map<String, Object> filters);
}

字典表 hse_dict

这个字典表本身就设计的巧妙

这个页面的视觉效果也很nice:这种树形的目录看着很高级,实际上后端返给前端的也只是一个json数组。

java后端代码:

后端逻辑就很简单,根据父节点的id去查询所有的子节点,把查出来的数据用Stream流做整理。

2021/11/12 北京 stream流,内部类,lambda表达式_£小羽毛的博客-CSDN博客

    public List<Map<String, Object>> findZnodes(Long id) {//1. 调用持久层方法,根据父节点id查询List<Dict>List<Dict> dictList = dictMapper.findListByParentId(id);//使用Stream流List<Map<String, Object>> znodes = dictList.stream().map(dict -> {Map<String, Object> znode = new HashMap<>();//往znode中存放idznode.put("id", dict.getId());//往znode中存放nameznode.put("name", dict.getName());//往znode中存放isParentznode.put("isParent", dictMapper.countIsParent(dict.getId()) > 0);return znode;}).collect(Collectors.toList());return znodes;}

在SQlyog中执行如下sql:

-- 根据父节点的id去查询所有的子节点
SELECT * FROM hse_dict WHERE parent_id =1


点击全部分类

观察network,发送了这样一个请求,那不就是咱上面分析的那种情况嘛

http://139.198.152.148:8001/dict/findZnodes?id=1

返给前端的json数据:实际上返回的还是json数组。

{"code": 200,"data": [{"isParent": true,"name": "户型","id": 10000},{"isParent": true,"name": "楼层","id": 20000},{"isParent": true,"name": "建筑结构","id": 30000},{"isParent": true,"name": "装修情况","id": 40000},{"isParent": true,"name": "朝向","id": 50000},{"isParent": true,"name": "房屋用途","id": 60000},{"isParent": true,"name": "省","id": 100000}],"message": "成功","ok": true
}

我们再点击户型,此时再发送请求去查询

http://139.198.152.148:8001/dict/findZnodes?id=10000

返给前端的json数组如下:

{"code": 200,"data": [{"isParent": false,"name": "一室","id": 10001},{"isParent": false,"name": "两室","id": 10002},{"isParent": false,"name": "三室","id": 10003},{"isParent": false,"name": "四室","id": 10004},{"isParent": false,"name": "四室以上","id": 10005}],"message": "成功","ok": true
}

枚举的2种用法

用法1:房源的发布状态HouseStatus

public enum HouseStatus {//未发布表示用户看不到,但是后台管理系统可以看得到PUBLISHED(1,"已发布"), UNPUBLISHED(0,"未发布");public int code;public String message;HouseStatus(int code, String message) {this.code = code;this.message = message;}
}

在添加房源信息的时候使用:

    @PostMapping("/save")public String save(House house,Model model){//未发布house.setStatus(HouseStatus.UNPUBLISHED.code);houseService.insert(house);return successPage(model,"添加房源信息成功");}

枚举用法2:定义为私有变量

public enum DictCode {HOUSETYPE("houseType"),FLOOR("floor"),BUILDSTRUCTURE("buildStructure"),DECORATION("decoration"),DIRECTION("direction"),HOUSEUSE("houseUse");private String message;DictCode(String message) {this.message = message;}public String getMessage() {return message;}
}

使用:

//3. 查询各种初始化列表:户型列表、楼层列表、装修情况列表....
List<Dict> houseTypeList =
dictService.findDictListByParentDictCode(DictCode.HOUSETYPE.getMessage());

getListingDateString() House类

在show.html中

<dt>挂牌时间:</dt><dd th:text="${house.listingDateString}"></dd>
<dt>上次交易:</dt><dd th:text="${house.lastTradeDateString}"></dd>

可实际上House这个类中并没有这俩属性,只有如下俩个Date属性,那么是怎么把数据展示到页面中的呢

  • 挂牌日期 private Date listingDate;
  • 上次交易日期 private Date lastTradeDate;

一个重要知识点,在thymeleaf语法中,在请求域中是用get方法拿到值的。所以实际上是House这个类多了俩个方法。妙啊,美琪妙妙屋

 /*** 以字符串类型获取挂牌日期* @return*/public String getListingDateString() {Date date = this.getListingDate();if(null == date) {return "";}DateFormat df = new SimpleDateFormat("yyyy-MM-dd");String dateString = df.format(date);return dateString;}/*** 以字符串方式获取上次交易日期* @return*/public String getLastTradeDateString() {Date date = this.getLastTradeDate();if(null == date) {return "";}DateFormat df = new SimpleDateFormat("yyyy-MM-dd");String dateString = df.format(date);return dateString;}

22-07-04 西安 尚好房(01)项目经验总结相关推荐

  1. 尚好房 07_前端房源展示

    尚好房:前端房源展示 一.分页显示房源列表 1.效果 2.项目搭建 2.1 创建项目 在web项目中创建子工程web-front 2.2 pom.xml <?xml version=" ...

  2. Java分布式二手房项目尚好房第五课 图片上传及前端房源展示

    尚好房:图片上传 一.图片存储方案 1.介绍 在实际开发中,我们会有很多处理不同功能的服务器.例如: 应用服务器:负责部署我们的应用 数据库服务器:运行我们的数据库 文件服务器:负责存储用户上传文件的 ...

  3. 中彩双色球彩票软件 红球预测专家 v8.03 build 2007.07.04 bt

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  4. Java分布式二手房项目尚好房第一课 搭建环境

    Java分布式二手房项目尚好房2.0:搭建环境 一.项目介绍 1.介绍 尚好房是一个二手房管理服务平台,开放优质资源和线上能力,聚合线上线下二手房产资源,打造一个全方位二手房服务生态市场,为消费者提供 ...

  5. Java分布式二手房项目尚好房第四课 二手房和房源管理

    尚好房:二手房管理 一.功能介绍 1.数据字典 2.小区管理 3.房源管理 二.数据字典 1.搭建service-house模块 搭建方式与service-acl一致,这里可直接复制service-a ...

  6. 尚好房 01_搭建环境

    尚好房:搭建环境 一.项目介绍 1.介绍 尚好房是一个二手房管理服务平台,开放优质资源和线上能力,聚合线上线下二手房产资源,打造一个全方位二手房服务生态市场,为消费者提供优质房产服务资源. 2.核心技 ...

  7. 尚好房 02_用户角色管理

    尚好房:用户角色管理 一.功能介绍 1.角色管理 2.用户管理 二.后台前端框架 1.后台框架选择 后台前端框架模板:Hplus 下载地址:https://gitee.com/hplus_admin/ ...

  8. 树莓派3B安装openwrt19.07.04

    树莓派3B安装openwrt19.07.04 1.目的 2.下载 3.驱动安装 1.目的 为了实现家用wifi的扩展,打算利用闲置的树莓派3b进行配置.板载wifi用于扩展ap,外接usb无线网卡用于 ...

  9. 尚好房 04_服务拆分

    尚好房:服务拆分 一.业务介绍 1.项目模块划分 根据前面的介绍,目前我们的系统规划了3个dubbo服务提供者模块:权限服务.房源服务与会员服务,及2个服务消费者模块:尚好房管理平台(web-admi ...

最新文章

  1. OpenCV 错误:无法打开摄像头(打开摄像头卡机)
  2. Linux下出现Read-only file system的解决办法
  3. STM32 基础系列教程 44 - FSMC_LCD
  4. python中的字典推导式_python 字典推导式(经典代码)(22)
  5. idea(二)初次安装强烈建议修改的配置
  6. myeclipse中如何修改Servlet模板
  7. 一个列中多行求和_excel表格制作,Excel表格的基本操作,包含制作一个表格10方面的知识(1)...
  8. 1个工具,4个技巧,就能高效开发各种报表!
  9. 织梦蓝色简洁大气电脑操作系统软件下载网站模板 带手机版
  10. 深度强化学习-Actor-Critic算法原理和实现
  11. linux rhel5.6 使用163yum源
  12. 在 OpenShift 4 上部署 Ansible Tower 环境
  13. python 列表和字段的相关函数
  14. 人物关系图谱:ECharts 实现
  15. Man vs. AI – Six Fields Where Artificial Intelligence Are Surpassing Human Intelligence
  16. 【转】多态与 new [C#]
  17. apple script to 1s screen capture snapshot w/ windowsill
  18. 如何用AutoRunner录制IE脚本录制
  19. 2008年IT行业10大热门职业调查结果出炉
  20. HUST Trainning 2015-06-14

热门文章

  1. qt show widget_Qt Widget不显示
  2. python中gt是什么意思_python代码里出现gt;gt;gt;是啥意思
  3. will not be managed by Spring
  4. HTML JS小游戏 制作飞机大战
  5. 中国高科技、高成长50强
  6. oracle费用类物料采购,ebs费用化物料设置
  7. 智能家居与AI测试之:语音通讯
  8. 【云原生】4.2 DevOps 精讲篇
  9. Bootstrap导航条鼠标悬停下拉菜单
  10. PWM控制的基本原理及相关概念